Edit history:
Aruki: 2015-01-11 11:03:08 am
Aruki: 2015-01-11 10:57:03 am
Aruki: 2015-01-11 10:30:01 am
Aruki: 2015-01-11 10:27:57 am
Aruki: 2015-01-11 04:31:01 am
Aruki: 2015-01-11 04:29:32 am
Aruki: 2015-01-11 12:55:27 am
Aruki: 2015-01-11 12:27:30 am
Aruki: 2015-01-11 12:24:19 am
Aruki: 2015-01-10 02:40:21 pm
Aruki: 2015-01-10 01:15:15 pm
Aruki: 2015-01-10 01:14:34 pm
Aruki: 2015-01-10 01:14:12 pm
Aruki: 2015-01-10 01:01:57 pm
Aruki: 2015-01-10 01:00:03 pm
Spent more time digging around the dol and now I've managed to crack the structure for AFSM...
pain in the ass. So the reason this was so confusing before is because after the state names at the beginning, you actually have to read the trigger count and then iterate through each state, not each trigger. You would naturally assume you want to loop through the trigger count, given it's obviously a count value (matches the number of strings in the file), and you just read it two seconds ago. But nope! You could actually skip it entirely and still read the file just fine. (The only reason it's even there is because the game uses it to reserve memory for all the triggers before it starts reading them in. It's not actually used to parse the file.) Also, the fact that there's a variable that only exists on the first condition doesn't help either. (Would've made more sense if the target state index was placed at the start of the trigger instead of after the first condition...)
don't know exactly how this all ties to together and controls the AI just yet, that's going to take some experimentation later.
EDIT: So now that I've gotten some sleep I wrote something to parse these files. Here's a dump of the data contained in Metroid7/09689750.AFSM, the largest AFSM file in the game (for Metroid Prime's first phase I believe), to give an example of what's in these files...
Couple more.
Babygoth (7ed253fb.AFSM)
Metaree (62c39ad6.AFSM)
EDIT: So this is all fairly obvious from the names, but I think the way it works is, the enemy always starts from the first state. When one of the trigger conditions is met, it advances to the state pointed to by that trigger. I'm not sure what the extra function names some triggers have is, exactly; best guess is it's multiple conditions that all need to be met before the trigger activates. It looks like some states can trigger on their own - "Dead", for example, never has any triggers pointing to it, so I'm guessing the enemy is forced to that state when their HP drops to 0 regardless of what they're doing.
Haven't experimented too much yet, but I did modify the Metaree's Active state, so ShouldAttack points to Explode instead of Halt. Makes them drop from the ceiling, and then immediately explode. :P Apparently Explode and Dead are actually not the exact same thing; Explode only triggers when you get too close to it (notice in the FSM it's only activated by TooClose triggers), and it makes you take damage regardless of where the Shriekbat actually is in the room, which I found kinda funny.
Code:
struct AFSM { u32 state_count; std::vector<std::string> state_names; u32 trigger_count; struct StateTriggers { u32 state_trigger_count; struct Trigger { u32 trigger_condition_count; struct Condition { std::string condition_name; float float_param; // The AI functions take a float parameter; I assume this is that parameter u32 state_index; // Only present on the first condition for each trigger }; std::vector<Condition> conditions; }; std::vector<Trigger> triggers; }; std::vector<StateTriggers> state_triggers; // one per state };
pain in the ass. So the reason this was so confusing before is because after the state names at the beginning, you actually have to read the trigger count and then iterate through each state, not each trigger. You would naturally assume you want to loop through the trigger count, given it's obviously a count value (matches the number of strings in the file), and you just read it two seconds ago. But nope! You could actually skip it entirely and still read the file just fine. (The only reason it's even there is because the game uses it to reserve memory for all the triggers before it starts reading them in. It's not actually used to parse the file.) Also, the fact that there's a variable that only exists on the first condition doesn't help either. (Would've made more sense if the target state index was placed at the start of the trigger instead of after the first condition...)
don't know exactly how this all ties to together and controls the AI just yet, that's going to take some experimentation later.
EDIT: So now that I've gotten some sleep I wrote something to parse these files. Here's a dump of the data contained in Metroid7/09689750.AFSM, the largest AFSM file in the game (for Metroid Prime's first phase I believe), to give an example of what's in these files...
Quote:
114 states
1. Start4
2. Dead
3. Active
4. Retreat
5. InActive
6. CoverAttack
7. // begin attack
8. Run
9. SpecialAttack
10. Taunt
11. ProjectileAttack
12. Suck
13. Attack
14. // Freeze Attack Over
15. Run
16. // suck over
17. Start1
18. Start2
19. InActive
20. Active
21. SelectTarget
22. ProjectileAttack
23. SpecialAttack
24. Taunt
25. Flinch
26. Approach
27. Active
28. SelectTarget
29. Attack
30. SpecialAttack
31. ProjectileAttack
32. Taunt
33. Flinch
34. Retreat
35. InActive
36. Active
37. CoverAttack
38. Run
39. Taunt
40. // begin attack
41. Start3
42. InActive
43. Suck
44. Crouch
45. // suck over
46. SpecialAttack
47. ProjectileAttack
48. Flinch
49. Retreat
50. Flinch
51. Start
52. Crouch
53. Approach
54. Enraged
55. Enraged
56. Land
57. Land
58. Enraged
59. // Attack Over
60. Attack
61. Land
62. Land
63. Land
64. Flinch
65. Flinch
66. Enraged
67. Flinch
68. // Attack Over
69. Enraged
70. Crouch
71. Flinch
72. // suck over
73. Run
74. // Freeze Attack Over
75. Attack
76. Suck
77. ProjectileAttack
78. Taunt
79. SpecialAttack
80. // begin attack
81. CoverAttack
82. Retreat
83. Active
84. Run
85. SpecialAttack
86. SpecialAttack
87. // attack over
88. // ice attack over
89. // Ready for attack
90. Growth
91. Cover
92. Cover
93. Cover
94. TurnAround
95. TurnAround
96. TurnAround
97. TurnAround
98. TurnAround
99. // retreat wait
100. // retreat wait
101. // retreat wait
102. // wait for position
103. // retreat wait
104. // retreat wait
105. // charge
106. // charge
107. SelectTarget
108. SelectTarget
109. SelectTarget
110. Enraged
111. Enraged
112. Enraged
113. CoverAttack
114. CoverAttack
253 triggers
STATE 1. Start4
State has 1 trigger
1.1. Default / 0.0 / Targets state 62 (Land)
STATE 2. Dead
State has 0 triggers
STATE 3. Active
State has 6 triggers
1.1. InPosition / 0.0 / Targets state 50 (Flinch)
1.2. Attacked / 0.0
2.1. ShouldRetreat / 0.0 / Targets state 65 (Flinch)
2.2. InPosition / 0.0
3.1. TooClose / 0.0 / Targets state 6 (CoverAttack)
3.2. InPosition / 0.0
4.1. ShouldTurn / 0.0 / Targets state 6 (CoverAttack)
4.2. InPosition / 0.0
5.1. RandomDelay / 7.5 / Targets state 10 (Taunt)
5.2. InPosition / 0.0
6.1. StartAttack / 0.0 / Targets state 109 (SelectTarget)
6.2. InPosition / 0.0
STATE 4. Retreat
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 66 (Enraged)
STATE 5. InActive
State has 1 trigger
1.1. InPosition / 0.0 / Targets state 57 (Land)
1.2. CodeTrigger / 0.0
STATE 6. CoverAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 3 (Active)
STATE 7. // begin attack
State has 9 triggers
1.1. ShouldMove / 0.0 / Targets state 105 (// charge)
2.1. ShouldSpecialAttack / 0.0 / Targets state 9 (SpecialAttack)
3.1. ShouldFire / 0.0 / Targets state 11 (ProjectileAttack)
4.1. ShouldJumpBack / 0.0 / Targets state 11 (ProjectileAttack)
5.1. ShouldCrouch / 0.0 / Targets state 12 (Suck)
6.1. ShouldAttack / 0.0 / Targets state 13 (Attack)
7.1. CoverFind / 0.0 / Targets state 58 (Enraged)
8.1. CoveringFire / 0.0 / Targets state 91 (Cover)
9.1. FixedDelay / 0.0 / Targets state 3 (Active)
STATE 8. Run
State has 1 trigger
1.1. ShouldDoubleSnap / 0.0 / Targets state 95 (TurnAround)
STATE 9. SpecialAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 103 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 59 (// Attack Over)
STATE 10. Taunt
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 3 (Active)
STATE 11. ProjectileAttack
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 103 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 106 (// charge)
2.2. AnimOver / 0.0
3.1. AnimOver / 0.0 / Targets state 59 (// Attack Over)
STATE 12. Suck
State has 3 triggers
1.1. AttackOver / 0.0 / Targets state 16 (// suck over)
1.2. InPosition / 0.0
2.1. Delay / 20.0 / Targets state 16 (// suck over)
3.1. AggressionCheck / 0.0 / Targets state 52 (Crouch)
3.2. InPosition / 0.0
STATE 13. Attack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 103 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 14 (// Freeze Attack Over)
STATE 14. // Freeze Attack Over
State has 2 triggers
1.1. PlayerSpot / 0.0 / Targets state 106 (// charge)
2.1. Delay / 1.5 / Targets state 59 (// Attack Over)
STATE 15. Run
State has 1 trigger
1.1. ShouldDoubleSnap / 0.0 / Targets state 97 (TurnAround)
STATE 16. // suck over
State has 1 trigger
1.1. Default / 0.0 / Targets state 3 (Active)
STATE 17. Start1
State has 1 trigger
1.1. Default / 0.0 / Targets state 19 (InActive)
STATE 18. Start2
State has 1 trigger
1.1. Default / 0.0 / Targets state 61 (Land)
STATE 19. InActive
State has 1 trigger
1.1. InPosition / 0.0 / Targets state 53 (Approach)
1.2. CodeTrigger / 0.0
STATE 20. Active
State has 6 triggers
1.1. InPosition / 0.0 / Targets state 25 (Flinch)
1.2. ShouldRetreat / 0.0
2.1. ShouldTurn / 0.0 / Targets state 114 (CoverAttack)
2.2. InPosition / 0.0
3.1. TooClose / 0.0 / Targets state 114 (CoverAttack)
3.2. InPosition / 0.0
4.1. StartAttack / 0.0 / Targets state 21 (SelectTarget)
4.2. InPosition / 0.0
5.1. RandomDelay / 3.0 / Targets state 24 (Taunt)
5.2. InPosition / 0.0
6.1. Attacked / 0.0 / Targets state 102 (// wait for position)
STATE 21. SelectTarget
State has 3 triggers
1.1. ShouldSpecialAttack / 0.0 / Targets state 23 (SpecialAttack)
2.1. ShouldFire / 0.0 / Targets state 22 (ProjectileAttack)
3.1. FixedDelay / 0.0 / Targets state 20 (Active)
STATE 22. ProjectileAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 100 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 20 (Active)
STATE 23. SpecialAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 100 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 20 (Active)
STATE 24. Taunt
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 20 (Active)
STATE 25. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 26 (Approach)
STATE 26. Approach
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 54 (Enraged)
STATE 27. Active
State has 6 triggers
1.1. ShouldRetreat / 0.0 / Targets state 33 (Flinch)
1.2. InPosition / 0.0
2.1. ShouldTurn / 0.0 / Targets state 113 (CoverAttack)
2.2. InPosition / 0.0
3.1. TooClose / 0.0 / Targets state 113 (CoverAttack)
3.2. InPosition / 0.0
4.1. StartAttack / 0.0 / Targets state 28 (SelectTarget)
4.2. InPosition / 0.0
5.1. RandomDelay / 3.0 / Targets state 32 (Taunt)
5.2. InPosition / 0.0
6.1. Attacked / 0.0 / Targets state 102 (// wait for position)
STATE 28. SelectTarget
State has 4 triggers
1.1. ShouldFire / 0.0 / Targets state 31 (ProjectileAttack)
2.1. ShouldSpecialAttack / 0.0 / Targets state 30 (SpecialAttack)
3.1. ShouldAttack / 0.0 / Targets state 29 (Attack)
4.1. FixedDelay / 0.0 / Targets state 27 (Active)
STATE 29. Attack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 99 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 30 (SpecialAttack)
STATE 30. SpecialAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 99 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 27 (Active)
STATE 31. ProjectileAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 99 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 27 (Active)
STATE 32. Taunt
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 27 (Active)
STATE 33. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 34 (Retreat)
STATE 34. Retreat
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 35 (InActive)
STATE 35. InActive
State has 1 trigger
1.1. InPosition / 0.0 / Targets state 111 (Enraged)
1.2. CodeTrigger / 0.0
STATE 36. Active
State has 6 triggers
1.1. Attacked / 0.0 / Targets state 48 (Flinch)
1.2. InPosition / 0.0
2.1. ShouldRetreat / 0.0 / Targets state 64 (Flinch)
2.2. InPosition / 0.0
3.1. ShouldTurn / 0.0 / Targets state 37 (CoverAttack)
3.2. InPosition / 0.0
4.1. TooClose / 0.0 / Targets state 37 (CoverAttack)
4.2. InPosition / 0.0
5.1. StartAttack / 0.0 / Targets state 108 (SelectTarget)
5.2. InPosition / 0.0
6.1. RandomDelay / 5.7 / Targets state 39 (Taunt)
6.2. InPosition / 0.0
STATE 37. CoverAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 36 (Active)
STATE 38. Run
State has 1 trigger
1.1. ShouldDoubleSnap / 0.0 / Targets state 94 (TurnAround)
STATE 39. Taunt
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 36 (Active)
STATE 40. // begin attack
State has 7 triggers
1.1. CoveringFire / 0.0 / Targets state 93 (Cover)
2.1. ShouldSpecialAttack / 0.0 / Targets state 46 (SpecialAttack)
3.1. ShouldFire / 0.0 / Targets state 47 (ProjectileAttack)
4.1. ShouldJumpBack / 0.0 / Targets state 47 (ProjectileAttack)
5.1. ShouldAttack / 0.0 / Targets state 60 (Attack)
6.1. FixedDelay / 0.0 / Targets state 36 (Active)
7.1. ShouldMove / 0.0 / Targets state 47 (ProjectileAttack)
STATE 41. Start3
State has 1 trigger
1.1. Default / 0.0 / Targets state 63 (Land)
STATE 42. InActive
State has 1 trigger
1.1. InPosition / 0.0 / Targets state 112 (Enraged)
1.2. CodeTrigger / 0.0
STATE 43. Suck
State has 3 triggers
1.1. Delay / 20.0 / Targets state 45 (// suck over)
2.1. AggressionCheck / 0.0 / Targets state 44 (Crouch)
2.2. InPosition / 0.0
3.1. AttackOver / 0.0 / Targets state 45 (// suck over)
3.2. InPosition / 0.0
STATE 44. Crouch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 45 (// suck over)
STATE 45. // suck over
State has 1 trigger
1.1. Default / 0.0 / Targets state 83 (Active)
STATE 46. SpecialAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 101 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 87 (// attack over)
STATE 47. ProjectileAttack
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 101 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 86 (SpecialAttack)
2.2. AnimOver / 0.0
3.1. AnimOver / 0.0 / Targets state 87 (// attack over)
STATE 48. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 49 (Retreat)
STATE 49. Retreat
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 42 (InActive)
STATE 50. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 4 (Retreat)
STATE 51. Start
State has 1 trigger
1.1. Default / 0.0 / Targets state 17 (Start1)
STATE 52. Crouch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 16 (// suck over)
STATE 53. Approach
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 56 (Land)
STATE 54. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 27 (Active)
STATE 55. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 87 (// attack over)
STATE 56. Land
State has 1 trigger
1.1. Default / 0.0 / Targets state 20 (Active)
STATE 57. Land
State has 1 trigger
1.1. Default / 0.0 / Targets state 3 (Active)
STATE 58. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 59 (// Attack Over)
STATE 59. // Attack Over
State has 1 trigger
1.1. Default / 0.0 / Targets state 3 (Active)
STATE 60. Attack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 101 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 88 (// ice attack over)
STATE 61. Land
State has 1 trigger
1.1. Default / 0.0 / Targets state 35 (InActive)
STATE 62. Land
State has 1 trigger
1.1. Default / 0.0 / Targets state 5 (InActive)
STATE 63. Land
State has 1 trigger
1.1. Default / 0.0 / Targets state 42 (InActive)
STATE 64. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 38 (Run)
STATE 65. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 15 (Run)
STATE 66. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 5 (InActive)
STATE 67. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 73 (Run)
STATE 68. // Attack Over
State has 1 trigger
1.1. Default / 0.0 / Targets state 83 (Active)
STATE 69. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 83 (Active)
STATE 70. Crouch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 72 (// suck over)
STATE 71. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 82 (Retreat)
STATE 72. // suck over
State has 1 trigger
1.1. Default / 0.0 / Targets state 83 (Active)
STATE 73. Run
State has 1 trigger
1.1. ShouldDoubleSnap / 0.0 / Targets state 98 (TurnAround)
STATE 74. // Freeze Attack Over
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 104 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 85 (SpecialAttack)
2.2. Random / 0.7
3.1. Delay / 1.5 / Targets state 68 (// Attack Over)
STATE 75. Attack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 104 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 74 (// Freeze Attack Over)
STATE 76. Suck
State has 3 triggers
1.1. AggressionCheck / 0.0 / Targets state 70 (Crouch)
1.2. InPosition / 0.0
2.1. AttackOver / 0.0 / Targets state 72 (// suck over)
2.2. InPosition / 0.0
3.1. Delay / 20.0 / Targets state 72 (// suck over)
STATE 77. ProjectileAttack
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 104 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 85 (SpecialAttack)
2.2. AnimOver / 0.0
3.1. AnimOver / 0.0 / Targets state 68 (// Attack Over)
STATE 78. Taunt
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 83 (Active)
STATE 79. SpecialAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 104 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 68 (// Attack Over)
STATE 80. // begin attack
State has 8 triggers
1.1. ShouldMove / 0.0 / Targets state 79 (SpecialAttack)
2.1. ShouldSpecialAttack / 0.0 / Targets state 79 (SpecialAttack)
3.1. ShouldFire / 0.0 / Targets state 77 (ProjectileAttack)
4.1. ShouldJumpBack / 0.0 / Targets state 92 (Cover)
5.1. ShouldCrouch / 0.0 / Targets state 76 (Suck)
6.1. ShouldAttack / 0.0 / Targets state 75 (Attack)
7.1. CoveringFire / 0.0 / Targets state 92 (Cover)
8.1. FixedDelay / 0.0 / Targets state 83 (Active)
STATE 81. CoverAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 83 (Active)
STATE 82. Retreat
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 5 (InActive)
STATE 83. Active
State has 6 triggers
1.1. InPosition / 0.0 / Targets state 71 (Flinch)
1.2. Attacked / 0.0
2.1. ShouldRetreat / 0.0 / Targets state 67 (Flinch)
2.2. InPosition / 0.0
3.1. TooClose / 0.0 / Targets state 81 (CoverAttack)
3.2. InPosition / 0.0
4.1. ShouldTurn / 0.0 / Targets state 81 (CoverAttack)
4.2. InPosition / 0.0
5.1. StartAttack / 0.0 / Targets state 107 (SelectTarget)
5.2. InPosition / 0.0
6.1. RandomDelay / 7.5 / Targets state 78 (Taunt)
6.2. InPosition / 0.0
STATE 84. Run
State has 1 trigger
1.1. ShouldDoubleSnap / 0.0 / Targets state 96 (TurnAround)
STATE 85. SpecialAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 104 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 68 (// Attack Over)
STATE 86. SpecialAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 101 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 87 (// attack over)
STATE 87. // attack over
State has 1 trigger
1.1. Default / 0.0 / Targets state 36 (Active)
STATE 88. // ice attack over
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 101 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 86 (SpecialAttack)
2.2. Random / 0.7
3.1. Delay / 1.5 / Targets state 87 (// attack over)
STATE 89. // Ready for attack
State has 2 triggers
1.1. Random / 0.25 / Targets state 90 (Growth)
2.1. Default / 0.0 / Targets state 7 (// begin attack)
STATE 90. Growth
State has 1 trigger
1.1. Default / 0.0 / Targets state 7 (// begin attack)
STATE 91. Cover
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 103 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 106 (// charge)
2.2. AnimOver / 0.0
3.1. AnimOver / 0.0 / Targets state 59 (// Attack Over)
STATE 92. Cover
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 104 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 85 (SpecialAttack)
2.2. AnimOver / 0.0
3.1. AnimOver / 0.0 / Targets state 68 (// Attack Over)
STATE 93. Cover
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 101 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 86 (SpecialAttack)
2.2. AnimOver / 0.0
3.1. AnimOver / 0.0 / Targets state 87 (// attack over)
STATE 94. TurnAround
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 55 (Enraged)
STATE 95. TurnAround
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 59 (// Attack Over)
STATE 96. TurnAround
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 59 (// Attack Over)
STATE 97. TurnAround
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 110 (Enraged)
STATE 98. TurnAround
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 69 (Enraged)
STATE 99. // retreat wait
State has 1 trigger
1.1. InPosition / 0.0 / Targets state 33 (Flinch)
STATE 100. // retreat wait
State has 1 trigger
1.1. InPosition / 0.0 / Targets state 25 (Flinch)
STATE 101. // retreat wait
State has 2 triggers
1.1. InPosition / 0.0 / Targets state 48 (Flinch)
1.2. Attacked / 0.0
2.1. InPosition / 0.0 / Targets state 64 (Flinch)
STATE 102. // wait for position
State has 1 trigger
1.1. InPosition / 0.0 / Targets state 33 (Flinch)
STATE 103. // retreat wait
State has 2 triggers
1.1. InPosition / 0.0 / Targets state 50 (Flinch)
1.2. Attacked / 0.0
2.1. InPosition / 0.0 / Targets state 65 (Flinch)
STATE 104. // retreat wait
State has 2 triggers
1.1. InPosition / 0.0 / Targets state 71 (Flinch)
1.2. Attacked / 0.0
2.1. InPosition / 0.0 / Targets state 67 (Flinch)
STATE 105. // charge
State has 1 trigger
1.1. Default / 0.0 / Targets state 8 (Run)
STATE 106. // charge
State has 1 trigger
1.1. Default / 0.0 / Targets state 84 (Run)
STATE 107. SelectTarget
State has 1 trigger
1.1. Default / 0.0 / Targets state 80 (// begin attack)
STATE 108. SelectTarget
State has 1 trigger
1.1. Default / 0.0 / Targets state 40 (// begin attack)
STATE 109. SelectTarget
State has 1 trigger
1.1. Default / 0.0 / Targets state 89 (// Ready for attack)
STATE 110. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 3 (Active)
STATE 111. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 36 (Active)
STATE 112. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 43 (Suck)
STATE 113. CoverAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 27 (Active)
STATE 114. CoverAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 20 (Active)
1. Start4
2. Dead
3. Active
4. Retreat
5. InActive
6. CoverAttack
7. // begin attack
8. Run
9. SpecialAttack
10. Taunt
11. ProjectileAttack
12. Suck
13. Attack
14. // Freeze Attack Over
15. Run
16. // suck over
17. Start1
18. Start2
19. InActive
20. Active
21. SelectTarget
22. ProjectileAttack
23. SpecialAttack
24. Taunt
25. Flinch
26. Approach
27. Active
28. SelectTarget
29. Attack
30. SpecialAttack
31. ProjectileAttack
32. Taunt
33. Flinch
34. Retreat
35. InActive
36. Active
37. CoverAttack
38. Run
39. Taunt
40. // begin attack
41. Start3
42. InActive
43. Suck
44. Crouch
45. // suck over
46. SpecialAttack
47. ProjectileAttack
48. Flinch
49. Retreat
50. Flinch
51. Start
52. Crouch
53. Approach
54. Enraged
55. Enraged
56. Land
57. Land
58. Enraged
59. // Attack Over
60. Attack
61. Land
62. Land
63. Land
64. Flinch
65. Flinch
66. Enraged
67. Flinch
68. // Attack Over
69. Enraged
70. Crouch
71. Flinch
72. // suck over
73. Run
74. // Freeze Attack Over
75. Attack
76. Suck
77. ProjectileAttack
78. Taunt
79. SpecialAttack
80. // begin attack
81. CoverAttack
82. Retreat
83. Active
84. Run
85. SpecialAttack
86. SpecialAttack
87. // attack over
88. // ice attack over
89. // Ready for attack
90. Growth
91. Cover
92. Cover
93. Cover
94. TurnAround
95. TurnAround
96. TurnAround
97. TurnAround
98. TurnAround
99. // retreat wait
100. // retreat wait
101. // retreat wait
102. // wait for position
103. // retreat wait
104. // retreat wait
105. // charge
106. // charge
107. SelectTarget
108. SelectTarget
109. SelectTarget
110. Enraged
111. Enraged
112. Enraged
113. CoverAttack
114. CoverAttack
253 triggers
STATE 1. Start4
State has 1 trigger
1.1. Default / 0.0 / Targets state 62 (Land)
STATE 2. Dead
State has 0 triggers
STATE 3. Active
State has 6 triggers
1.1. InPosition / 0.0 / Targets state 50 (Flinch)
1.2. Attacked / 0.0
2.1. ShouldRetreat / 0.0 / Targets state 65 (Flinch)
2.2. InPosition / 0.0
3.1. TooClose / 0.0 / Targets state 6 (CoverAttack)
3.2. InPosition / 0.0
4.1. ShouldTurn / 0.0 / Targets state 6 (CoverAttack)
4.2. InPosition / 0.0
5.1. RandomDelay / 7.5 / Targets state 10 (Taunt)
5.2. InPosition / 0.0
6.1. StartAttack / 0.0 / Targets state 109 (SelectTarget)
6.2. InPosition / 0.0
STATE 4. Retreat
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 66 (Enraged)
STATE 5. InActive
State has 1 trigger
1.1. InPosition / 0.0 / Targets state 57 (Land)
1.2. CodeTrigger / 0.0
STATE 6. CoverAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 3 (Active)
STATE 7. // begin attack
State has 9 triggers
1.1. ShouldMove / 0.0 / Targets state 105 (// charge)
2.1. ShouldSpecialAttack / 0.0 / Targets state 9 (SpecialAttack)
3.1. ShouldFire / 0.0 / Targets state 11 (ProjectileAttack)
4.1. ShouldJumpBack / 0.0 / Targets state 11 (ProjectileAttack)
5.1. ShouldCrouch / 0.0 / Targets state 12 (Suck)
6.1. ShouldAttack / 0.0 / Targets state 13 (Attack)
7.1. CoverFind / 0.0 / Targets state 58 (Enraged)
8.1. CoveringFire / 0.0 / Targets state 91 (Cover)
9.1. FixedDelay / 0.0 / Targets state 3 (Active)
STATE 8. Run
State has 1 trigger
1.1. ShouldDoubleSnap / 0.0 / Targets state 95 (TurnAround)
STATE 9. SpecialAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 103 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 59 (// Attack Over)
STATE 10. Taunt
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 3 (Active)
STATE 11. ProjectileAttack
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 103 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 106 (// charge)
2.2. AnimOver / 0.0
3.1. AnimOver / 0.0 / Targets state 59 (// Attack Over)
STATE 12. Suck
State has 3 triggers
1.1. AttackOver / 0.0 / Targets state 16 (// suck over)
1.2. InPosition / 0.0
2.1. Delay / 20.0 / Targets state 16 (// suck over)
3.1. AggressionCheck / 0.0 / Targets state 52 (Crouch)
3.2. InPosition / 0.0
STATE 13. Attack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 103 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 14 (// Freeze Attack Over)
STATE 14. // Freeze Attack Over
State has 2 triggers
1.1. PlayerSpot / 0.0 / Targets state 106 (// charge)
2.1. Delay / 1.5 / Targets state 59 (// Attack Over)
STATE 15. Run
State has 1 trigger
1.1. ShouldDoubleSnap / 0.0 / Targets state 97 (TurnAround)
STATE 16. // suck over
State has 1 trigger
1.1. Default / 0.0 / Targets state 3 (Active)
STATE 17. Start1
State has 1 trigger
1.1. Default / 0.0 / Targets state 19 (InActive)
STATE 18. Start2
State has 1 trigger
1.1. Default / 0.0 / Targets state 61 (Land)
STATE 19. InActive
State has 1 trigger
1.1. InPosition / 0.0 / Targets state 53 (Approach)
1.2. CodeTrigger / 0.0
STATE 20. Active
State has 6 triggers
1.1. InPosition / 0.0 / Targets state 25 (Flinch)
1.2. ShouldRetreat / 0.0
2.1. ShouldTurn / 0.0 / Targets state 114 (CoverAttack)
2.2. InPosition / 0.0
3.1. TooClose / 0.0 / Targets state 114 (CoverAttack)
3.2. InPosition / 0.0
4.1. StartAttack / 0.0 / Targets state 21 (SelectTarget)
4.2. InPosition / 0.0
5.1. RandomDelay / 3.0 / Targets state 24 (Taunt)
5.2. InPosition / 0.0
6.1. Attacked / 0.0 / Targets state 102 (// wait for position)
STATE 21. SelectTarget
State has 3 triggers
1.1. ShouldSpecialAttack / 0.0 / Targets state 23 (SpecialAttack)
2.1. ShouldFire / 0.0 / Targets state 22 (ProjectileAttack)
3.1. FixedDelay / 0.0 / Targets state 20 (Active)
STATE 22. ProjectileAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 100 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 20 (Active)
STATE 23. SpecialAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 100 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 20 (Active)
STATE 24. Taunt
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 20 (Active)
STATE 25. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 26 (Approach)
STATE 26. Approach
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 54 (Enraged)
STATE 27. Active
State has 6 triggers
1.1. ShouldRetreat / 0.0 / Targets state 33 (Flinch)
1.2. InPosition / 0.0
2.1. ShouldTurn / 0.0 / Targets state 113 (CoverAttack)
2.2. InPosition / 0.0
3.1. TooClose / 0.0 / Targets state 113 (CoverAttack)
3.2. InPosition / 0.0
4.1. StartAttack / 0.0 / Targets state 28 (SelectTarget)
4.2. InPosition / 0.0
5.1. RandomDelay / 3.0 / Targets state 32 (Taunt)
5.2. InPosition / 0.0
6.1. Attacked / 0.0 / Targets state 102 (// wait for position)
STATE 28. SelectTarget
State has 4 triggers
1.1. ShouldFire / 0.0 / Targets state 31 (ProjectileAttack)
2.1. ShouldSpecialAttack / 0.0 / Targets state 30 (SpecialAttack)
3.1. ShouldAttack / 0.0 / Targets state 29 (Attack)
4.1. FixedDelay / 0.0 / Targets state 27 (Active)
STATE 29. Attack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 99 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 30 (SpecialAttack)
STATE 30. SpecialAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 99 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 27 (Active)
STATE 31. ProjectileAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 99 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 27 (Active)
STATE 32. Taunt
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 27 (Active)
STATE 33. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 34 (Retreat)
STATE 34. Retreat
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 35 (InActive)
STATE 35. InActive
State has 1 trigger
1.1. InPosition / 0.0 / Targets state 111 (Enraged)
1.2. CodeTrigger / 0.0
STATE 36. Active
State has 6 triggers
1.1. Attacked / 0.0 / Targets state 48 (Flinch)
1.2. InPosition / 0.0
2.1. ShouldRetreat / 0.0 / Targets state 64 (Flinch)
2.2. InPosition / 0.0
3.1. ShouldTurn / 0.0 / Targets state 37 (CoverAttack)
3.2. InPosition / 0.0
4.1. TooClose / 0.0 / Targets state 37 (CoverAttack)
4.2. InPosition / 0.0
5.1. StartAttack / 0.0 / Targets state 108 (SelectTarget)
5.2. InPosition / 0.0
6.1. RandomDelay / 5.7 / Targets state 39 (Taunt)
6.2. InPosition / 0.0
STATE 37. CoverAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 36 (Active)
STATE 38. Run
State has 1 trigger
1.1. ShouldDoubleSnap / 0.0 / Targets state 94 (TurnAround)
STATE 39. Taunt
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 36 (Active)
STATE 40. // begin attack
State has 7 triggers
1.1. CoveringFire / 0.0 / Targets state 93 (Cover)
2.1. ShouldSpecialAttack / 0.0 / Targets state 46 (SpecialAttack)
3.1. ShouldFire / 0.0 / Targets state 47 (ProjectileAttack)
4.1. ShouldJumpBack / 0.0 / Targets state 47 (ProjectileAttack)
5.1. ShouldAttack / 0.0 / Targets state 60 (Attack)
6.1. FixedDelay / 0.0 / Targets state 36 (Active)
7.1. ShouldMove / 0.0 / Targets state 47 (ProjectileAttack)
STATE 41. Start3
State has 1 trigger
1.1. Default / 0.0 / Targets state 63 (Land)
STATE 42. InActive
State has 1 trigger
1.1. InPosition / 0.0 / Targets state 112 (Enraged)
1.2. CodeTrigger / 0.0
STATE 43. Suck
State has 3 triggers
1.1. Delay / 20.0 / Targets state 45 (// suck over)
2.1. AggressionCheck / 0.0 / Targets state 44 (Crouch)
2.2. InPosition / 0.0
3.1. AttackOver / 0.0 / Targets state 45 (// suck over)
3.2. InPosition / 0.0
STATE 44. Crouch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 45 (// suck over)
STATE 45. // suck over
State has 1 trigger
1.1. Default / 0.0 / Targets state 83 (Active)
STATE 46. SpecialAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 101 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 87 (// attack over)
STATE 47. ProjectileAttack
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 101 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 86 (SpecialAttack)
2.2. AnimOver / 0.0
3.1. AnimOver / 0.0 / Targets state 87 (// attack over)
STATE 48. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 49 (Retreat)
STATE 49. Retreat
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 42 (InActive)
STATE 50. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 4 (Retreat)
STATE 51. Start
State has 1 trigger
1.1. Default / 0.0 / Targets state 17 (Start1)
STATE 52. Crouch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 16 (// suck over)
STATE 53. Approach
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 56 (Land)
STATE 54. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 27 (Active)
STATE 55. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 87 (// attack over)
STATE 56. Land
State has 1 trigger
1.1. Default / 0.0 / Targets state 20 (Active)
STATE 57. Land
State has 1 trigger
1.1. Default / 0.0 / Targets state 3 (Active)
STATE 58. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 59 (// Attack Over)
STATE 59. // Attack Over
State has 1 trigger
1.1. Default / 0.0 / Targets state 3 (Active)
STATE 60. Attack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 101 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 88 (// ice attack over)
STATE 61. Land
State has 1 trigger
1.1. Default / 0.0 / Targets state 35 (InActive)
STATE 62. Land
State has 1 trigger
1.1. Default / 0.0 / Targets state 5 (InActive)
STATE 63. Land
State has 1 trigger
1.1. Default / 0.0 / Targets state 42 (InActive)
STATE 64. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 38 (Run)
STATE 65. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 15 (Run)
STATE 66. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 5 (InActive)
STATE 67. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 73 (Run)
STATE 68. // Attack Over
State has 1 trigger
1.1. Default / 0.0 / Targets state 83 (Active)
STATE 69. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 83 (Active)
STATE 70. Crouch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 72 (// suck over)
STATE 71. Flinch
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 82 (Retreat)
STATE 72. // suck over
State has 1 trigger
1.1. Default / 0.0 / Targets state 83 (Active)
STATE 73. Run
State has 1 trigger
1.1. ShouldDoubleSnap / 0.0 / Targets state 98 (TurnAround)
STATE 74. // Freeze Attack Over
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 104 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 85 (SpecialAttack)
2.2. Random / 0.7
3.1. Delay / 1.5 / Targets state 68 (// Attack Over)
STATE 75. Attack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 104 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 74 (// Freeze Attack Over)
STATE 76. Suck
State has 3 triggers
1.1. AggressionCheck / 0.0 / Targets state 70 (Crouch)
1.2. InPosition / 0.0
2.1. AttackOver / 0.0 / Targets state 72 (// suck over)
2.2. InPosition / 0.0
3.1. Delay / 20.0 / Targets state 72 (// suck over)
STATE 77. ProjectileAttack
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 104 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 85 (SpecialAttack)
2.2. AnimOver / 0.0
3.1. AnimOver / 0.0 / Targets state 68 (// Attack Over)
STATE 78. Taunt
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 83 (Active)
STATE 79. SpecialAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 104 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 68 (// Attack Over)
STATE 80. // begin attack
State has 8 triggers
1.1. ShouldMove / 0.0 / Targets state 79 (SpecialAttack)
2.1. ShouldSpecialAttack / 0.0 / Targets state 79 (SpecialAttack)
3.1. ShouldFire / 0.0 / Targets state 77 (ProjectileAttack)
4.1. ShouldJumpBack / 0.0 / Targets state 92 (Cover)
5.1. ShouldCrouch / 0.0 / Targets state 76 (Suck)
6.1. ShouldAttack / 0.0 / Targets state 75 (Attack)
7.1. CoveringFire / 0.0 / Targets state 92 (Cover)
8.1. FixedDelay / 0.0 / Targets state 83 (Active)
STATE 81. CoverAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 83 (Active)
STATE 82. Retreat
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 5 (InActive)
STATE 83. Active
State has 6 triggers
1.1. InPosition / 0.0 / Targets state 71 (Flinch)
1.2. Attacked / 0.0
2.1. ShouldRetreat / 0.0 / Targets state 67 (Flinch)
2.2. InPosition / 0.0
3.1. TooClose / 0.0 / Targets state 81 (CoverAttack)
3.2. InPosition / 0.0
4.1. ShouldTurn / 0.0 / Targets state 81 (CoverAttack)
4.2. InPosition / 0.0
5.1. StartAttack / 0.0 / Targets state 107 (SelectTarget)
5.2. InPosition / 0.0
6.1. RandomDelay / 7.5 / Targets state 78 (Taunt)
6.2. InPosition / 0.0
STATE 84. Run
State has 1 trigger
1.1. ShouldDoubleSnap / 0.0 / Targets state 96 (TurnAround)
STATE 85. SpecialAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 104 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 68 (// Attack Over)
STATE 86. SpecialAttack
State has 2 triggers
1.1. ShouldRetreat / 0.0 / Targets state 101 (// retreat wait)
2.1. AnimOver / 0.0 / Targets state 87 (// attack over)
STATE 87. // attack over
State has 1 trigger
1.1. Default / 0.0 / Targets state 36 (Active)
STATE 88. // ice attack over
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 101 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 86 (SpecialAttack)
2.2. Random / 0.7
3.1. Delay / 1.5 / Targets state 87 (// attack over)
STATE 89. // Ready for attack
State has 2 triggers
1.1. Random / 0.25 / Targets state 90 (Growth)
2.1. Default / 0.0 / Targets state 7 (// begin attack)
STATE 90. Growth
State has 1 trigger
1.1. Default / 0.0 / Targets state 7 (// begin attack)
STATE 91. Cover
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 103 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 106 (// charge)
2.2. AnimOver / 0.0
3.1. AnimOver / 0.0 / Targets state 59 (// Attack Over)
STATE 92. Cover
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 104 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 85 (SpecialAttack)
2.2. AnimOver / 0.0
3.1. AnimOver / 0.0 / Targets state 68 (// Attack Over)
STATE 93. Cover
State has 3 triggers
1.1. ShouldRetreat / 0.0 / Targets state 101 (// retreat wait)
2.1. PlayerSpot / 0.0 / Targets state 86 (SpecialAttack)
2.2. AnimOver / 0.0
3.1. AnimOver / 0.0 / Targets state 87 (// attack over)
STATE 94. TurnAround
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 55 (Enraged)
STATE 95. TurnAround
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 59 (// Attack Over)
STATE 96. TurnAround
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 59 (// Attack Over)
STATE 97. TurnAround
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 110 (Enraged)
STATE 98. TurnAround
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 69 (Enraged)
STATE 99. // retreat wait
State has 1 trigger
1.1. InPosition / 0.0 / Targets state 33 (Flinch)
STATE 100. // retreat wait
State has 1 trigger
1.1. InPosition / 0.0 / Targets state 25 (Flinch)
STATE 101. // retreat wait
State has 2 triggers
1.1. InPosition / 0.0 / Targets state 48 (Flinch)
1.2. Attacked / 0.0
2.1. InPosition / 0.0 / Targets state 64 (Flinch)
STATE 102. // wait for position
State has 1 trigger
1.1. InPosition / 0.0 / Targets state 33 (Flinch)
STATE 103. // retreat wait
State has 2 triggers
1.1. InPosition / 0.0 / Targets state 50 (Flinch)
1.2. Attacked / 0.0
2.1. InPosition / 0.0 / Targets state 65 (Flinch)
STATE 104. // retreat wait
State has 2 triggers
1.1. InPosition / 0.0 / Targets state 71 (Flinch)
1.2. Attacked / 0.0
2.1. InPosition / 0.0 / Targets state 67 (Flinch)
STATE 105. // charge
State has 1 trigger
1.1. Default / 0.0 / Targets state 8 (Run)
STATE 106. // charge
State has 1 trigger
1.1. Default / 0.0 / Targets state 84 (Run)
STATE 107. SelectTarget
State has 1 trigger
1.1. Default / 0.0 / Targets state 80 (// begin attack)
STATE 108. SelectTarget
State has 1 trigger
1.1. Default / 0.0 / Targets state 40 (// begin attack)
STATE 109. SelectTarget
State has 1 trigger
1.1. Default / 0.0 / Targets state 89 (// Ready for attack)
STATE 110. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 3 (Active)
STATE 111. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 36 (Active)
STATE 112. Enraged
State has 1 trigger
1.1. Default / 0.0 / Targets state 43 (Suck)
STATE 113. CoverAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 27 (Active)
STATE 114. CoverAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 20 (Active)
Couple more.
Babygoth (7ed253fb.AFSM)
Quote:
20 states
1. Start
2. Patrol
3. Dead
4. PathFind
5. ProjectileAttack
6. TargetPatrol
7. Deactivate
8. Crouch
9. Generate
10. Attack
11. FollowPattern
12. Enraged
13. SpecialAttack
14. Approach
15. Taunt
16. SpecialAttack
17. ProjectileAttack
18. GetUp
19. TurnAround
20. TurnAround
57 triggers
STATE 1. Start
State has 2 triggers
1.1. HasPatrolPath / 0.0 / Targets state 2 (Patrol)
2.1. Default / 0.0 / Targets state 8 (Crouch)
STATE 2. Patrol
State has 1 trigger
1.1. InDetectionRange / 1.0 / Targets state 15 (Taunt)
1.2. SpotPlayer / 0.0
STATE 3. Dead
State has 0 triggers
STATE 4. PathFind
State has 8 triggers
1.1. AggressionCheck / 0.0 / Targets state 12 (Enraged)
2.1. LineOfSight / 0.0 / Targets state 19 (TurnAround)
2.2. InRange / 0.0
3.1. ShouldAttack / 0.0 / Targets state 10 (Attack)
4.1. ShouldSpecialAttack / 0.0 / Targets state 13 (SpecialAttack)
5.1. Leash / 0.0 / Targets state 6 (TargetPatrol)
5.2. !InDetectionRange / 0.5
6.1. OffLine / 0.0 / Targets state 14 (Approach)
7.1. LostInterest / 0.0 / Targets state 6 (TargetPatrol)
8.1. Delay / 1.0 / Targets state 4 (PathFind)
STATE 5. ProjectileAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 19 (TurnAround)
STATE 6. TargetPatrol
State has 5 triggers
1.1. HasPatrolPath / 0.0 / Targets state 2 (Patrol)
1.2. InPosition / 0.0
2.1. InDetectionRange / 0.75 / Targets state 15 (Taunt)
2.2. !LostInterest / 0.0
3.1. InPosition / 0.0 / Targets state 7 (Deactivate)
4.1. Delay / 2.0 / Targets state 6 (TargetPatrol)
5.1. ShotAt / 0.0 / Targets state 4 (PathFind)
STATE 7. Deactivate
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 8 (Crouch)
STATE 8. Crouch
State has 1 trigger
1.1. SpotPlayer / 0.0 / Targets state 9 (Generate)
1.2. InDetectionRange / 0.75
STATE 9. Generate
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 4 (PathFind)
STATE 10. Attack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 11 (FollowPattern)
STATE 11. FollowPattern
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 19 (TurnAround)
STATE 12. Enraged
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 4 (PathFind)
STATE 13. SpecialAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 4 (PathFind)
STATE 14. Approach
State has 6 triggers
1.1. !OffLine / 0.0 / Targets state 4 (PathFind)
1.2. Delay / 1.0
2.1. LineOfSight / 0.0 / Targets state 20 (TurnAround)
2.2. Delay / 1.75
3.1. ShouldSpecialAttack / 0.0 / Targets state 16 (SpecialAttack)
4.1. ShouldFire / 0.0 / Targets state 17 (ProjectileAttack)
5.1. LostInterest / 0.0 / Targets state 6 (TargetPatrol)
6.1. Delay / 2.0 / Targets state 14 (Approach)
STATE 15. Taunt
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 4 (PathFind)
STATE 16. SpecialAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 14 (Approach)
STATE 17. ProjectileAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 14 (Approach)
STATE 18. GetUp
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 4 (PathFind)
STATE 19. TurnAround
State has 7 triggers
1.1. TooClose / 0.0 / Targets state 11 (FollowPattern)
2.1. ShouldAttack / 0.0 / Targets state 10 (Attack)
3.1. ShouldSpecialAttack / 0.0 / Targets state 13 (SpecialAttack)
4.1. ShouldFire / 0.0 / Targets state 5 (ProjectileAttack)
5.1. !InRange / 0.0 / Targets state 4 (PathFind)
5.2. Delay / 0.5
6.1. !LineOfSight / 0.0 / Targets state 4 (PathFind)
7.1. Delay / 1.0 / Targets state 19 (TurnAround)
STATE 20. TurnAround
State has 6 triggers
1.1. ShouldSpecialAttack / 0.0 / Targets state 16 (SpecialAttack)
2.1. ShouldFire / 0.0 / Targets state 17 (ProjectileAttack)
3.1. LostInterest / 0.0 / Targets state 6 (TargetPatrol)
4.1. !LineOfSight / 0.0 / Targets state 14 (Approach)
4.2. Delay / 0.5
5.1. !OffLine / 0.0 / Targets state 4 (PathFind)
6.1. Delay / 1.0 / Targets state 20 (TurnAround)
1. Start
2. Patrol
3. Dead
4. PathFind
5. ProjectileAttack
6. TargetPatrol
7. Deactivate
8. Crouch
9. Generate
10. Attack
11. FollowPattern
12. Enraged
13. SpecialAttack
14. Approach
15. Taunt
16. SpecialAttack
17. ProjectileAttack
18. GetUp
19. TurnAround
20. TurnAround
57 triggers
STATE 1. Start
State has 2 triggers
1.1. HasPatrolPath / 0.0 / Targets state 2 (Patrol)
2.1. Default / 0.0 / Targets state 8 (Crouch)
STATE 2. Patrol
State has 1 trigger
1.1. InDetectionRange / 1.0 / Targets state 15 (Taunt)
1.2. SpotPlayer / 0.0
STATE 3. Dead
State has 0 triggers
STATE 4. PathFind
State has 8 triggers
1.1. AggressionCheck / 0.0 / Targets state 12 (Enraged)
2.1. LineOfSight / 0.0 / Targets state 19 (TurnAround)
2.2. InRange / 0.0
3.1. ShouldAttack / 0.0 / Targets state 10 (Attack)
4.1. ShouldSpecialAttack / 0.0 / Targets state 13 (SpecialAttack)
5.1. Leash / 0.0 / Targets state 6 (TargetPatrol)
5.2. !InDetectionRange / 0.5
6.1. OffLine / 0.0 / Targets state 14 (Approach)
7.1. LostInterest / 0.0 / Targets state 6 (TargetPatrol)
8.1. Delay / 1.0 / Targets state 4 (PathFind)
STATE 5. ProjectileAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 19 (TurnAround)
STATE 6. TargetPatrol
State has 5 triggers
1.1. HasPatrolPath / 0.0 / Targets state 2 (Patrol)
1.2. InPosition / 0.0
2.1. InDetectionRange / 0.75 / Targets state 15 (Taunt)
2.2. !LostInterest / 0.0
3.1. InPosition / 0.0 / Targets state 7 (Deactivate)
4.1. Delay / 2.0 / Targets state 6 (TargetPatrol)
5.1. ShotAt / 0.0 / Targets state 4 (PathFind)
STATE 7. Deactivate
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 8 (Crouch)
STATE 8. Crouch
State has 1 trigger
1.1. SpotPlayer / 0.0 / Targets state 9 (Generate)
1.2. InDetectionRange / 0.75
STATE 9. Generate
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 4 (PathFind)
STATE 10. Attack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 11 (FollowPattern)
STATE 11. FollowPattern
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 19 (TurnAround)
STATE 12. Enraged
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 4 (PathFind)
STATE 13. SpecialAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 4 (PathFind)
STATE 14. Approach
State has 6 triggers
1.1. !OffLine / 0.0 / Targets state 4 (PathFind)
1.2. Delay / 1.0
2.1. LineOfSight / 0.0 / Targets state 20 (TurnAround)
2.2. Delay / 1.75
3.1. ShouldSpecialAttack / 0.0 / Targets state 16 (SpecialAttack)
4.1. ShouldFire / 0.0 / Targets state 17 (ProjectileAttack)
5.1. LostInterest / 0.0 / Targets state 6 (TargetPatrol)
6.1. Delay / 2.0 / Targets state 14 (Approach)
STATE 15. Taunt
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 4 (PathFind)
STATE 16. SpecialAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 14 (Approach)
STATE 17. ProjectileAttack
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 14 (Approach)
STATE 18. GetUp
State has 1 trigger
1.1. AnimOver / 0.0 / Targets state 4 (PathFind)
STATE 19. TurnAround
State has 7 triggers
1.1. TooClose / 0.0 / Targets state 11 (FollowPattern)
2.1. ShouldAttack / 0.0 / Targets state 10 (Attack)
3.1. ShouldSpecialAttack / 0.0 / Targets state 13 (SpecialAttack)
4.1. ShouldFire / 0.0 / Targets state 5 (ProjectileAttack)
5.1. !InRange / 0.0 / Targets state 4 (PathFind)
5.2. Delay / 0.5
6.1. !LineOfSight / 0.0 / Targets state 4 (PathFind)
7.1. Delay / 1.0 / Targets state 19 (TurnAround)
STATE 20. TurnAround
State has 6 triggers
1.1. ShouldSpecialAttack / 0.0 / Targets state 16 (SpecialAttack)
2.1. ShouldFire / 0.0 / Targets state 17 (ProjectileAttack)
3.1. LostInterest / 0.0 / Targets state 6 (TargetPatrol)
4.1. !LineOfSight / 0.0 / Targets state 14 (Approach)
4.2. Delay / 0.5
5.1. !OffLine / 0.0 / Targets state 4 (PathFind)
6.1. Delay / 1.0 / Targets state 20 (TurnAround)
Metaree (62c39ad6.AFSM)
Quote:
8 states
1. Start
2. Dead
3. Attack
4. InActive
5. Active
6. Explode
7. InActive
8. Halt
7 triggers
STATE 1. Start
State has 1 trigger
1.1. Default / 0.0 / Targets state 4 (InActive)
STATE 2. Dead
State has 0 triggers
STATE 3. Attack
State has 1 trigger
1.1. TooClose / 0.0 / Targets state 6 (Explode)
STATE 4. InActive
State has 1 trigger
1.1. InRange / 0.0 / Targets state 7 (InActive)
STATE 5. Active
State has 2 triggers
1.1. ShouldAttack / 0.0 / Targets state 8 (Halt)
2.1. TooClose / 0.0 / Targets state 6 (Explode)
STATE 6. Explode
State has 0 triggers
STATE 7. InActive
State has 1 trigger
1.1. Delay / 0.0 / Targets state 5 (Active)
STATE 8. Halt
State has 1 trigger
1.1. FixedDelay / 0.0 / Targets state 3 (Attack)
1. Start
2. Dead
3. Attack
4. InActive
5. Active
6. Explode
7. InActive
8. Halt
7 triggers
STATE 1. Start
State has 1 trigger
1.1. Default / 0.0 / Targets state 4 (InActive)
STATE 2. Dead
State has 0 triggers
STATE 3. Attack
State has 1 trigger
1.1. TooClose / 0.0 / Targets state 6 (Explode)
STATE 4. InActive
State has 1 trigger
1.1. InRange / 0.0 / Targets state 7 (InActive)
STATE 5. Active
State has 2 triggers
1.1. ShouldAttack / 0.0 / Targets state 8 (Halt)
2.1. TooClose / 0.0 / Targets state 6 (Explode)
STATE 6. Explode
State has 0 triggers
STATE 7. InActive
State has 1 trigger
1.1. Delay / 0.0 / Targets state 5 (Active)
STATE 8. Halt
State has 1 trigger
1.1. FixedDelay / 0.0 / Targets state 3 (Attack)
EDIT: So this is all fairly obvious from the names, but I think the way it works is, the enemy always starts from the first state. When one of the trigger conditions is met, it advances to the state pointed to by that trigger. I'm not sure what the extra function names some triggers have is, exactly; best guess is it's multiple conditions that all need to be met before the trigger activates. It looks like some states can trigger on their own - "Dead", for example, never has any triggers pointing to it, so I'm guessing the enemy is forced to that state when their HP drops to 0 regardless of what they're doing.
Haven't experimented too much yet, but I did modify the Metaree's Active state, so ShouldAttack points to Explode instead of Halt. Makes them drop from the ceiling, and then immediately explode. :P Apparently Explode and Dead are actually not the exact same thing; Explode only triggers when you get too close to it (notice in the FSM it's only activated by TooClose triggers), and it makes you take damage regardless of where the Shriekbat actually is in the room, which I found kinda funny.