The robots in Gladiabots are autonomous and obey their Artificial Intelligence (AI). Bots can only execute one of the possible actions at a time. The AIs task is to determine what action to use in the current situation. Each bot checks its AI counterclockwise, searching for the first valid branch leading to an action.
The AI of a bot is shaped like an upside down tree. It can be composed of the following elements:
|Root node||Each AI contains exactly one root node that defines the starting point of the AI check. Nodes linked from the bottom of the root node are evaluated counterclockwise. The root node indicates the name of the AI.|
|Action node||If a rectangular-shaped action node is evaluated valid during AI check, the described action is executed for the current tick. An action node is considered invalid if the bot cannot perform it.|
|Condition node||If an oval-shaped condition node is evaluated valid during AI check, the nodes linked from the bottom of the condition node are evaluated counterclockwise. A condition node is considered invalid if the current situation doesn't fit it.|
|Connector node||The diamond-shaped connector node is always evaluated valid during AI check. It connects every node linked to the top of the connector node with every node linked from the bottom of the connector node. A connector node can be used to simplify the layout of the AI.|
|Sub-AI node||One can reuse an AI inside another one, by using a Sub-AI node. When evaluating this node the whole sub-AI is checked for a valid action. A sub-AI can again contain its own sub-AIs. Dividing the AI in sub-AIs also improves performance when viewing or editing the AI.|
|Link||Nodes can be connected with a link. A link is a directed connection from the bottom of one node to the top of another node.|
AI checking process
To determine the action a bot should use in the current situation, the valid nodes are traversed by a depth-first search algorithm beginning with the root node:
|Branches are not executed counterclockwise but checked counterclockwise.|
|The evaluation of nodes is instant and is not wasting any time from the current tick.|
By adding prefixes like "1 " and "2 " or "A " and "B " in front of the AI name, similar AIs can be shown grouped together for easy selection in the AI list.
Possible AI groups:
- Main AIs assigned to bots
- Test AIs
- Basic sub-AIs used by many AIs
- Specific sub-AIs used in some AIs
- Sub-AIs used in sub-AIs
- Old AIs not in use anymore
Furthermore one of the following elements could be added as prefix, suffix or infix in the AI name:
- Bot class (for example: "SN", "SG", "AS", "MG")
- Map name (for example: "7w", "syp", "mp", "...")
- Game version (for example: "9.1", "10.4")
- AI version (for example: "1.4", "3.2")
It is important to check if the AIs work like intended or if some bugs have sneaked in. To help understanding the AI there are lines drawn from each bot to the target of its current action upon execution.
By selecting an allied bot one can additionally see the state of its AI. At this point one needs to recall that an AI always uses data from the past. It uses actions from the last tick and the health and shield values as well as the range distances are evaluated at the beginning of the current tick for determining the current action. (for details see game mechanics)
To visualize everything a bot did sense when making its decision in the current tick one can create a debugging sub-AI. This will avoid confusion about delay when analyzing an AI.
A debugging sub-AI contains:
- ...not a single action node.
- ...condition nodes indicating what the bot senses. Examples:
- Health and shield of self
- Bot class, range and count of enemy bots attacking myself
- Health, shield and range of enemy bot attacked by self
- Actions performed by allied or enemy bots
- ...sub-AIs not connected to the root node
- They point to other important sub-AIs as a quick link.
A debugging sub-AI is used in the main AI by linking to it as the very first node that is evaluated from the root node.
Combining condition nodes
It is possible to create logic terms like
A and B or
A or B by combining several condition nodes. In the following examples
Is a Sniper attacking me is used as
Condition A and
Is a Machine gun attacking me is used as
|Arrangement||Logic term||Negated arrangement||Negated logic term|
|A and B
Is a Sniper and a Machine gun attacking me?
|not (A and B)
The opposite of the arrangement "Is a Sniper and a Machine gun attacking me?" is: Is there no Sniper attacking me or is there no Machine gun attacking me.
|A or B
Is a Sniper or a Machine gun attacking me?
|not (A or B)
The opposite of the arrangement "Is a Sniper or a Machine gun attacking me?" is: Is there no Sniper attacking me and is there no Machine gun attacking me.
|A xor B
Is either a Sniper or a Machine gun but not both of them attacking me?
|not (A xor B)
The opposite of the arrangement "Is either a Sniper or a Machine gun but not both of them attacking me?" is: Is there a Sniper attacking me and is there a Machine gun attacking me or is there no Sniper attacking me and is there no Machine gun attacking me.
|Description||Sniper||Machine gun||A and B||not (A and B)||A or B||not (A or B)||A xor B||not (A xor B)|
|There is a Sniper and a Machine gun.||✔||✔||✔||✖||✔||✖||✖||✔|
|There is a Sniper but no Machine gun.||✔||✖||✖||✔||✔||✖||✔||✖|
|There is a Machine gun but no Sniper.||✖||✔||✖||✔||✔||✖||✔||✖|
|There is no Sniper nor a Machine gun.||✖||✖||✖||✔||✖||✔||✖||✔|