New set of classes are being created in this: ticket:263.
The basic features of new AI are:
- Fighting: AI tries to dodge bullets
- Flying: AI flies in divisions of 4 spaceships
- Actionpoints: Just like waypoints, actionpoints can be set in XML file.
When alone, every AI class does the same. To make AI fight smart, different AI Controllers are to be assigned to several spaceships:
Hierarchy looks in a following way: CommonController? → FlyingController? → FightingController? → ActionpointController?, ActionpointController? → DivisionController?, SectionController?, WingmanController?.
- CommonController? stores all the basic functions being used
- FlyingController? handles flying functionality
- FightingController? handles fighting functionality
- ActionpointController? makes decisions if this is DivisionController?
- DivisionController? executes ActionpointController::action() each 1 second
- SectionController? follows DivisionController? and, when fighting, tries to find itself a good enemy to shoot at
- WingmanController? follows its leader (either DivisionController? or SectionController?) and, when fighting, attacks the same target.
When fighting, DivisionController? fights in pair with its WingmanController? and SectionController? in pair with its Wingman. Those two sections of two ships try to attack different targets in order to achieve maximum damage output.
Wingan and Leader try to become attacker and defender, so that enemies waste their time trying to kill one while another finishes them off.
In XML file different formation types can be set to DivisionController?: WALL, FINGER4 and DIAMOND. Although they don't have a great effect on a gameplay, one might find DIAMOND or FINGER4 to look nicer than a simple WALL.
- NONE: spaceship tries to pop the next actionpoint from the stack
- FIGHTALL: spaceship fights all the enemies on the map (if DivisionController?, its division fights together with it) until all the enemies are dead.
- ATTACK: attacks a specific target until target is dead.
- PROTECT: follows a specific target until no protection required (when that spaceship dies).
- FLY: flies to a specific point. Whenever enemy is close, AI attacks it, then returns back to current action.
More than one Actionpoint can be attached to a controller, resulting in a slightly complex behaviour, for example, following code would result in a spaceship firstly flying towards (0,0,0), then attacking a spaceship with a name "attack", then trying to protect a human player, if none is spawned or human dies, it protects a spaceship with a name "protect", then it fights all enemies on the map:
<SpaceShip position="-2000, 1500, -1000" lookat="0,0,0" team=0 name="ss2"> <templates> <Template link=spaceshipassff /> </templates> <controller> <DivisionController team=0 formationMode="finger4"> <actionpoints> <Actionpoint position="0,0,0" action="FLY" /> <Actionpoint position="0,0,0" action="ATTACK" attack="attack" /> <Actionpoint position="0,0,0" action="PROTECt" protectMe=true /> <Actionpoint position="0,0,0" action="PROTECt" protect="protect" /> <Actionpoint position="0,0,0" action="FIGHTALL" /> </actionpoints> </DivisionController> </controller> </SpaceShip>
Because there is a fixed number of spaceships in a division, it is possible to spread out CPU-heavy tasks. As of today, division has a total tact period of 2 seconds, 0.25 sec of which is assigned to each ship of the division. During those 0.25 sec the most heavy methods are being executed. Also, independently of the 2 seconds-long tact, each 0.25 seconds fighting logic is being called, which results in a smooth, and yet fast decision making.