M25’s AI TACTICS DOCUMENTATION v1.3

Updated for FFX 3.3
by TaskmasterX, with contributions from M25

Note: Some information is also taken from the AI script cheat sheet and m25ai23.htm

 

Contents

 

AI File Structure

Let’s start with the structure of the AI file. It has seven sections: The Hero File Name, Targeting Section, Special Targeting Section, Tactics Section, Subtype Section, Absorber Section and Energy Reserve Section. Make sure to keep the file in the proper format when editing it. The proper tabbing, spelling, and quotations are crucial to being able to load a Rumble Room session with no errors.

 

['airwalker',  #Hero File Name
        ["target enemy",
            'not blind',
            'not flying', #Targeting Section
            'flying',
        ],
        ["special targets",
            "building", "object", "civilian", #Special Targeting Section
        ],
        ["timer", 'auto',
            'TUseRemedy()',
            'TFleeMelee(type="any",subtype="emitting_damage",time=0.88)',
            'TFleeMelee(time=0.88,situation="swarmed",movetype="fly")',
            "TMeleeArea('enhanced strength punch',time=1.4,energy=100,pct=60,subtype='higherhealththan or strongerthan')",
            "TArea('magnetic push',pct=70,energy=33,time=3.5,situation='swarmed')",
            "TArea('light blast',pct=70,time=3.5,energy=33,subtype='not blind',situation='swarmed')",
            "TRanged('geo-force',energy=33,time=2.5,pct=70,subtype=['clustered','not flying'],situation='not flying')",
            "TRanged('geo-force',energy=33,time=2.5,pct=30,situation='not flying',subtype='not flying')", #Tactics Section
            "TRanged('electrical blast',energy=33,time=2.5,pct=30)",
            "TRanged('power cosmic blast',energy=33,time=2.8,pct=30)",
            "TRanged('heat blast',energy=33,time=2.5,pct=30)",
            "TArea('magnetic push',energy=33,time=3.5,pct=30)",
            'TThrow(pickup_time=2.92,throw_time=2.52,mindist=250,maxdist=500,pct=40)',
            "TMelee('punch ',time=1.4,pct=50)",
            'TLand()',
            'TMoveTo(mindist=\'long\',time=0.88,subtype=["not emitting_damage","flying"])',
            'TMoveTo(mindist="melee",subtype=["not emitting_damage","not flying"],time=0.88)',
            'TMoveTo(mindist=\'medium\',maxdist=\'wholemap\',time=0.88,movetype="fly")',
        ],
        ['subtype',
            'sonic', #Subtype Section
            'magnetism',
        ],
        ['absorber',
            'object', #Absorber Section
        ],
        ['energy reserve',
            'low', #Energy Reserve Section
        ],
        ['delay', 0.5],
]

 

Hero File Name

This is obviously where the name of the hero file goes.

Targeting Section

This section is where you use various subtypes to control who the AI attacks. The AI generator automatically puts subtypes of targets that have no protection against the AI’s damage types along with some others depending on the kinds of Powers the character has. I usually remove the weakness subtypes because I like to role-play that the AI shouldn’t know the defences or weakness of their enemies, especially if they never fought before. Instead, I’ll use this for team tactics so Strong characters seek out the “Strong Guy” on the other team and Blasters will seek out other blasters or fliers, etc. In the Tactics Section you can specify for each power any subtype you want to use the Power on.

Special Targeting Section

This section is optional and must be added by hand.  You can currently put three different keywords here.  ‘civilians’ allows the character to attack civilians, ‘objects’ allows the character to attack objects, and ‘buildings’ allows the character to attack buildings.  The character treats these things as enemies and any tactics that target enemies will automatically get used against the special targets as well.  For example, if you have a giant monster that should stomp on buildings, add [‘special targets’, ‘buildings’], to its AI definition.

Subtype Section

This section is not created by the AI Generator (so you’ll have to add it yourself) but was part of the AI scripts in FF1 and I confirmed with M25 that it works in the AI scripts for FFvTTR. This section is invaluable for specifying subtype(s) (either from the Subtype/Situation List at the end of this document or created by you, like ‘mystic’, ‘robot’, etc.,) to characters. Assign a character the subtype ‘metal’ and they don’t even have to be made of the Metal Material to be targeted by tactics that work only on Metal characters, like a tactic using the Magnetic attribute!

Tactics Section

This is the main section where you control what powers the AI uses and when. This is where you do a majority of editing the AI. See the Tactics Chapter below for a list of available tactics along with their default parameters.

Absorber Section

This section is created by the AI generator. If the character has the Absorber attribute then it will add a section here. The default value is ‘object’. This setting allows the character to target objects as well as enemies to use his/her Absorption power on. You can change this to ‘enemy’ or ‘friend’ if you want the character to only use the power on Enemies or Allies and not on Objects. This section has become obsolete due to both the new Absorber Attributes and the new Special Targeting Section, mentioned above and will probably be removed in future versions of FFX.

Energy Reserve Section

