Difference between revisions of "AFSM (File Format)"

From Retro Modding Wiki
Jump to: navigation, search
m (The "trigger count" at the end of the header is actually a "condition count")
m ({{research}})
 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
The '''AFSM format''' controls AI behavior; it stands for '''A'''I '''F'''inite '''S'''tate '''M'''achine. AI-controlled creatures have a limited number of possible states they can be in. The AFSM file defines those states, and what triggers can cause it to advance to another state.
+
The '''AFSM format''' controls AI behavior; it stands for '''A'''I '''F'''inite '''S'''tate '''M'''achine. AI-controlled creatures have a limited number of possible states they can be in. The AFSM file defines those states, and what triggers can cause it to transition to another state.
  
{{researchminor|reason=We should have a list of possible states and trigger conditions and a short explanation of what they generally do on this page somewhere. Also, the float settings on conditions is unknown.}}
+
{{research|1|We should have a list of possible states and triggers and a short explanation of what they generally do on this page somewhere. Also, the float settings on conditions is unknown.}}
  
 
__TOC__
 
__TOC__
Line 9: Line 9:
 
=== Header ===
 
=== Header ===
  
The format first defines a list of states, then defines each trigger attached to each state. There are no state/trigger type IDs; rather, the name string itself is used as an identifier to fetch the corresponding AI function. It starts with a short header listing each state and then providing a trigger count. Note that the trigger count isn't actually used to parse the file; it's present merely because the game uses it to allocate space for each trigger ahead of time.
+
The format first defines a list of states, then defines the triggers for each transition attached to each state. There are no state/trigger type IDs; rather, the name string itself is used as an identifier to fetch the corresponding AI function. It starts with a short header listing each state and then providing a trigger count. Note that the trigger count isn't actually used to parse the file; it's present merely because the game uses it to allocate space for each trigger ahead of time.
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 26: Line 26:
 
| long
 
| long
 
| 1
 
| 1
| '''Condition count'''
+
| '''Trigger count'''
 
|}
 
|}
  
=== State Triggers ===
+
=== State Transitions ===
  
Following that, it iterates through each state, defining the triggers associated with each one. Triggers are composed of a target state index and a number of conditions; when all the conditions associated with a trigger are satisfied, it advances to the targeted state. The state trigger definitions are structured like this:
+
Following that, it iterates through each state, defining the transitions associated with each one. Transitions are composed of a target state index and a number of triggers; when all the triggers associated with a transition are satisfied, it advances to the targeted state. The state transitions are structured like this:
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 40: Line 40:
 
| long
 
| long
 
| 1
 
| 1
| '''Trigger count''' (TC)
+
| '''Transition count''' (TC)
 
|-
 
|-
| Trigger
+
| Transition
 
| TC
 
| TC
| '''Triggers'''
+
| '''Transitions'''
 
|}
 
|}
  
=== Trigger ===
+
=== Transitions ===
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 56: Line 56:
 
| long
 
| long
 
| 1
 
| 1
| '''Condition count''' (CC)
+
| '''Trigger count''' (TC)
 
|-
 
|-
| Trigger condition
+
| Trigger
| CC
+
| TC
| '''Conditions'''
+
| '''Triggers'''
 
|}
 
|}
  
=== Condition ===
+
=== Trigger ===
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 72: Line 72:
 
| string
 
| string
 
| 1
 
| 1
| '''Condition name'''
+
| '''Trigger name''' (zero-terminated)
 
|-
 
|-
 
| float
 
| float
Line 80: Line 80:
 
| long
 
| long
 
| 1
 
| 1
| '''Target state index''' (note: this is ONLY present on the first condition for each trigger!)
+
| '''Target state index''' (note: this is ONLY present on the first trigger for each transition!)
 
|}
 
|}
  

Latest revision as of 10:04, 14 March 2015

The AFSM format controls AI behavior; it stands for AI Finite State Machine. AI-controlled creatures have a limited number of possible states they can be in. The AFSM file defines those states, and what triggers can cause it to transition to another state.


Morphball render.png This file format is almost completely documented
We should have a list of possible states and triggers and a short explanation of what they generally do on this page somewhere. Also, the float settings on conditions is unknown.


Format

Header

The format first defines a list of states, then defines the triggers for each transition attached to each state. There are no state/trigger type IDs; rather, the name string itself is used as an identifier to fetch the corresponding AI function. It starts with a short header listing each state and then providing a trigger count. Note that the trigger count isn't actually used to parse the file; it's present merely because the game uses it to allocate space for each trigger ahead of time.

Type Count Description
long 1 State count (SC)
string SC State names (each zero-terminated)
long 1 Trigger count

State Transitions

Following that, it iterates through each state, defining the transitions associated with each one. Transitions are composed of a target state index and a number of triggers; when all the triggers associated with a transition are satisfied, it advances to the targeted state. The state transitions are structured like this:

Type Count Description
long 1 Transition count (TC)
Transition TC Transitions

Transitions

Type Count Description
long 1 Trigger count (TC)
Trigger TC Triggers

Trigger

Type Count Description
string 1 Trigger name (zero-terminated)
float 1 Unknown (possibly AI function parameter)
long 1 Target state index (note: this is ONLY present on the first trigger for each transition!)