Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.Sign up
Defining custom AI
AI Does What AI Can
It might happen that you create a custom unit and find out that the Skirmish AI is not using the unit. This is because AI cannot use what it cannot see. I am myself very new to understanding the working of AI, so I will only explain the basics. Once the developers see this post, they can make corrections where necessary.
Making your AI
Go to your "Rules" folder and open ai.yaml
Every AI that you use in the game is defined here. So copy the first AI code, which will be this:
HackyAI@RushAI: Name: Rush AI BuildingCommonNames: ConstructionYard: fact Refinery: proc Power: powr,apwr Barracks: barr,tent VehiclesFactory: weap Production: barr,tent,weap,afld,hpad,spen,syrd Silo: silo UnitsCommonNames: Mcv: mcv BuildingLimits: proc: 4 barr: 1 tent: 1 dome: 1 weap: 1 spen: 1 syrd: 1 hpad: 4 afld: 4 atek: 1 stek: 1 fix: 1 BuildingFractions: proc: 30% powr: 35% barr: 1% tent: 1% weap: 1% pbox: 7% gun: 7% tsla: 5% ftur: 10% agun: 5% sam: 5% atek: 1% stek: 1% fix: 0.1% dome: 10% UnitsToBuild: e1: 50% e3: 10% apc: 30% jeep: 40% arty: 15% v2rl: 40% ftrk: 50% 1tnk: 70% 2tnk: 25% 3tnk: 50% SquadSize: 20
Go at the bottom of the page and paste it right after the last AI. We want our AI to be passive, that is it relies on long range weapons. so first of all we call it Passive AI and do these changes:
HackyAI@PassiveAI: Name: Passive AI
We can ignore BuildingCommonNames: and UnitsCommonNames: and go right to BuildingLimits: This limits the number of buildings that the AI must have. Since the AI is going to be passive, we want it to accumulate lots of ore so we change the number of proc: to 6 from 4.
We also ignore BuildingFractions: and go right to UnitsToBuild. This tells the AI which units it should build. Lets change v2rl and arty to 60% as we are going for a long range user and add our own entries. Suppose you defined t72 tank as a unit, so add this line.
So now the AI will make a lot of your tanks plus a lot of long range units. Start up Skirmish, select your AI and have fun!
Support Power Targeting
You can also change how the AI decides to use its various support powers and super weapons, simply by editing the yaml. Take another look at the Rush AI, and look for the bit about Support Power decisions.
SupportPowerDecision@spyplane: OrderName: SovietSpyPlane MinimumAttractiveness: 1 Consideration@1: Against: Enemy Types: Structure Attractiveness: 1 TargetMetric: None CheckRadius: 5c0 SupportPowerDecision@paratroopers: OrderName: SovietParatroopers MinimumAttractiveness: 5 Consideration@1: Against: Enemy Types: Structure Attractiveness: 1 TargetMetric: None CheckRadius: 10c0 Consideration@2: Against: Enemy Types: Vehicle, Tank, Infantry, Defense Attractiveness: -10 TargetMetric: None CheckRadius: 10c0 SupportPowerDecision@parabombs: OrderName: UkraineParabombs MinimumAttractiveness: 1 Consideration@1: Against: Enemy Types: Structure Attractiveness: 1 TargetMetric: None CheckRadius: 5c0 SupportPowerDecision@nukepower: OrderName: NukePowerInfoOrder MinimumAttractiveness: 3000 Consideration@1: Against: Enemy Types: Structure Attractiveness: 1 TargetMetric: Value CheckRadius: 5c0 Consideration@2: Against: Ally Types: Air, Ground, Water Attractiveness: -10 TargetMetric: Value CheckRadius: 7c0
Don't worry, it is actually very easy, even if it is a lot. It is basically just explaining how a person would decide where to use its support powers and superweapons.
Let's take a look at how it decides to use its atomic bombs:
SupportPowerDecision@nukepower: OrderName: NukePowerInfoOrder MinimumAttractiveness: 3000 Consideration@1: Against: Enemy Types: Structure Attractiveness: 1 TargetMetric: Value CheckRadius: 5c0 Consideration@2: Against: Ally Types: Air, Ground, Water Attractiveness: -10 TargetMetric: Value CheckRadius: 7c0
OrderName is the name of the order it gives when firing the atomic bomb. Don't worry, you can just copy it from the wiki. Look at https://github.com/OpenRA/OpenRA/wiki/Traits#nukepower at the OrderName entry. See, simple copy and paste. You can do the same for any other power.
MinimumAttractiveness is how 'juicy' a target must be before the AI will actually fire its atomic bomb at that location. In this case, the 3000 means that the total worth of the targets must be at least $3000 in that area before the AI will fire the atomic bomb there. How does it know to use buildings? How does it know to use their $ worth? How does it know how big the atoic bomb explodes? All of this is done by the next thing, namely...
Consideration these are the ways in which the AI makes it decisions. Each time it decides "Do I want to use this power here?" it can take multiple things into consideration. In this example, it wants to find a location that has a lot of enemy buildings, but avoid targets that have ally units nearby. It does this using two considerations:
Consideration@1: Against: Enemy Types: Structure Attractiveness: 1 TargetMetric: Value CheckRadius: 5c0
This says that when it looks at a particular spot to nuke, it is looking for enemies
Against: Enemy, structures only
Types: Structure, within 5 cells
CheckRadius: 5c0, each structure's cost value
TargetMetric: Value is multiplied by 1
Attractiveness: 1. I.e. We really like shooting really expensive enemy buildings, especially where there are many buildings together.
Consideration@2: Against: Ally Types: Air, Ground, Water Attractiveness: -10 TargetMetric: Value CheckRadius: 7c0
Says that any allied
Against: Ally, air or ground or water units or buildings
Types: Air, Ground, Water, within 7 cells
CheckRadius: 7c0, have their cost value
TargetMetric: Value multiplied by -10
Attractiveness: -10. I.e. Even if there are only a few allies near a very lucrative spot, we still won't shoot there. Unless the enemy buildings are worth at least 10x times more than our ally units.
The sum of all these considerations are taken together, and the final answer must be > 3000
MinimumAttractiveness: 3000 (in this example) for the AI to shoot at an area.
So a lone war factory won't be attractive enough for the AI to shoot at.
But 2 war factories together will.
But 2 war factories with ally units nearby won't.
By adjusting these decisions we can define how the AI chooses their targets. We could even make a dumb AI that shoots itself!
You see, it isn't really hard. Simply think of how you would use a particular support power, and then tell the AI to consider it in that manner.