This section is created by the AI Generator to tell the character to wait until they have the designated amount of Energy (low, medium, or high) before using a tactic that requires energy. It’s usually set to the character’s Power with the highest Energy Cost. Without this section, the AI will use tactic after tactic, depleting their energy, and never have enough Energy to use the tactic(s) that require a higher energy cost. The only problem with this is that you’ll find some characters run around a lot and don’t use tactics they have enough Energy for simply because they’re waiting for their Energy to recharge to the level designated. It’s less noticeable for characters with high Energy stats, more noticeable with characters with low Energy stats. I found that you can have more control by using the Tactics section to control how the character uses their Energy.

Example: Let’s say you have a character with a few powers that cost no energy, a few that cost low energy, and one that costs high energy. When you run the character through the AI Generator you may get the Energy Reserve section with the setting at ‘high’. The character will wait to use any of the low energy cost powers until their Energy is fully recharged which can seem like an eternity if the character has a low Energy stat. Now, most of the time a character with a high energy cost power never uses that power randomly as the AI would, but uses it for a specific purpose or when the character is in dire straits. So, what you can do is lower the Energy Reserve to ‘medium’ or ‘low’ so they’ll use the low cost powers more often but when the character gets in a situation where they should use the high cost power and they don’t have enough energy, have a tactic created that costs no energy, place it below the tactic line of the high energy cost tactic, give it a higher priority than the tactics that cost low energy, and give it the same situation or subtype as the high energy cost tactic plus add lowerenergy 100 in the situation.

Like this:

"TActiveDefense('force field', pct=90, energy=100, mindist=0, maxdist=300,time=2.12, situation='lowerhealthpct 25')",
'TFleeMelee(pct=90, mindist=0, maxdist=300, situation=["lowerhealthpct 25","lowerenergy 100"],priority=100)', 

When this character is low on health he’ll try to use his force field. If he doesn’t have enough energy he’ll try to flee. When he has enough energy he’ll use the active defence. Since the priority and pct are so high and his situation is still met (unless he is healed or can regenerate) he won’t use any other tactic that might lower his energy and not allow him to use the active defence.

"TArea('nova blast', time=3.5, pct=80, energy=100, situation=['swarmed ', 'lowerhealthpct 25', 'not nearfriend'] )",
'TFleeMelee(pct=90, mindist=0, maxdist=200, situation=["swarmed","lowerhealthpct 25","not nearfriend","lowerenergy 100"], priority=100)',

When this character is low on health, swarmed and not near any allies, he’ll try using his nova blast area attack. If he doesn’t have enough energy then he’ll take to the air until he does have enough energy to use the power.

Delay Section

The delay controls how long the AI waits in between actions, that is, from the time it completes one action to the time it starts another. If you want an individual AI to run more quickly, or more slowly than other AIís, then set the delay. The standard setting is one-half second (0.5), but this can be set as low as 0.1 seconds or as high as you want (2 seconds is a good upper limit).

 

Tactics

Rules for Creating Your Own Tactics

The first thing in the Tactic line after the opening quotes is the tactic name (TMelee, TRanged, etc.). Then the tactic parameters in parentheses come after the tactic name, followed by closing quotes and a comma. For Power Tactics, the first parameter is always the name of the power. Some parameters have a numeric value only, such as Pct and Time. Others can have either a numeric value or a word. When using a word keep in mind that if a tactic line starts and ends with a double quote (") then the parameter values that are words, not numbers, should be in single quotes ('). If the line begins and ends with a single quote (') then the opposite should happen with the parameter values. Examples:

'TFleeMelee(time=0.88, situation="swarmed", movetype="fly")', « Correct

'TFleeMelee(time=0.88, situation='swarmed', movetype='fly')', « Incorrect

"TMeleeArea('enhanced strength punch', time=1.4, situation='chargedup')", « Correct

"TMeleeArea("enhanced strength punch", time=1.4, situation="chargedup")", « Incorrect

You may also see this: a word value between backslashes and single quotes: maxdist=\'long\' you can use that format regardless of what quotations are at the beginning and end of the line.

 

AI Tactic Selection Process

Knowing the step by step process in how a tactic is selected by the AI can help in creating better AI scripts.  The AI now internally sorts tactics by range and energy usage so that it doesn’t need to check them all every time.  However, the order you specify in the tactics list is still important, since tactics at the top of the list will still be checked first (if they are within range).  Once a tactic has been chosen by the AI, it either waits for the amount of time specified in the ‘time’ parameter or waits for the character to enter an idle animation.  Once one of these things happens, the AI restarts and checks its tactics again.

 

Rules to Remember

  1. If you choose to use all the default parameters for a tactic then you don’t need to type them out in the AI file.
    Example: "TFleeMelee()",
  2. Remember that Power Tactics will always at least require the power name.
    Example: "TActiveDefense('force field')",
  3. You only need to type the parameters you want to change from the default setting.
    Example: "TFleeMelee(subtype='higherstrengththan')",
  4. Parameters that have a default value of None (it has to be None, not 'none') automatically get assigned values. The AI will read the appropriate hero file or character.dat file and fill in the range/energy cost/etc. for you so that you don’t have to do it (and you can change the value in the hero file without having to update the AI!)

 

Parameters

The following is the list of parameters and a description of each.

Power Name: the name of the power to use. Remember, proper spelling AND spacing is crucial. If the name of your Power has a space after it in the hero file. Then the “power name” parameter needs to have the space or you will get an error ("cosmic power blast "). Or, you can just edit the hero file and delete the space. This is the only parameter for a Power Tactic that doesn’t have a default value. Movement and FFX tactics don’t have power name parameters.

Pct: the percentage chance to use the tactic (0-100).

Time: the amount of time the tactic takes to use in seconds. This is usually the Power’s animation time for that mesh. If the character uses a power and you see the FX but not the effect of the power it may be that the FX has a delay. If you increase the time by another 1 -2 seconds the character will wait until the delay is finished and the effects of the Power will be seen. For Movement tactics, you can change the time the character spends moving. Increase the time for slow characters or they won’t spend a lot of time on the tactic and therefore not get very far. Decrease the time for fast characters if they seem to fly to the opposite side of the map.

Energy: the amount of energy required to use this tactic.  The energy will be deducted from the character if the tactic is used.

Mindist: the minimum distance away an enemy must be before the character will use this tactic or minimum distance character will move. The value can be either a number or word. Check the Tactic Distances list below to see what you can use instead of numbers.

Maxdist: the maximum distance away an enemy can be before the character will use this tactic or maximum distance character will move. The value can be either a number or word. Check the Tactic Distances list below to see what you can use instead of numbers.

Type: who to use the tactic on. There are three choices: ‘enemy’ for enemies and ‘friend’ for allies. Use ‘any’ to use the tactic on anyone, including objects, like cars and trees.

Subtype: any other conditions the target must meet.  For example, you can set the subtype to ‘metal’ so that a tactic is only used on enemies that are made of metal. See the Subtypes/Situations list below.

Radius: the radius of explosive ranged powers. Used to prevent a character or his allies from being hit by friendly fire. 

Situation: any conditions that apply to the character using the tactic. For example, setting the situation to swarmed means that the tactic will only be used if the character is surrounded by two or more enemies. See the Subtypes/Situations list below.

Priority: using higher numbers here means that the tactic has a higher priority.  A high priority tactic can interrupt a low priority one.  For example, when a bunch of thugs start shooting at Mentor, he should raise his shields instead of trying to pound the nearest thug with a psychic-slash. The defense tactic to raise his shields has a higher priority. The value can be either a number or word. Check the Tactic Priority list below to see what you can use instead of numbers.

Role: an additional parameter that you can specify to decide when to use a tactic.  For example you might assign the role of ‘healer’ to a character when in a group, or ‘combat’ when not in a group and have tactics that are appropriate to each of those roles.

Overpower: if set to 1, then the game checks to see if the character has the energy to overpower their attack (they have full energy and are using a medium energy attack for example). If they don’t have the energy, then the power will not be overpowered. If set to 0, then the game will not make the overpower check and the power will be used at the normal level.

 

Tactic Constants

Tactic Distances

outofrange = 1000000
wholemap = 1000000
infinite = 1000000
visible = 400
long = 300
medium = 200
short = 100
melee = 50
area_small = 60
area_medium = 90
area_large = 120
area_extreme = 150
area_overpower = 300
cone_narrow = 20
cone_medium = 40
cone_wide = 60
cone_extreme = 80

Tactic Priority

low = 20
medium = 50
high = 100
critical = 1000

Tactic Percentages

always = 100
high = 80
medium = 60
low = 40
verylow = 20

 

Tactics List & Descriptions

The following is the list of Tactics with their default parameters and a description of each.

 

Active Defense Powers

"TActiveDefense('power name', pct=80, time=3, energy=None, mindist=0, maxdist='long', type='enemy', subtype='none', situation='not displaced', role='none', priority='high', defense_time=None)",

Use an active defense if an enemy is within mindist and maxdist away. The defense_time is how long the defense stays up.

 

"TActiveDefenseRemote('power name', pct=50, time=1, energy=0, mindist=0, maxdist='long', type='friend', subtype='none', situation='none', role='none', priority='high', defense_time=20, threat_situation='none', threat_subtype='none', threat_reaction='enemy')",

Use an active defense with the “Remote Use” option. Threat_situation is the situation of the ally. Threat_subtype is the subtype of the enemy attacking the ally.

 

Area Powers

"TArea('power name', pct=40, time=3, energy=None, mindist=0, maxdist=None, type='enemy', subtype='none', situation='not nearally', role='none', priority='medium')",

Perform an area attack if an enemy is within range (maxdist) and no friendly characters are within range – no friendly fire. You can set the type to ‘friend’ and it will only use the tactic if a friend is within range, and no enemies.

 

Direct Powers

"TDirect('power name', pct=60, time=3, energy=None, mindist=0, maxdist=None, type='enemy', subtype='none', situation='not blind', role=None, priority='medium', overpower=1)",

Use a direct attack upon an enemy within range.

 

"TDirectExplosive('power name', pct=60, time=3, energy=None, mindist=0, maxdist=None, type='enemy', subtype='none', situation='not blind', role='none', priority='medium', overpower=1)",

Use a direct attack upon an enemy within range.

 

Melee Powerss

"TMelee('power name', pct=60, time=3, energy=None, mindist=None, maxdist=None, type='enemy', subtype='not flying', situation='none', role='none', priority='medium', overpower=1)",

Use a melee attack on a target.

 

"TMeleeArea('power name', pct=60, time=3, energy=None, mindist=None, maxdist=None, type='enemy', subtype='not flying', situation='not nearally 100', role='none', priority='medium', overpower=1)",

Use a melee attack with arc if there are 2 or more enemies within range, and no friendlies in range.

 

"TMeleeAir('power  name', pct=60, time=3, energy=None, mindist=None, maxdist=None, type='enemy', subtype='flying', situation='none', role='none', priority='medium', overpower=1)",

If an enemy is flying, then use a melee attack on them. Note that the melee attack supplied must have the Melee: Airborn Targets Only flag checked within the editor. You can use TMeleeAir as it does the same thing as this tactic.

 

Ranged Powers

"TRanged('power name', pct=60, time=3, energy=None, mindist=50, maxdist=None, type='enemy', subtype='none', situation='not blind', role='none', priority='medium', overpower=1)",

Use a ranged attack on an enemy between mindist and maxdist away. You can use TRangedAttack as it does the same thing as this tactic.

 

"TRangedCone('power name', pct=60, time=3, energy=None, mindist=50, maxdist=None, radius=None, type='enemy', subtype='not nearenemy 100', situation='not blind', role='none', priority='medium', overpower=1)",

Use a ranged cone attack on an enemy between mindist and maxdist away. Set the radius to the width of the cone.

 

"TRangedExplosive('power name', pct=60, time=3, energy=None, mindist=50, maxdist=None, radius=None, type='enemy', subtype='none', situation='none', role='none', priority='medium', overpower=1)",

Use a ranged attack that explodes when it hits. The character will try to ensure that no friendlies are within range of the explosion. Set the radius to the size of the explosion.

 

Special Powers

"TAfterburner('power name', pct=60, time=0.5, energy=None, mindist=0, maxdist=None, type='enemy', subtype='none', situation='not displaced', role='none', priority='medium', overpower=1)",

Use the Afterburner Power.

 

"TChargeUp('power name', pct=60, time=3, energy=None, mindist=0, maxdist='melee', type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use a charge-up power (think Minute Man’s 300 Percenter) if not already charged-up.

 

"TCloak('power name', pct=60, time=3, energy=None, mindist=0, maxdist='long', type='enemy', subtype='none', situation='not invisible', role='none', priority='medium')",

Turn invisible.

 

"TUncloak('power name', pct=50, time=3, energy=None, mindist=0, maxdist='melee', type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Turn visible.

 

"TCloneSelf('power name', pct=100, time=3, energy=None, mindist=0, maxdist='visible', situation='none', role='none', priority='high', maxclones=4, clone_can_clone=0)",

Use a cloning power. After the power is used, find the clone and make sure it has all of the proper proper internal values set. This is used to make sure the clone is put on the right AI ‘team’ and gets the proper custom AI if there is one defined. The maxclones parameter is used to tell the maximum amount of clones to create and clone_can_clone can be set to 1 to enable the clones to clone themselves!

 

"TCloneTarget('power name', pct=60, time=3, energy=None, mindist=0, maxdist='long', type='enemy', subtype='none', situation='not blind', role='none', priority='high')",

Creates an ally clone of the target.

 

"TDecoy('power name', pct=60, time=3, energy=None, mindist=0, maxdist=None, radius=150, type='enemy', subtype='none', situation=["not blind", "not neardecoy"], role='none', priority='high')",

Use the limey lure power.

 

"TDisplaceImage('power name', pct=60, time=3, energy=None, mindist=0, maxdist=400, type='enemy', subtype='none', situation='not displaced', role='none', priority='low')",

If an enemy is between mindist and maxdist away, use the Displace Image power.

 

"TElectrify('power name', pct=60, time=3, energy=None, mindist=50, maxdist=300, type='enemy', subtype=["not nearenemy 100", "not flying"], situation='not blind', role='none', priority='medium')",

Use the Electrify Power.

 

"TEmpathy('power name', pct=60, time=3, energy=None, mindist=0, maxdist=400, type='enemy', subtype='none', situation='not empathy', role='none', priority='medium')",

For use with empathy powers.  Use empathy but only if empathy isn’t already in use.

 

"TLivingFires('power name', pct=60, time=3, energy=None, mindist=0, maxdist='visible', type='enemy', subtype='not flying', situation='none', role='none', priority='medium')",

Use the Living Fire Power.

 

"TSonicBoom('power name', pct=60, time=4, energy=None, mindist=0, maxdist=None, radius=120, type='enemy', subtype='none', situation='not nearally 120', role='none', priority=medium)",

Use the Sonic Boom Power.

 

"TSpeedingBullet('power name', pct=60, time=0.75, energy=None, mindist=50, maxdist=None, type='enemy', subtype=["not nearenemy 80","not flying"], situation='not blind', role='none', priority='medium')",

Use the speeding bullet power to attack an enemy within range.

 

"TSprint('power name', pct=60, time=0.75, energy=None, mindist='melee', maxdist=None, type='enemy', subtype='none', situation='not blind', role='none', priority='medium')",

Sprint to someone between mindist and maxdist away. The type sets who to move to, either a ‘friend’ or an ‘enemy’.

 

"TSprintAway('power name', pct=60, time=0.75, energy=None, mindist='melee', maxdist=None, situation='none', role='none', priority='medium', objectdist='short')",

Use the sprint power to get out of the way of an attack.  It works well for defence against projectile attacks, area attacks or multiple contact melee attacks.

 

"TTeleport('power name', pct=60, time=5, energy=None, mindist='melee', maxdist=None, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Teleport to enemies more than mindist but not more than maxdist away.

 

"TTeleportAway('power name', pct=80, time=5, energy=None, mindist='melee', maxdist=None, type='enemy', subtype='none', situation='none', role='none', priority='medium', objectdist='short')",

Teleport away from enemies within mindist, to an object not more than maxdist away.

 

"TTumble('power name', pct=60, time=5, energy=None, mindist='melee', maxdist=None, type='enemy', subtype='not flying', situation='not blind', role='none', priority='medium')",

Use a tumble power to move to an enemy more than mindist, but not more than maxdist away.

 

"TTumbleAway('power name', pct=60, time=2, energy=None, mindist='melee', maxdist=None, type='enemy', subtype='none', situation='none', role='none', priority='medium', objectdist='short')",

If an enemy comes within mindist, tumble to an object not more than maxdist away.

 

"TTunnelTravel('power name', pct=60, time=5, energy=None, mindist='melee', maxdist=None, type='enemy', subtype='not flying', situation='none', role='none', priority='medium')",

Tunnel Travel to enemies more than mindist but not more than maxdist away.

 

"TTunnelTravelAway('power name', pct=60, time=2, energy=None, mindist='melee', maxdist=None, type='enemy', subtype='none', situation='none', role='none', priority='medium', objectdist='short')",

Tunnel Travel away from enemies within mindist, to an object not more than maxdist away.

 

Other Powers

"TAnimateDead('animate dead', pct=100, time=3, energy=None, mindist=0, maxdist=150, type='enemy', radius=120, subtype='lowerhealthpct 25', situation='none', role='none', priority='medium', overpower=1)",

Use an area Animate Dead Power. It seems that the AI can't use the power in the hero file, but can only use an Animate Dead Power in FFEdit called 'animate dead'.

 

"TDisruptObject('power name', pct=60, time=3, energy=None, mindist=100, maxdist=None, type='enemy', radius=120, subtype='not nearenemy 80', situation='not blind', role='none', priority='medium', overpower=1)",

Use a disrupt object or ignite power on an object within radius distance of an enemy. In other words – see enemy, find nearby object, blow up object.

 

"TPolymorph('power name', pct=60, time=3, energy=None, mindist=50, maxdist=None, type='enemy', subtype='none', situation='not blind', role='none', priority='medium')",

Polymorph an enemy.

 

"TPossession('power name', pct=60, time=3, energy=None, mindist=0, maxdist=None, type='enemy', subtype='not alone', situation='not blind', role='none', priority='medium', overpower=1)",

Use the Possession Power on a target.

 

"TRally('power name', pct=60, time=3, energy=None, mindist=0, maxdist=50, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use the Rally Power.

 

"TSelfHeal('power name', pct=60, time=3, energy=None, mindist=0, maxdist=400, type=’enemy’, subtype='none', situation='lowerhealthpct 40', role='none', priority='medium')",

Use this tactic for your FFX Self-Heal State Swap.

 

Movement

"TAirSuperiority(pct=100, time=1, mindist=0, maxdist=100, type='enemy', subtype='none', situation='not flying', role='none', priority=low)",

If an enemy is within maxdist, then hover in the air (get off of the ground).

 

"TDodgeMissiles(pct=100, time=1, energy=0, mindist=60, maxdist=200, type='enemy', subtype='none', situation='none', role='none', priority='high')",

If an enemy within mindist and maxdist away and is firing projectiles then flee to a point up to maxdist away.

 

"TFleeMelee(pct=60, time=0.5,energy=0, mindist=50, maxdist=200, subtype='none', situation='none', role='none', priority=50, movetype=None)",

If an enemy gets within mindist, then try to move away to a point not further away than maxdist.

 

"TLand(pct=100, time=2, energy=0, mindist=0, maxdist='short', type='enemy', subtype='none', situation='flying', role='none', priority='low')",

If flying, land if an enemy is between mindist and maxdist away.

 

"TMoveTo(pct=100, time=2, mindist=0, maxdist=400, type='enemy', subtype='none', situation='none', role='none', priority='low', movetype=None)",

Move to someone between mindist and maxdist away. The type sets who to move to, either a ‘friend’ or an ‘enemy’.

 

"TRandMove(pct=50, time=1, mindist='long', maxdist='wholemap ', subtype='none', situation='none', role='none', priority='low', movetype=None)",

Move to a random point between mindist and maxdist away.

 

Other Tactics

"TUseRemedy(time=3, situation='lowerhealthpct 20', role='none', priority='high')",

Use a hero point when Health falls below 20%.

"TThrow(pct=60, time=1, mindist=0, maxdist='long', type='enemy', subtype='not nearenemy 80', situation='none', role='none', priority=21, objdist=400, mode='move', pickup_time=5, throw_time=5)",

Pickup and throw objects at enemies between mindist and maxdist away. Move towards objects that can be thrown if they are not more than objdist away.

 

FFX Powers

"TAbsorb<MATERIAL NAME>(pct=50, time=3, energy=33, mindist=0, maxdist=100, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Absorb the properties of an object. The new Material and Energy Absorber attributes use different tactics now that objects can have more than one material. Each material has its own tactic. TAbsorbMetal absorbs metal while TAbsorbElectricity absorbs the electrical properties. When you run the Absorber though the M25 AI Generator, all the Absorber tactics for each material will be put in the m25ai file.

 

"TAbsorbPowers(pct=50, time=1, energy=33, mindist=0, maxdist=100, type='enemy', subtype=['not nulled','not stunned'], situation='none', role='none', priority='medium')"

Absorbs (or steals) the powers from a target

 

"TAbsorber(pct=50, time=3, energy=33, mindist=0, maxdist=100, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Absorb the properties of nearby objects.

 

"TAddAllies(pct=60, time=1, energy=0, mindist=0, maxdist=200, type='friend', subtype='none', situation='not tpallies', role='none', priority='medium')",

Adds Allies for Group Teleporter.

 

"TAddFoes(pct=60, time=1, energy=0, mindist=0, maxdist=200, type='friend', subtype='none', situation='not tpfoes', role='none', priority='medium')",

Adds Foes for Group Teleporter.

 

TAmplify(pct=50, time=3, energy=33, mindist=0, maxdist=100, type='enemy', subtype='none', situation='none', role='none', priority='medium')

Use the Amplifier Attribute on a target.

 

"TActiveDefenseFFRemote(pct=50, time=3, energy=33, mindist=0, maxdist=200, type='friend', subtype='not active_defense', situation='none', role='none', priority='medium')",

Use the FF Active Defense Remotely on an ally.

 

"TActiveDefenseFFSelf(pct=100, time=3, energy=33, mindist=0, maxdist=400, type='enemy', subtype='none', situation='not active_defense', role='none', priority='medium')",

Use the FF Active Defense on yourself.

 

"TAntiWarZone(pct=80, time=2, energy=33, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='high')",

Turn projectiles into flower petals. Turn on the anti-war zone field if it isn’t already on.

 

"TAstralForm(pct=50, time=1.5, energy=33, mindist=100, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Re-merge the Astral Form to the character.

 

"TAstralProjection(pct=50, time=1.5, energy=33, mindist=200, maxdist=500, subtype='none', situation='none', role='none', priority='medium')",

Go into a stun state and summon forth the character's Astral Form.

 

"TBlazingGlory(pct=60, time=1.5, energy=0, mindist=0, maxdist=100, type='enemy', subtype='none', situation= ['higherhealth 30', 'alone 100'], role='none', priority='medium')",

Use the Blazing Glory Attribute.

 

"TBulkTeleporter(pct=60, time=5, energy=33, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use the Bulk Teleporter Attribute.

 

"TDeflectMissiles(pct=60, time=5, energy=33, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

If an enemy within mindist and maxdist away and is firing projectiles then use the FF Active Defense.

 

"TEarthSpike(pct=50, time=3, energy=33, mindist=100, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Throw up an earth spike beneath an enemy.

 

"TEarthWall(pct=10, time=3, energy=33, mindist=60, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Put up an earth wall between you and the enemy.

 

"TEnergyShield(pct=80, time=3, energy=33, mindist=0, maxdist=400, type='enemy', subtype='none', situation='none', role='none', priority='high')",

Put up an energy shield, if the energy shield is not already in place.

 

"TEnvControlGlobal(pct=50, time=3, energy=50, mindist=50, maxdist=100, radius=100, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Global environmental control.

 

"TEnvControlLocal(pct=50, time=3, energy=50, mindist=50, maxdist=300, radius=50, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Local environmental control.

 

"TExplosive(pct=50, time=3, energy=33, mindist=0, maxdist=80, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use the explosive attribute.

 

"TFireWall(pct=50, time=3, energy=33, mindist=60, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Create a wall of fire.

 

"TFreeSpirit(pct=60, time=3, energy=33, mindist=0, maxdist=400, type='enemy', subtype='none', situation='alone', role='none', priority='medium')",

Seperates the Host and Spirit.

 

"TGaseousForm(pct=60, time=3, energy=33, mindist=0, maxdist=300, type='enemy', subtype='none', situation= 'alone 100', role='none', priority='medium')",

Use a gaseous form if an enemy is within maxdist away.  Power determines the power to use.

 

"TGravityWell(pct=60, time=3, energy=33, mindist=0, maxdist=200, type='enemy', subtype='none', situation='alone 100', role='none', priority='medium')",

Use the Gravity Well Power used by Mutator. This tactic isn’t added to the ms5ai file by the AI Generator and was created for the AI to use the power when they acquire it if they have Mutator, Random Mutation, or Absorb Powers. But you can add this tactic in a m25ai file if you’d like a char to use it without having any of these attributes.

 

"THumanTop(pct=60, time=3, energy=33, mindist=0, maxdist=300, type='enemy', subtype='none', situation='alone 100', role='none', priority='medium')",

Use the Human Top attribute.

 

"TIceCloud(pct=60, time=3, energy=33, mindist=0, maxdist=300, type='enemy', subtype='not frozen', situation='alone 100', role='none', priority='medium')",

Turn into an ice cloud.

 

"TIcePatch(pct=20, time=3, energy=33, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Lay down a patch of ice.

 

TIceWall(pct=10, time=3, energy=33, mindist=60, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Put up a wall of ice.

 

"TIllusionist(pct=30, time=3, energy=33, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use the illusionist attribute.

 

"TInnerBeing(pct=60, time=3, energy=33, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use the inner being attribute.

 

"TLivingLaser(pct=50, time=3, energy=33, mindist=80, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use living laser to move to an enemy more than mindist, but less than maxdist away.

 

"TLivingLaserAway(pct=50, time=3, energy=50, mindist=80, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='high', objectdist=300)",

Use living laser to move to away from an enemy to an object no more than maxdist away if the enemy gets within mindist.

 

"TLoner(pct=50, time=3, energy=0, mindist=120, maxdist=300, type='friend', subtype='none', situation='none', role='none', priority='medium', movetype='move')”,

Move away from allies to prevent the negative effects of this Attribute and gain the positive effects.

 

"TMagneticAttract(pct=50, time=3, energy=33, mindist=40, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use magnetic powers to attract metal characters.

 

"TMagneticRepel(pct=50, time=3, energy=33, mindist=40, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use magnetic powers to repel metal characters.

 

"TMagneticCustom(pct=50, time=3, energy=33, mindist=40, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Uses the additional custom power for the Magnetic Attribute.

 

"TMassControl(pct=80, time=0.5, energy=33, mindist=0, maxdist='wholemap', type='enemy', subtype='none', situation='none', role='none', priority='high')",

Use mass control.  Become light if the enemy is far away, become heavy if they are close.

 

"TMegaBlast(pct=60, time=3, energy=0, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Uses the MegaBlast Attribute.

 

"TPhaseOut(pct=50, time=1, energy=0, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Morph into the the character's Phased Form

 

"TPhaseIn(pct=50, time=1, energy=0, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium', form=None)",

Morph back into the the character's Original, non-Phased Form. Put the name of the template or hero file in the form="" parameter.

 

"TPhaseDisrupt(pct=50, time=1, energy=0, mindist=0, maxdist=100, type='enemy', subtype='robot or computer or hitech', situation='none', role='none', priority='medium')",

Use the Disrupt Electronics Power on a character with 'robot', 'computer' or 'hitech' in their m25ai subtype

 

"TPlasmaSculptorBarrier(pct=10, time=3, energy=33, mindist=100, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use plasma sculptor to form a barrier in front of an enemy.

 

"TPlasmaSculptorDrop(pct=50, time=3, energy=33, mindist=50, maxdist=200, radius=50, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use plasma sculptor to drop an object on an enemy.

 

"TPowerReserveStr(pct=30, time=1, energy=66, mindist=0, maxdist=200, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use the Power Reserve Attribute to Boost Strength.

 

"TPowerReserveAgl(pct=30, time=1, energy=66, mindist=0, maxdist=200, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use the Power Reserve Attribute to Boost Agility.

 

"TPowerReserveSpd(pct=30, time=1, energy=66, mindist=0, maxdist=200, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use the Power Reserve Attribute to Boost Speed.

 

"TPowerReserveEnd(pct=30, time=1, energy=66, mindist=0, maxdist=200, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use the Power Reserve Attribute to Boost Endurance.

 

"TPowerReservePwr(pct=30, time=1, energy=66, mindist=0, maxdist=200, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use the Power Reserve Attribute to Boost Powers.

 

"TPowerReserveRes(pct=30, time=1, energy=66, mindist=0, maxdist=200, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use the Power Reserve Attribute to Boost Resistance.

 

"TPuppetMasterNature(pct=60, time=3, energy=33, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Animate nature objects.

 

"TPuppetMasterUrban(pct=60, time=3, energy=33, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Animate urban objects.

 

"TRealityManipulationChaos(pct=60, time=3, energy=66, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use the Chaos version of the Reality Manipulation Attribute.

 

"TRemoveAllies(pct=60, time=1, energy=0, mindist=0, maxdist=200, type='friend', subtype='none', situation='tpallies', role='none', priority='medium')",

Remove Allies from Group Teleport.

 

"TRemoveFoes(pct=60, time=1, energy=0, mindist=0, maxdist=200, type='enemy', subtype='none', situation='tpfoes', role='none', priority='medium')",

Remove Foes from Group Teleport.

 

"TRealityManipulationOrderSwarmed(pct=60, time=3, energy=66, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use the Order version of the Reality Manipulation Attribute if surrounded by 2 or more enemies.

 

"TRealityManipulationOrderFriend(pct=60, time=3, energy=66, mindist=0, maxdist=300, type='friend', subtype='none', situation='lowerhealth 20', role='none', priority='medium')",

Use the Order version of the Reality Manipulation Attribute when a friend is nearby.

 

"TSandstorm(pct=60, time=3, energy=33, mindist=0, maxdist=300, type='enemy', subtype='none', situation='alone 100', role='none', priority='medium')",

Turn into a sandstorm.

 

"TShapeShift(pct=40, time=5, energy=33, mindist=0, maxdist='wholemap', type='enemy', subtype='none', situation='none', role='none', priority='medium', form=None)",

Use the Shapeshift Attribute. Use the form parameter to define what form from the character’s list to change into.

 

"TStudyTarget(pct=60, time=5, energy=0, mindist=0, maxdist=300, type='enemy', subtype='not in_database', situation='none', role='none', priority='medium', form=None)",

Use the Battle Computer to study a target. The AI will always place the new entry in the 5th slot.

 

"TSummon(pct=60, time=3, energy=67, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium', creature=None)",

Use the summon attribute.  The creature parameter is used to specify what they summon from their list.

 

"TSuperLeap(pct=50, time=2, energy=0, mindist=100, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Leap to an enemy.

 

"TSuperLeapAway(pct=50, time=1.5, energy=0, mindist=100, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='high', objectdist=100)",

Leap away from an enemy.

 

"TTimeSlow(pct=60, time=3, energy=66, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Slows the world down significantly, while you alone still move at a normal speed, attacking as required.

 

"TTimeTravel(pct=60, time=3, energy=66, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='medium')",

Use the Time Travel attribute to travel into the future.

 

"TTempInvulnerability(pct=60, time=3, energy=66, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority='high')",

Use the Temporary Invulnerability attribute.

 

"TTrickShot(pct=60, time=2, energy=0, mindist=0, maxdist=300, type='enemy', subtype=None, situation=None, role=None, priority='medium', items=None) ",

TTrickShot accept a parameter called items which is a list of the items to use. Items can be any of the following: ['ffx_arrow_bomb','ffx_arrow_smoke','ffx_arrow_net','ffx_arrow_punch','ffx_arrow_boomerang','ffx_arrow_tranq']

 

If items is not specified, the AI will choose three items at random.

 

"TTK(pct=60, time=3, energy=33, mindist=0, maxdist=300, type='enemy', subtype='none', situation='none', role='none', priority=medium)",

Use telekinesis powers. Also used by characters with Magnetic and Earth Control Attributes to lift either metal or stone objects respectively.

 

"TTKGroupFlight(pct=60, time=1, energy=0, mindist=0, maxdist=150, type='friend', subtype='none', situation='none', role='none', priority=medium)",

Use the Group Flight Power.

 

"TTKGroupLand(pct=80, time=1, energy=0, mindist=0, maxdist=300, type='friend', subtype='none', situation='none', role='none', priority=medium)",

Land the group of allies from Group Flight.

 

"TUtilityBelt(pct=60, time=3, energy=0, mindist=0, maxdist=300, type='enemy', subtype=None, situation=None, role=None, priority='medium', items=None) ",

TUtilityBelt accept a parameter called items which is a list of the items to use.  For UtilityBelt items can be any of the following: ['bomb','mine','medpack','tracker','laser','cuffs']

 

If items is not specified, the AI will choose three items at random.

 

"TWeatherControlHail(pct=60, time=3, energy=66, mindist=0, maxdist=300, type='enemy', subtype='none', situation='alone 100', role='none', priority='medium')",

Call down hail if an enemy is between mindist and maxdist away.

 

"TWeatherControlLightning(pct=50, time=3, energy=66, mindist=0, maxdist=300, type='enemy', subtype='none', situation='alone 100', role='none', priority='medium')",

Call down lightning if an enemy is between mindist and maxdist away.

 

"TWeatherControlRain(pct=60, time=3, energy=66, mindist=0, maxdist=300, type='enemy', subtype='none', situation='alone', role='none', priority='medium')",

Call down monsoon rains.

 

Subtypes/Situations Rules

There are two ways to do subtypes and situations:

  1. subtype='higherstrength 5 or resistant_crushing or resistant_piercing'
    This means use the tactic if the target meets ANY of the specified subtypes.
    subtype=['higherstrength 5', 'resistant_crushing', 'resistant_piercing']
    This means use the tactic if the target meets ALL of the specified subtypes.
  2. The two ways of writing subtypes can be combined.
    Subtype = [‘metal or stone’, ‘flying’]
    This means the target must be made of metal or stone and must be flying.
  3. ‘not’ can be added in front of any subtype.
    subtype = [‘not higherhealthan or not higherstrengththan’, ‘not flying’]
    This means the target must not have more health than the current character, must not be stronger than the current character and must not be flying.
  4. The ’not’ has to be added in front of every subtype you want negated.
    subtype = [‘not higherhealththan or higherstrengththan’, ‘not flying’]
    This is not the same as the above. (it says the target must not have more health, or must be stronger and not flying.)
  5. Follow the same rules for doing Situations as you do for Subtypes.

 

Subtypes/Situations List

The following is the list of subtype and situations that you can use along with their descriptions. See the New Subtypes page for a list of new or updated subtypes.