Horizon's Gate

Horizon's Gate

45 ratings
Basic Modding Guide
By Rad Codex
This guide covers the basics of modding Horizon's Gate, allowing creation of zones, ports, item types, races, classes, and more.

PLEASE READ THE DISCLAIMER BEFORE MODDING! Mod at your own risk!
3
4
   
Award
Favorite
Favorited
Unfavorite
DISCLAIMER
WARNING : Mod support for Horizon's Gate is always a work in progress!

Mods are generally safe to install and uninstall, but it is entirely possible to corrupt your game data or save data by creating or installing mods! In these instances, you may be forced to reinstall the game! Back up your save files, and mod at your own risk!
Intro, Filepaths, Console Commands
Welcome to a brief guide to modding Horizon's Gate! This guide is not comprehensive, but should explain enough to start making most kinds of content for HG. Please feel free to make your own guides with more thorough detail!

First: there are two important folder locations for modding.
The Mods directory is at
X:\Users\Username\AppData\Roaming\BoatTactics\Mods
and can be easily accessed by pressing the small folder button in the top left of the Save/Load menu. When making a new mod, make a new folder here and put your files in it.

The Game Data is stored at
X:\Program Files (x86)\Steam\SteamApps\common\Horizon's Gate\Content
and is important for viewing examples of existing data formats.

By pressing "Shift" + "~" in-game, you can bring up the Console.

Some important console commands:
  • h lists commands or gives more info on them.
  • dm toggles Debug Mode, which:
    • allows you to bring up the console with just "~"
    • allows you to hold right-click on character stats, then mousewheel to alter them
    • causes the B key to toggle Build mode at any time
    • allows certain other commands in build mode
    • enables a warning system for common typos in mod files
  • b enters Build mode, allowing terrain editing, item placement, etc.
  • go and gob sends you to the specified zone (ex: go port1). gob puts you into Build mode immediately. Going to a zone that doesn't exist yet generates a brand new zone.
  • z, bz, and sp shows a list of zone data. They do not list zones in the Mods folder.

To permanently enable Debug Mode, open config.ini, found in X:\Users\Username\AppData\Roaming\BoatTactics. Change debugMode=False; to debugMode=True;.
Build mode
Enter build mode with the console command 'b'.

In build mode, you can view and edit the zone, actors, and even terrain types. Use WASD to pan the camera.


The left panel creates Items or Actors.
  • Click the tabs at the top to view different categories.
  • Mousewheel to scroll the list of items or actors.
  • Left click an item to create 1, or right-click to create a stack of 9.

The right panel edits the zone and shows TerrainTypes.
  • brings up a list of shortcuts and hotkeys when hovered.
  • The Zone's ID can be edited in the text field at the top.
  • Most buttons are self-explanatory if you hover them and read the tooltip.
  • Below these buttons are the TerrainTypes.
    • Left-click or right-click to assign a TerrainType to that type of click. Click the zone to place that terrain type.
    • Mousewheel to scroll the list of TerrainTypes.
    • Middle-click a TerrainType to view or edit the TerrainType's properties.
  • opens the Zone Settings Window.
    • From here you can edit many values of the zone, such as palettes, darknessColor, etc.
    • Hold Right-click on palette text fields to view a mousewheel-able list of options.
    • Hold Right-click on color text fields to bring up a mousewheel-able color picker.
  • saves the current zone to Game Data. Be careful not to overwrite your work!

Press T to toggle Trigger mode. This allows you to place event triggers in the zone.



  • Press New Trigger to create a new Trigger, or New Effect to add a TriggerEffect to the currently edited trigger.
  • Hold left-click on the zone to set the trigger box. Right-click to add additional boxes for the same trigger. Middle-click to remove additional boxes.
  • Left click a trigger box to edit its trigger.
  • Hold right-click on an effect text field for a mousewheel-able list of possible TriggerEffects.
  • Not all TriggerEffects are safe to use or work correctly! Generally, only use TriggerEffects that have a tooltip explanation.
  • Hold right-click on Element text fields for a mousewheel-able list of Elements.
  • Some common TriggerEffects are:
    • travel_point handles most normal travel from zone to zone.
    • travel_leaveLocation is used to go from the current zone to the overworld.
    • fx plays an fx or sound at the specified spot.
    • setGlobalVar sets a variable that is stored in the player's save.
    • spawn is a complicated effect, but is used to create actors or groups of actors.
    • enterCombat forces combat start in the specified area.
  • Note: any TriggerEffect can also be called via the console or via dialog specialEffects.

----------

To edit an Actor, middle-click them and it will bring up their properties window.

Additional notes on editing Actors:
  • If debugMode is on, you can right-click a stat and mousewheel to alter its value.
  • If debugMode is on, you can alter hostile/neutral by clicking the red or green gem in the character stats window. Right-click adds them to your party.
  • To rotate an actor, hold them and press 'R'.
  • To change an actor's class, hover them and press 'C'.
  • To edit an actor's appearance, hover them and press 'E'.
    • Left-click the arrows to select from options available to the player.
    • Right-click the arrows to select from all options.
    • The bottom text field is a sprite selector for bodyParts. Hold right-click and mousewheel to select a part to edit.
  • Some actor properties do nothing, while others are very useful. Some important ones:
    • canDespawn, if true, lets the Actor's corpse disappear if the player leaves the zone.
    • dialogNodeID specifies what DialogNode to use when the Actor is spoken to.
    • ai_lua is which .lua script to use for AI. "idle" is the proper script for almost all NPCs.
    • aggressiveness affects positioning in combat. High aggression (1+) makes the Actor move as close as possible instead of maintaining attack distance.
    • bravery affects likelihood of the AI fleeing in combat.
    • intelligence affects max time the AI can spend thinking, and how easy it is for them to reach a 'good enough' action and stop thinking.
Zones and Locations
Now that you know how to edit a Zone using Build mode, let's set it up so other people can visit it.

First, save your zone with in Build mode. Now your zone data can be found in Horizon's Gate\Content\Data\ZoneData. Find zoneID.txt and zoneID.png (where zoneID is your zone's ID.) Copy these files, create a new folder in the Mods directory, and put the files there.

Now a player can visit your zones using travel triggers or via the console. But let's make it so they can access the zone from the overworld. To do this, we need to make a Location.

Take a look at the game's normal Location data at Horizon's Gate\Content\SystemSaves\defaultLocations.txt. This is the format we want to use to define our new Location.

In your folder in the Mods directory, create a new text file, and put a new [Location] in it by mimicking the format shown in defaultLocations.txt.

Here's an example:
[Location] ID=myNewLocation; name=Super Cool Beach; zoneID=zBeachBase; x=332; y=270; port=false; namePopup_texture=tbg; minimapIcon=ui_map_notable; useWorldtimeZoneDarkness=true; zoneThisLocationIsIn=eral;

This example creates a Super Cool Beach right near Searth. If this file is in the Mods directory, any save that doesn't already have Super Cool Beach will automatically add one to the overworld!

NOTE: you can override the game's default Locations or Zones by putting your own versions in the Mods directory and using the same ID. The game will always check Mods FIRST when loading Zones.

NOTE: after the first time a Location is created in a save, changing the base data will not affect it! The player now has their own version that will never be overwritten!

NOTE: please store Location or Zone data separate from other data types, such as [ItemType] or [ActorType]. If the game detects a [Location] or [Zone] in a text file, it will not load that file on startup, and instead wait until the appropriate time.
ZoneMerge
You can also apply the contents of a Zone directly onto another Zone. With ZoneMerges you can even change Zones that the player has already been to.

To do this, edit your zoneID.txt file and make some changes:
  • Change "[Zone]" to "[ZoneMerge]".
  • Add three new properties under [ZoneMerge]:
    • "mergeWith", which specifies the ID of the zone to merge onto. (example: "mergeWith=eral;")
    • "X" specifies the X position to put the top left corner of your zone.
    • "Y" specifies the Y position to put the top left corner of your zone.
  • You can also add an "fReq" property if you want to specify a formula requirement that must be calculated as greater than 0 for the ZoneMerge to apply.

You can also check out the example ZoneMerge in the ModSamples folder. It adds a small boat to the bottom left of port1 (Port Otype).

Note that ZoneMerges apply once for any save that enters the zone, even saves that have already been in that zone. The ZoneMerge is applied the next time the player enters the zone (not including loading a save).

NOTE: ZoneMerges overwrite existing items! Be careful that it doesn't overwrite important things.

NOTE: ZoneMerges must be larger than 1x1, or the game will assume the file is corrupted.

Once applied, the globalVar zoneID + "_merged" (ex:myModZone_merged) is set to 1 as a way to remember not to reapply the same merge ID to that save file. For example, when the sample ZoneMerge is applied, it sets "sampleMod_boatInPort1_merged" to 1.
Creating an ItemType
You can create your own items, or override the normal items of the game.

The game's items are all stored at Horizon's Gate\Content\Data\SystemData\Definitions\items. Take a look at these files to get an idea of the formatting.

Now, take a look at the example item at Horizon's Gate\Content\ModSamples\items_mod1.txt. This example creates a new item that uses its own texture. Copy "items_mod1.txt" and "items_mod1.png" to a new folder in the Mods directory so you can access this item in-game using Build mode.

To override an existing item, set your item's ID to the existing item's ID. Additionally, if you'd like to retain all original properties of the item except for those you alter, you can use "cloneFrom".

As an example:
[ItemType] ID=armor_iron; cloneFrom=armor_iron; pR=pBlue;


This example changes the color of all Iron Mail to blue, without changing anything else about it. (cloneFrom also allows multiple mods to 'stack' if they both modify the same item.)
Creating an Action & AvAffecters
You can create Actions that are used by Classes, Items, ActorTypes, or in Reactions on equipment, support abilities, and actor types.

Let's take a look at an example Action - the Warrior's Guard:

[Action] ID=Wa_Guard; name=Guard; icon=icon_Wa_defend; tooltip=Halve incoming physical damage for <icon=time><math=60 + 20 * c:rank>.; rankUpTooltip=Each rank increases duration by <icon=time>20.; tooltipTopRight=; harmful=false; mpCost=1; XPCost=180; XPCost=350; XPCost=500; casterAnimation=charge; maxRank=3; FXOnCaster=chargeFast; FXOnCasterColor=SkyBlue; [ActionAoE] ID=Wa_Guard; cloneFrom=adjacentAndSelf; [AvAffecter] ID=Wa_Guard; harmful=false; actorValue=guard; magnitude=1; duration=60 + 20 * c:rank; chance=100; FXOnHit=shield; FXOnHitColor=SkyBlue; FXOnTile=chargeFast; FXOnTileColor=SkyBlue; FXOnTile=sfx_sliceNoShingLow; [AvAffecterAoE] ID=Wa_Guard; cloneFrom=oneTile;

The [Action] defines all the important properties such as name, description, XPcosts, special properties, etc.

[ActionAoE] is the area of effect that shows up for the player to select. In this case, it highlights the caster and adjacent tiles.

Each [AvAffecter] (there can be as many as you want) applies an effect. The [AvAffecterAoE] is which tiles (centered on the ActionAoE tile selected) to apply the effect to.

In this case, both AoEs use cloneFrom to use common area of effects. Predefined AoEs that you can cloneFrom include:
  • oneTile
  • adjacent
  • adjacent+1
  • adjacent+2
  • adjacent+3
  • adjacentAndSelf
  • adjacentAndSelf+1
  • adjacentAndSelf+2
  • adjacentAndSelf+3
  • allParty
  • allActors
  • allAllies
  • allEnemies
Anyway, for now let's edit Guard so it has a 50% chance to grant +2 Physical Attack for 30t. To do so, let's add a new [AvAffecter] and [AvAffecterAoE]. That would look like this:

[Action] ID=Wa_Guard; name=Guard; icon=icon_Wa_defend; tooltip=Halve incoming physical damage for <icon=time><math=60 + 20 * c:rank>.; rankUpTooltip=Each rank increases duration by <icon=time>20.; tooltipTopRight=; harmful=false; mpCost=1; XPCost=180; XPCost=350; XPCost=500; casterAnimation=charge; maxRank=3; FXOnCaster=chargeFast; FXOnCasterColor=SkyBlue; [ActionAoE] ID=Wa_Guard; cloneFrom=adjacentAndSelf; [AvAffecter] ID=Wa_Guard; harmful=false; actorValue=guard; magnitude=1; duration=60 + 20 * c:rank; chance=100; FXOnHit=shield; FXOnHitColor=SkyBlue; FXOnTile=chargeFast; FXOnTileColor=SkyBlue; FXOnTile=sfx_sliceNoShingLow; [AvAffecterAoE] ID=Wa_Guard; cloneFrom=oneTile; [AvAffecter] ID=Wa_Guard; harmful=false; actorValue=PhysAtk; magnitude=2; duration=30; chance=50; [AvAffecterAoE] ID=Wa_Guard; cloneFrom=oneTile;

Take a look at the other existing actions to get a better understanding for them! They can be found under Data\SystemData\Definitions\actions. Note that some files are named strangely (actions_knight.txt contains all the Warrior actions).

NOTE: 'duration' uses an odd system for indefinite or turn-based timers. The way to do those effects is:
-1 = indefinite.
-2 = instant + permanent.
-3 = until start of next turn.
-4 = until end of next (including current) turn.
-5 = until end of next 2 turns. (use this for abilities that you want to last until end of next turn.)
-6 = until end of next 3 turns, etc...
Creating other types
You can create ActorTypes, ActorClasses, and dialog in the same way as with ItemType. Look in Horizon's Gate\Content\Data\SystemData\Definitions\actors\ to find the game's normal types and classes.

Create your own by following the format in the original data - or override existing types by using the same ID.

Actions and dialog do not support cloneFrom.

For detailed info on how to add custom dialog, check out this excellent in-depth guide by Radiatoryang:
https://steamhost.cn/steamcommunity_com/sharedfiles/filedetails/?id=2066008133
You can also create TerrainTypes of your own. I recommend using the in-game TerrainType editor, saving in that editor, then copying your new TerrainType out of Horizon's Gate\Content\Data\SystemData\Definitions\terrain\terrain.txt and into your own mod file.
Formulas
Formulas are used in Actions, AvAffecters, Triggers, dialog and more. They allow calculating numbers on the fly and have a unique syntax.

Formulas support normal math operations like +, -, /, *, and use standard order of operation rules. They do NOT support standard use of parentheses.

Here are some examples of valid formulas:
2 + 7 * 15 -w:Power - c:PhysAtk - c:skill_Sword + t:PhysDef w:magnitude * 0.9 97 + c:MagAtk - d:tMagicEva d:fireDmg(4)

In addition to normal numbers, formulas can use a selection of hardcoded calculations that are in the format 'prefix:value'.

Here are the most commonly used calculations:
Calculation
Prefix
Possible Values
Example
Caster actor value
c
any ActorValue
c:PhysAtk
Target actor value
t
any ActorValue
t:PhysAtk
Weapon value
w
Power, maxRange, weight, throwDamageMod, throwRangePenalty, any valid Element (returns 1 if has specified Element)
w:Power
Offhand weapon vaue
w2
Power, maxRange, weight, throwDamageMod, throwRangePenalty, any valid Element (returns 1 if has specified Element)
w2:Power
Is Actor in Party?
party
Actor ID
party:reeve
Is Actor in Party/Crew?
partyOrCrew
actor ID
partyOrCrew:hagger
Support Ability equipped?
sa
Support Ability ID
sa:valiant
Formula stored in Data
d
any FormulaGlobal
d:fireDmg0(2) + d:supportAbilMagDmgMult
Math
m
see Math appendix
m:evaFacing
Global variable
g
any string
g:fame_trade + g:exampleVariable

One oddity of 'd' is that you can pass in a number in parentheses, such as with "d:fireDmg0(2)". This causes the passed in number to take the place of 'x'.

In the case of fireDmg0(2):
-c:MagAtk - x - c:skill_Fire - m:isItThisDayOfWeek(0) + t:skill_Fire + t:MagDef
becomes
-c:MagAtk - 2 - c:skill_Fire - m:isItThisDayOfWeek(0) + t:skill_Fire + t:MagDef
Uploading your mod to Steam Workshop
Uploading to Steam Workshop is a very simple process. And don't worry about doing it perfectly the first time - all mod uploads are set to Private by default!
  1. Put all your mod files into a folder in the local Mods directory.
  2. Add a 512x512 .png into that folder with the same name as the folder. (Example: MyMod/MyMod.png)
  3. Open Horizon's Gate, go the main menu, and select Mods > Create > Upload New.
  4. Enter the name of your mod folder.
  5. Enter tags to describe your mod, such as Gameplay, Items, Location, etc. Each tag should be separated by commas.
  6. Let the upload complete, then click the checkmark to view your mod online!
  7. Edit your mod's description, images, and so on, then set its Visiblity to Public when you're ready.

If you need to edit the contents, preview image, or tags of your mod, you can do so with the other in-game options 'Edit Content' and 'Edit Tags'. You'll have to type in the ID # of your mod to do so.

The ID # is the long number found in your mod's URL. For example, this mod's ID is 2127597667:
https://steamhost.cn/steamcommunity_com/sharedfiles/filedetails/?id=2127597667
Final notes
NOTE: Images and sound effects will override eachother if they have the same filename. Please use unique filenames to ensure that your files are not overridden by other mods.

NOTE: Sound effects and music only support .wav format. Music filenames MUST start with "Song-".

------------------------

Please feel free to post questions in the comments or send questions to radcodex at gmail. To learn more about modding, you can visit the official Horizon's Gate discord (more info here) and check out the #mod-creation channel.
Appendix: Editable Types
This is a list of all data types that can be created or edited with a text file.

There are also some types not listed that you don't edit directly (for example, Zones contain Actors, Items, and Triggers, but you would create them via the in-game build mode instead of typing them out).

Notes:
  • In addition to these types, mods can also replace textures, sounds, and music.
  • AoE stands for Area of Effect.
  • Reactions are what happens when the type is affected by an Element or ActorValue.
  • AoE, Effect, Reaction, and Light each use standardized formats across types. (Ex: ItemEffect and SupportAbilityEffect use the same format.)

Type
Comment
Can use cloneFrom?
TerrainType
Use the in-game editor for this type.
TerrainLight
TerrainReaction
ActorValue
see ModSamples/ActorValueSample.txt
ActorValueEffect
see ModSamples/ActorValueSample.txt
ActorValueReaction
see ModSamples/ActorValueSample.txt
ActorType
Includes humanoids, monsters, vehicles, and ships
ActorTypeDetectAOE
ActorTypeReaction
AvEffect
ActorTypeLight
ItemType
See ModSamples/items_mod1.txt
ItemEffect
Applied to Actors when the item is equipped.
ItemEffectInWeapon
ItemEffectInArmor
ItemLight
ItemReaction
ItemReactionInWeapon
ItemReactionInArmor
JournalEntry
Used by Items, ActorTypes, and ActorClasses
Zone
Best to use the in-game Zone editor ('build mode')
ZoneMerge
Best to use the in-game Zone editor ('build mode')
DialogNode
See dialog modding guide for more info
DialogOption
DialogNodeOverride
Location
Port/dungeon data that places an entry to a Zone on the overworld
GlobalAoE
Can be cloneFrom'd or used as ActorType.movementType
GlobalTrigger
A trigger that can be called from any Zone or called by Actions
GlobalTriggerEffect
ActorPrefab
'Example' actors that can be placed in build mode or referred to by triggers
ActorClass
Warrior, Scout, etc.
ActorClassReaction
ActorClassEffect
Action
Includes Class abilities, weapon attacks, consumable actions, enemy actions, and more
ActionAoE
AvAffecter
AvAffecterAoE
SupportAbility
See ModSamples/supportAbilityMod1.txt
SupportAbilityReaction
SupportAbilityEffect
LevelData
Parameters for procedural zones
LevelDataZone
Zone data used by LevelData
SetPiece
Defines a Zone as a re-usable SetPiece, often placed by LevelData
FormulaGlobal
See ModSamples/FormulaGlobalSample.txt
FXData
See ModSamples/FXsamples.txt
drawOrderFX
See ModSamples/FXsamples.txt
drawOrderFXLight
See ModSamples/FXsamples.txt
SpawnData
Data for spawning groups of actors/fleets
SpecialSpawn
spawns items/terrain according to special rules
Faction
Animation
See ModSamples/AnimationSample.txt
Keyframe
Appendix: Area of Effect ShapeTypes
When creating an Area of Effect, you can choose a specific shape from these options. When you specify a shape, use the number, such as "shape=2;".

Number
Shape
Comment
0
plusShape
Default shape. Ignores moveCost of items/terrain.
1
walkpathShape
Movement shape that uses pathfinding. Accounts for moveCost of items/terrain.
111
walkpathShape_straightLinesPlus2
As walkpathShape but reaches 2 less in non-straight lines.
2
lineShape
Straight line.
3
wideLineShape
Straight line, but 3 tiles wide.
5
player
Only the player's tile.
6
playerParty
All tiles with the player's party in them.
66
allButPlayerParty
All tiles with Actors that aren't in the player's party.
7
allActors
All tiles with Actors.
17
allActors_nonIncapped
All tiles with Actors that aren't incapped.
8
allTiles
All tiles in the zone. This usually lags too much to be usable.
10
useWeaponAoE
Inherits all properties of the caster's weapon's Action AoE. Individual properties can be overriden.
11
useWeaponAVAoE
Inherits all properties of the caster's weapon's primary AvAffecter AoE. Individual properties can be overriden.
25
diagonalX
Tiles in an X shape, diagonal from the origin.
Appendix: Elements (1 / 2)
Here is a complete list of all Elements as of v1.1.1, some with notes on their function.
Some Elements are unused, despite having comments on them.

Element
Comment
any
none
physical
magic
melee
ranged
use
slash
smash
heavySlash
axes, greatswords
heavySmash
hammers
explode
mech / mechanical
mech2 / mechanical2
pickaxe
dig
digDown
growth
wither
bury
focus
activate machinery w/ mind, etc
prayer
fire
ice
water
deepwater
for deep water terrain
abyss
for abyss terrain
elec / lightning
fakeElec
used by cutscene
earth
wind
life
ruin
acid
poison
oil
HPbased
breakItem
shatter
the Breaker ability 'Shatter'
weapon
sword
dagger
fist
axe
hammer
flail
spear
bow
aim
shield
whip
cannon
javelin
axe_throw
dart
for dartboards
kindle
makes fires last longer
ruinTouch
does extra damage based on negative statuses
dispel
removes magical hazards
bonemeld
creates bone walls, damages undead x5
antiMachine / antimachine
damages mechs x2
antiUndead
damages undead x2
mechanistAbil
damage from a mechanist ability
weaponAugment
damage from a weapon augment
pressurePlateDown
when someone stands still on a tile (fires repeatedly) Triggers CANNOT use this as their 'triggeredByElement' value.
pressurePlateUp
pressureMove
when someone moves adjacent to an object. Triggers CANNOT use this as their 'triggeredByElement' value.
pressureMoveAcross
when someone moves into OR out of a tile. Triggers CANNOT use this as their 'triggeredByElement' value.
pressureJumpAcross
when someone jumps into OR out of a tile.
pressureMoveTo
when someone moves ONTO an object. Triggers CANNOT use this as their 'triggeredByElement' value.
elementwalker
for walking through fire, acid, etc
itemEquipped
applied to an item when it is equipped on an actor
itemCombine / itemCombined
called when an item on the ground that possesses this rxn element is successfully combined
actionUsed
called on an item after its action has been used (Ex: crossbow reacts after it is fired)
timerUp
called on an item when its timer has run out (timers are initiated by items with timer special properties)
timerUp is also called on the start of a combat turn.
weaponBuff
adds the action when a weapon attack is used
appliedWeaponBuffs
caster reacts with this when weaponBuffs are applied
combatStart
called on the start of combat (used with Support Abilities/actorType rxns, and with triggers)
combatEnd
called on the end of combat (used with Support Abilities/actorType rxns)
combatLost
called on losing a combat (used with triggers)
combatWon
called on winning a combat (used with triggers)
tileReacted
for items; called when the tile beneath the item changes ID
itemReacted_timerUp
called when an item on that tile reacts via timerUp, so that any "X" items are cleaned up
Appendix: Elements (2 / 2)
actorFall
actionTaken
called when an actor is the caster in executeAction() on their turn or with a charged/casted ability
noActionTaken
called when an actor takes no action on its turn
noMoveTaken
called when an actor takes no movement on its turn
endTurn
called when actor ends turn
moveAbilUsed
applied to an actor when it uses an ability that moves (or should move) it
usedMeleeWeaponAtk
applied by certain actions that don't normally proc weaponBuffs, but should cause passives like Man of War to trigger
daytime
called when a zone is entered during day
nighttime / nightime
called when a zone is entered during night
newDay
called on a new day or when you re-enter a zone you haven't been to for a day. Called many times in a row for long stays away
incapacitated / incapped
called when an actor is incapacitated -- also applies to all triggers in area
enemyKOd
applied to current turn actor when an enemy is KO'd
reloading
for rxns triggered by reloading your weapon
reload
for special actions that automatically reload equipped weapons
repair
for triggers that fix broken items
railway
for use with minecart movementAoE.
spreadRope
removeRope
spreadChain
removeChain
unarmed
specific weapon classification
BreakerWpn
specific weapon classification
shiftcloakWpn
specific weapon classification
punchDaggerWpn
specific weapon classification
hammerDaggerWpn
specific weapon classification
shieldShotWpn
specific weapon classification
catchFish
cast by weapon types that can catch fish (i.e. spears)
fistWpn
closeContainer
triggered when a container is manually closed
removeDecay
for actions that should remove Decay but aren't Life element
cutsc_destroy
for cutscene destructions
windAnimate
for special abils that animate items using the power of wind
replaceCapsule
for mechanist abils, so that throwing a capsule on top of another capsule replaces it
stairs
called when you step on a secret staircase.
itemPushed
burst1
burstSpread1
burst2
burstSpread2
burst3
burstSpread3
Appendix: Formulas - Calculations (1 / 3)
Here is a complete list of formula calculations as of v1.5.88.

Calculation
Prefix
Possible Values
Example
Caster actor value
c
any ActorValue
c:PhysAtk
Caster base actor value
cb
any ActorValue
cb:PhysAtk
Target actor value
t
any ActorValue
t:PhysAtk
Target base actor value
tb
any ActorValue
tb:PhysAtk
Weapon value
w
Power, maxRange, weight, throwDamageMod, throwRangePenalty, any valid Element (returns 1 if has specified Element)
w:Power + w:weight
Offhand weapon vaue
w2
Power, maxRange, weight, throwDamageMod, throwRangePenalty, any valid Element (returns 1 if has specified Element)
w2:melee
Is Actor in Party?
party
Actor ID
party:reeve
Is Actor in Party/Crew?
partyOrCrew
Actor ID
partyOrCrew:hagger
Any party at XY?
partyXY
X:Y
partyXY:6:5
Is Actor in any fleet?
fleet
Actor ID
fleet:jin
Support Ability equipped?
sa
Support Ability ID
sa:valiant
Target has Support?
tsa
support ability ID
tsa:bulwark
Support Ability not equipped?
notsa
support ability ID
notsa:bulwark
Target not have Support?
nottsa
support ability ID
nottsa:bulwark

Formula stored in Data
d
any FormulaGlobal
d:fireDmg0(2) + d:supportAbilMagDmgMult
Math
m
see Math appendix
m:evaFacing
Global variable
g
variable
g:fame_trade + g:exampleVariable
Caster actor value is 1?
cIs1
any actor value
cIs1:HP
Target actor value is 1?
tIs1
any actor value
tIs1:HP
Caster actor value is...?
cIs
any actor value:value
cIs:PhysAtk:3
Target actor value is...?
tIs
any actor value:value
tIs:PhysDef:3
cIsGreaterThan
any actor value:value
cIsGreaterThan:PhysAtk:3
tIsGreaterThan
any actor value:value
tIsGreaterThan:PhysAtk:3
cIsLessThan
any actor value:value
cIsLessThan:PhysAtk:3
tIsLessThan
any actor value:value
tIsLessThan:PhysAtk:3
tIs99
any actor value
tIs99:PhysAtk
Higher AV of target or caster
max_tc
any actor value
max_tc:burn
Duration of effect on Caster
cDur
any actor value
cDur:blind
Duration of effect on Target
tDur
any actor value
tDur:blind
AV on caster from source
cFromSource
any actor value:source
cFromSource:PhysDef:whipAndTear_act
AV on target from source
tFromSource
any actor value:source
tFromSource:PhysDef:whipAndTear_act
Appendix: Formulas - Calculations (2 / 3)
Does Target have item?
item
item ID
item:gp
# of item near target
itemWithin
item ID:radius
itemWithin:shovel:5
Target has > this many item?
itemsMoreThan
item ID:value
itemsMoreThan:gp:20
Zone has > this many item?
itemsZoneMoreThan
item ID:value
itemsZoneMoreThan:gp:7
How many of this item in zone?
itemsZone
item ID
itemsZone:gp
itemsZoneOrParty
item ID
itemsZoneOrParty:gp
# held by party, fleet, stash
partyItem
item ID
partyItem:shovel
partyItem but w/ gVar
partyItem_g
variable
partyItem_g:exampleVar
# of items at XY
itemAt
X:Y:item ID
itemAt:5:7:gp
# in cargo
cargoItem
item ID
cargoItem:food
# in cargo
cargoItem_g
variable
cargoItem:exampleVar
all spawned by item
allItemsSpawned
variable
allItemsSpawned:loot_craft_kit
Can item fit at targetTC?
canItemFit
item ID
canItemFit:shovel
$ value of item
itemValue
item ID
itemValue:shovel
$ value of item
buyPrice
item ID
buyPrice:food

Does actor exist in zone or fleets?
actor
actor ID
actor:reeve
Does actor exist at XY?
actorXY
actor ID:X:Y
actorXY:reeve:5:7
Does target exist at XY?
targetXY
X:Y
targetXY:5:7
Is actor the target?
target
actor ID
target:hagger
Is actor in landing party?
landingParty
actor ID
landingParty:reeve
Is ship type in player fleet?
shipTypeInPlayerFleet
actorType ID
shipTypeInPlayerFleet:sailboat
# player kills of actor type
k
actorType ID
k:sailboat
as 'k', but w/ gvar
k_g
variable
k:exampleVar

Data formula, but min of 0
dMin0
any FormulaGlobal
dMin0:magicDur0(x)
Data formula, but max of 0
dMax0
any FormulaGlobal
dMax0:iceDmg0(x)
Data formula, but max of 1
dMax1
any FormulaGlobal
dMax1:iceDmg
Data formula, but max of -1
dMaxNeg1
any FormulaGlobal
dMaxNeg1:swordDmg0
Data formula, but max of specified #
dMax
any FormulaGlobal
dMax:swordDmg0:8
Does Math equal 0?
mIs0
see Math appendix
mIs0:distance
Math, but minimum of 0
mMin0
see Math appendix
mMin0:frontFacing

Elemental damage multiplier of Target
rxn
Element
rxn:fire
Elemental damage multiplier of Caster
rxnC
Element
rxnC:fire
Actor value damage multiplier of Target
AVrxn
Actor value
AVrxn:poison
Actor value damage multiplier of Caster
AVrxnC
Actor value
AVrxnC:poison
Elem rxns at targetTC
numRxnsTile
Element
numRxnsTile:ice
Elemental damage multiplier of Target
rxn
Element
rxn:fire

Global var = value?
gIs
variable:value
gIs:exampleVariable:12
gIsNot
variable:value
gIsNot:exampleVariable:12
gIs0
variable
gIs0:exampleVariable
gIs1
variable
gIs1:exampleVariable
gIsLessThan
variable:value
gIsLessThan:exampleVariable:5
gIsMoreThan
variable:value
gIsMoreThan:exampleVariable:5
Global var = current actor talking to?
gIsTalker
variable
gIsTalker:exampleVariable
Global var = current location ID?
gIsLocID
variable
gIsLocID:exampleVariable
Global var = current location faction?
gIsLocFaction
variable
gIsLocFaction:exampleVariable
Global var = current talker faction?
gIsTalkerFaction
variable
gIsTalkerFaction:exampleVariable
Game hours when global var last assigned
gTime
variable
gTime:exampleVariable
Game hours since global var last assigned
gTimeSince
variable
gTimeSince:exampleVariable
Game hours since global var last assigned <?
gTimeSinceLessThan
variable:value
gTimeSinceLessThan:exampleVariable:20
gTimeSinceLessThanOrEqual
variable:value
gTimeSinceLessThanOrEqual:exampleVariable:20
gTimeSinceMoreThan
variable:value
gTimeSinceMoreThan:exampleVariable:20
Is gVar unassigned or > this long since assigned?
gTimeSinceMoreThanOrNeverAssigned
variable:value
gTimeSinceMoreThanOrNeverAssigned:exampleVariable:20
Get value of gVar with current locID appended
gPlusLocID
variable
gPlusLocID:myGVar_
Game hrs since gPlusLocID set
gPlusLocIDTimeSince
variable
gPlusLocIDTimeSince:myGVar_
Combines string+gVar to get result
g_gID
string:variable
g_gID:defeatedFleets_:factionID
Does zone have Actor of gVar ID & dialogNode?
gIsActorWithDialogNodeID
variable
gIsActorWithDialogNodeID:questGiver:questgiver
Is loc of gVarID discovered?
gLocDiscovered
variable
gLocDiscovered:questGoal
Is gVar text?
gIsString
variable
gIsString:myGVar
Is party actor in slot gVar ID?
gIsPartyActorNum
variable:slot
gIsPartyActorNum:myGVar:2
Appendix: Formulas - Calculations (3 / 3)
Calculation
Prefix
Possible Values
Example
How much element on Caster? (max 3)
geo0
Element
geo0:fire
How much element within 1? (max 3)
geo1
Element
geo1:fire
How much element within 2? (max 3)
geo2
Element
geo2:fire
How much element within 2? (max 3)
geo2_noVisuals
Element
geo_noVisuals:fire
How much element at XY? (max 3)
geoXY
Element:X:Y
geoXY:fire:4:12
Caster's weapon augs match?
cWeaponAugmentElement
Element
cWeaponAugmentElement:fire
Caster's weapon augs match, and not enchanted?
cWeaponAugmentElementNoEnchant
Element
cWeaponAugmentElementNoEnchant:fire
Prev AvAffecter of action hit?
thisPreviousAVHit
actionID
thisPreviousAVHit:Un_drain
Prev AvAffecter of caster's hit?
myPreviousAVHit
actionID
myPreviousAVHit:Un_drain

Is main player ActorType?
mainPlayerIsActorType
actorType ID
mainPlayerIsActorType:fareem
Is main player slot #?
mainPlayerIsPartyActorNum
slot
mainPlayerIsPartyActorNum:0
Caster is ActorType?
cIsActorType
actorType ID
cIsActorType:crub
Target is ActorType?
tIsActorType
actorType ID
tIsActorType:crub

Is this the current Location ID?
loc
location ID
loc:port2
Is this Location discovered?
locDiscovered
location ID
locDiscovered:port2
Get # value of current location
loc
variable ID
locFloat:wealthLevel
Is Location wealth 100%?
portWealth100
location ID
portWealth100:port2
Zone previously visited?
z
zone ID
z:myZone
Is this the current Zone ID?
currentZone
zone ID
currentZone:myZone

Does player have < this much combined fame?
totalFameLessThan
value
totalFameLessThan:200
Does player have > this much combined fame?
totalFameMoreThan
value
totalFameMoreThan:200
How many Locations of this faction?
factionPorts
faction ID
factionPorts:jasce
Are there > this many Locations of this faction?
factionPortsMoreThan
faction ID:value
factionPortsMoreThan:seartial:10
Max favor w/ faction?
maxFavor
faction ID
maxFavor:jasce
Total wealth of this faction?
factionWealth
faction ID
factionWealth:jasce
Total fleets of this faction?
factionFleets
faction ID
factionFleets:jasce
Merchant fleets of this faction?
factionMFleets
faction ID
factionMFleets:jasce
Battlefleets of this faction?
factionBFleets
faction ID
factionBFleets:jasce

Party actor of slot XP
currentXPOfPartyActorNum
slot
currentXPOfPartyActorNum:2
Is actor with dialogNode in zone?
actorWithDialogNodeID
dialogNode ID
actorWithDialogNodeID:questgiver
Total XP of actor with dialogNode
getVendorTotalXP
dialogNode ID
getVendorTotalXP:questgiver
Is this key held right now?
keyHeld
any keybind (see keybinds.ini)
keyHeld:use
Is key held correctly for Timed Hits?
timedHitCheck
any keybind (see keybinds.ini)
timedHitCheck:use
Appendix: Formulas - Math (1 / 3)
Here is a complete list of math ("m:") calculations that can be done by Formulas as of v1.5.88.

Name
Usage
evafacing
Returns a value from 0.1 to 1 based on facing of Caster to Target
frontFacing
Is the Caster facing the Target's front?
backFacing
Is the Caster facing the Target's back?
dark
Is the Target in a darkened tile?
distance
tile distance between Caster and Target
distanceRaw
exact non-tile distance between Caster and Target
distanceFleet
tile distance between player flagship and Target
distFromCaster
tile distance between Caster and Target. ONLY usable in AoEs with maxRangeAddDistanceFromCaster=true.
cDistanceMoved
Returns the distance Caster is from where they started their turn.
tDistanceFromCOriginalPos
Returns the distance Target is from where the Caster started their turn.

targetExists
Does the Target exist?
targetExistsAndIsntCaster
Does the Target exist and isn't the Caster?
targetIsCurrentActor
Is the Target the current Actor in combat, or the player in travel?
casterIsTarget
Is the Target the Caster?
casterIsntTarget
Is the Target not the Caster?
percentHPLost
How much % HP Caster is missing
targetPercentHPLost
How much % HP Target is missing
targetPercentHPLowerThan(x)
Is % HP Target missing < x?
tBreakableWeapon
Does Target have a breakable weapon equipped?
tBrokenWeapon
Does Target have a broken weapon equipped?
tBreakableArmor
Does Target have breakable armor equipped?
tDropItem
Does Target have anything Mug can disarm?
incapped
Is Target KO'd?
tIntelligence
Get Target intelligence
tCancel
Is Target casting a spell that can be canceled?
cCritical
Is Caster in critical condition (<25% HP)?
tCritical
Is Target in critical condition (<25% HP)?
cCurable
Does Caster have a curable status effect?
tCurable
Does Target have a curable status effect?
tActTimerLeft
How much time until Target gets to act?
tActTimer
How much time does Target take per turn?
tCanActBeforeX(x)
Can Target act before x tics?
cHostile
Is Caster hostile to the player?
tHostile
Is Target hostile to the player?
sameHostile
Is Target's hostile status same as the Caster?
diffHostile
Is Target hostile to the Caster?
tTameable
Is Target tame-able? (As per Bat Handler's Tamer passive)
tControllable
Is Target player-controllable?
tcControllable
Are both Target and Caster player-controllable or both uncontrollable?
tPlayer
Does the Target's faction = "player"?
tFearless
Is Target fearless?
tArmed
Does the Target have a weapon equipped?
tArmored
Does the Target have armor equipped?
tHumanoid
Is the Target a humanoid?
cWpnBroken
Is the Caster's weapon broken?
tIsPlayer
Is the Target the currently-player-controlled actor?
anySameClassesOrActorType
Does the Target share any classes (including Crested classes) or the same ActorType ID with the Caster?

cIsMP(x)
Does Caster's MP == X?
money
How much money does the player have?
tmoney
How much money is the Target carrying?
tInvValue
What is the total $ value of Target's inventory?
tCastTime
What is the remaining cast time of Target's spell?
tIsHP10OrLess
Does Target have 10 HP or less?
tHPBasedMax5
Get Target TrueMaxHP * 0.1 (max 5)
cHighestRangedSkill
What is Caster's highest ranged skill (Bow/Xbow)?
cHighestRangedSkill
What is Caster's highest ranged skill (Bow/Xbow)?
cMorale_Vs_tMorale
Get the difference in morale values between Caster and Target (min 0)
cLowestMeleeSkill
What is Caster's lowest skill out of all melee skills except Fist and Dagger?
cLowestCCMeleeSkill
What is Caster's lowest skill out of Fist and Dagger?
cLowestMagicSkill
What is Caster's lowest elemental skill?
sniperBonus
Gets multiplier of extra accuracy above 100% (max 0.3, min 0)

tLastDmgTaken
How much damage did Target most recently take?
cLastDmgTaken
How much damage did Caster most recently take?
tLastDmgHealed
How much damage did Target most recently heal?
cLastDmgTakenGreaterThanX(x)
Did Caster most recently take >x damage?
cLastDmgTakenLessThanX(x)
Did Caster most recently take <x damage?
cLastDmgTakenVsLifeSkill
Get lower of: Caster life skill vs. most recently taken damage
cLastDmgTakenVsHalfLifeSkill
Get lower of: 1/2 Caster life skill vs. most recently taken damage
cLastDmgTakenLessThanHalfLifeSkillPlus1
Is most recently taken damage <1/2 Life Skill + 1?
cLastDmgTakenLessThanHalfLifeSkillPlus2
Is most recently taken damage <1/2 Life Skill + 2?

numSelectedTargets
# of currently selected target tiles. (only applicable during player input)
numSelectedTargets_Actors
# of currently selected target tiles with Actors
numEnemiesWithin1
How many enemies are within 1 tile of Caster?
numEnemiesWithinX(x)
How many enemies are within X tiles of Caster?
numAlliesWithin(x)
How many allies are within X tiles of Caster?
numFactionAlliesWithin(x)
How many allies with the same 'faction' are within X tiles of Caster?
numEnemiesNearTargetWithin(x)
How many enemies are within X tiles of Target?
numAlliesNearTargetWithin(x)
How many allies are within X tiles of Target?
numAlliesExceptCasterNearTargetWithin(x)
How many allies besides the Caster are within X tiles of Target?
numActorsExceptCasterNearTargetWithin(x)
How many actors besides the Caster are within X tiles of Target?
numActorsAt
How many actors are in the Target's tile?
moreThanOneActorAt
Is more than one actor in the Target's tile?
numNPCsAt
How many non-controllable actors are in the Target's tile?
Appendix: Formulas - Math (2 / 3)
Name
Usage
unoccupiableTileInTheWayOfMoveToTarget
Is there an unoccupiable tile between the Caster and Target?
occupiableTileTarget
Is the Target's tile occupiable?
actorInTheWayOfMoveToTarget
Is there an Actor in front of the Target (relative to Caster)?
actorInTheWayOfMoveToTargetOrUnoccupiable
Is there an Actor or unoccupiable tile in front of the Target (relative to Caster)?
actorInTheWayOfMovePastTarget
Is there an Actor behind the Target (relative to Caster)?
actorInTheWayOfMovePastTargetOrUnccupiable
Is there an Actor or unoccupiable tile behind the Target (relative to Caster)?

rand(x)
Returns a random number between 0 and X.
randSign
Returns 1 or -1.
randID(x)
Returns a random number between 0 and X, with seed based on the Target's ID.
previousAVHit
Did most recent (time-wise, not Action-wise) AvAffecter hit?
previousAVChanceYes
Did most recent AvAffecter chance eval true?
target90PercentHPCantKill
Gets 90% of the Target's current HP, or 0 if the target has <2 HP

combat
Is the player in combat?
outCombat
Is the player not in combat?
manipItemsThisTurn
Is the player currently spending their action manipulating items this turn?
didntActLastTurn
Was no action taken last turn?
didntMoveLastTurn
Was no move taken last turn?
itemsHeld
How many items is the player holding with their cursor right now?

money
How much money does the player have?
cargo
How much cargo does the player have?
cargoMax
How much max cargo does the player have?
cargoSpace
How much free cargo space does the player have?
cargoOverLimit
Is the player currently over their max cargo?
maxFoodBuy
How much food can the player buy (limited by price & cargo)?
canAffordFood(x)
Can the player afford x food?
canAffordGoods(x)
Can the player afford x of this Location's goods?
fleetRepairsNeeded
How much ship damage needs to be repaired?
fleetRepairsCost
How much do repairs cost (with rank/fame benefits)?
fleetRepairsCostBase
How much do repairs cost (without rank/fame benefits)?
anyDuplicateCannons
Does the player have any duplicate cannons equipped in their fleet?
noEquippedCannonsButSomeInCargo
Does the player have any cannons in cargo, but none on their fleet?
foodPerDay
How much food does the player consume per day?
Appendix: Formulas - Math (3 / 3)
Name
Usage
partySize
Size of the player's current party
landingPartySize
Size of the player's landing party
partypower
What is the approximate Power Level™ of the party?
partyPower_base
What is the approximate Power Level™ of the party's base stats (ignoring current dmg taken, etc)?
enemypower
What is the approximate Power Level™ of all enemies in the entire zone?
partyVsEnemyPower
Get partyPower_base / enemypower
bribeCost
Gets a bribe cost based on power level of the Target's nearby faction allies
crewSize
Size of the player's crew
fleetSize
Number of ships in the player's fleet
cBoat
Is the Caster a boat?
tBoat
Is the Target a boat?
cCrewNum
How much crew is aboard the Caster?
cCrewNumMax(x)
How much crew is aboard the Caster (up to a max of X)?
tCrewNum
How much crew is aboard the Target?
bCrewNum(x)
How much crew is aboard boat in player fleet slot x
cCrewNumIsNot0
Is any living crew on Caster?
cCrewNumIs0
Is no living crew on Caster?
bTypeValue(x)
$ value of boat in player fleet slot x
cCanBoard
Is the Caster player-controllable or do they have living boarders in the first 5 slots?
cMinCrew
Miminum crew of the Caster
cCrewLow
Get damage multiplier of cannon power if <2 crew
pCrewMorale
Gets player Crew Morale multiplier
player_crewMorale
Gets player Crew Morale percentage
cCrewMorale
Gets Crew Morale multiplier of caster (0.7 if NPC)
playerStrongerThanFleet
Return 1 if player's fleet's power level is much greater than currentActorTalkingTo's fleet
tMerchant
Is Target a member of a merchant fleet?

player_speed
Get speed of player's current movement
isItThisDayOfWeek(x)
Is it X day of the week (where 0=Firstday)?
isItDaytime
Is it day time?
time_days
How many days have passed this month?
time_days(x)
Have X or more days passed this month?
time_days_total
How many days have passed total?
time_month
How many months have passed?
overworld
Is the player in the overworld right now?
peaceful
Is the current zone set to "peaceful" mode?

playerFavor
What is the player's favor with their chosen faction?
playerFavor(x)
Is the player's favor with their faction >= X?
playerFavorBelow(x)
Is the player's favor with their chosen faction below X?
playerFavorWithTarget
What is the player's favor with the Target's faction?
playerFavorWithTargetAbove(x)
Is the player's favor with the Target's faction above x?
playerFavorWithTargetAbove(x)
Is the player's favor with the Target's faction above -x?
playerFavorWithTargetBelow(x)
Is the player's favor with the Target's faction below x?
playerFavorWithTargetBelowNeg(x)
Is the player's favor with the Target's faction below -x?
totalFame
What is the player's combined fame?
nextRoyalFameReq
How much does the player need to reach the next royal rank?
nextRoyalFameReqMet
Does the player have enough fame for next royal rank?
unreportedRareDiscoveries
How many rare discoveries has the player made but not reported?
journalGoals
How many journal goals does the player have but not yet completed?
museumValue
What is the combined discovery value of every item in the zone atop 'sport_building_museum_tile' items?

locIsPort
Is the current Location a port?
locWealth
What is the current Location's wealth level?
locWealth(x)
Is the current Location's wealth level >= X?
favorWithLoc
What is the player's favor with the current Location's faction?
favorWithLoc(x)
Is the player's favor with the current Location's faction >= X?
canChangeFaction
Can the current Location change faction via investment?
locGoodsRestockPerDay
How many trade goods does the current Location restock per day?
locFoodPrice
How much does 1 Food cost at the current Location?
locFoodPriceTotal
How much does 1 day's worth of food cost at the current Location?
canBuylocFood
Can the player afford 1 day's worth of food at the current Location?
locHasUnlockableShip
Are there any unlockable ships at the currrent Location?
locXLessThan(x)
Is the current Location's X position on the overworld < X?
locYLessThan(x)
Is the current Location's Y position on the overworld < X?
locXMoreThan(x)
Is the current Location's X position on the overworld > X?
locYMoreThan(x)
Is the current Location's Y position on the overworld > X?

killsWithoutKnownJournals
How many actorTypes with undiscovered journal entries has the player killed?
debug
Is debugMode on?
intenseVisuals
Are 'Intense Visuals' enabled?
gamepad
Was the most recent input on a game pad?
extraRacesUnlocked
Has the player ever beaten the game?
Appendix: Formulas - Prefixes
In addition to normal syntax, formulas can have extra prefixes that modify a single value. This is a complete list as of v1.5.88.

Prefix
Syntax
Effect
Example
lessThan
lessThan:#:formula
Return 1 if < #, returns 0 otherwise
lessThan:3:c:PhysAtk
moreThan
moreThan:#:formula
Return 1 if > #, returns 0 otherwise
moreThan:1:cb:HP
is
is:#:formula
Return 1 if = #, returns 0 otherwise
is:100:d:reviveAcc
isNot
isNot:#:formula
Return 1 if not = #, returns 0 otherwise
isNot:20:cDur:poison
min
min:#:formula
Limits formula to given minimum
min:5:c:PhysAtk
max
max:#:formula
Limits formula to given maximum
max:7:t:MagAtk
abs
abs:formula
Returns 'absolute value' (if negative, changes to positive)
abs:c:PhysDef
floor
floor:formula
Lowers to nearest integer
floor:d:d_valiant
ceiling
ceiling:formula
Increases to nearest integer
ceiling:d:mpCostMult_onlyWithCT
round
round:formula
Rounds to nearest integer
round:c:MP
not
not:formula
Return 1 if < or = 0
not:t:MagDef
swapCasterTarget
swapCasterTarget:formula
Swaps Caster and Target for calculations. Useful for target-only or caster-only math calcs.
swapCasterTarget:m:tBrokenWeapon

NOTE: Prefixes can stack. "swapCasterTarget:abs:moreThan:3:t:PhysAtk" is valid syntax.

NOTE: you can only apply the prefix to a single value- "lessThan:5:c:PhysAtk" works, but "lessThan:5:c:PhysAtk - 2" is going to return a negative number.

In order to have your prefix apply to a more complicated formula, you may need to make a FormulaGlobal and refer to it using "d:" (such as something like "lessThan:5:d:myPhysCalc").
Appendix: FormulaGlobal (1 / 4)
This is a list of all hardcoded formulas used by Actions, AvAffecters, and many other things as of v1.4.5. You can overwrite these by matching their ID in your FormulaGlobal definitions.

ID
Formula
supportAbilWpnDmgMult
1 + sa:vicious * m:cMorale_Vs_tMorale * 0.08 + sa:valiant * m:frontFacing * 0.15 + sa:saltyDog * t:wet * 0.2 + sa:backstab * m:backFacing * 0.15 + sa:imbueMomentum * 0.03 * m:distance - 0.01 * t:backDefense * m:backFacing + sa:meleeMomentum * m:tDistanceFromCOriginalPos * 0.03 * w:melee + sa:brutalReach * m:distance(2) * 0.12 * w:melee + timedHitCheck:use * 0.01 + sa:sniper * m:sniperBonus
supportAbilWpnDmgMod
sa:giantKiller * t:HPMax * 0.03 * w:melee
swordDmg
dMaxNeg1:swordDmg0 * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
gswordDmg
dMaxNeg1:swordDmg0 * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
rapierDmg
dMaxNeg1:rapierDmg0 * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
daggerDmg
dMaxNeg1:daggerDmg0 * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
daggerDmg_offhand
dMaxNeg1:daggerDmg0_offhand * d:physDefPercent * d:supportAbilWpnDmgMult
fistDmg
dMaxNeg1:fistDmg0 * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
fistDmg_offhand
dMaxNeg1:fistDmg0_offhand * d:physDefPercent * d:supportAbilWpnDmgMult
axeDmg
dMaxNeg1:axeDmg0 * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
hammerDmg
dMaxNeg1:hammerDmg0 * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
flailDmg
dMaxNeg1:flailDmg0 * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
whipDmg
dMaxNeg1:whipDmg0 * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
spearDmg
dMaxNeg1:spearDmg0 * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
bowDmg
dMaxNeg1:bowDmg0 * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
aimDmg
dMaxNeg1:aimDmg0 * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
shieldDmg
dMaxNeg1:shieldDmg0 * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
cannonDmg
dMaxNeg1:cannonDmg0(x) * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
cannonDmg_crewHP
dMaxNeg1:cannonDmg_crewHP0(x) * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
cannonDmg_grape_crewHP
dMaxNeg1:cannonDmg_grape_crewHP0(x) * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
dartDmg
dMaxNeg1:dartDmg0 * d:physDefPercent * d:supportAbilWpnDmgMult - d:supportAbilWpnDmgMod
dartDmg0
-5 - c:PhysAtk - c:skill_Aim + t:PhysDef - sa:toolTalent * 9
swordDmg0
-w:Power - c:PhysAtk - c:skill_Sword + t:PhysDef
rapierDmg0
-w:Power - c:PhysAtk - c:skill_Sword + t:PhysDef
daggerDmg0
-w:Power - c:PhysAtk - c:skill_Dagger + t:PhysDef
daggerDmg0_offhand
-w2:Power - c:PhysAtk - c:skill_Dagger + t:PhysDef
fistDmg0
-w:Power - c:PhysAtk - c:skill_Fist + t:PhysDef
fistDmg0_offhand
-w2:Power - c:PhysAtk - c:skill_Fist + t:PhysDef
axeDmg0
-w:Power - c:PhysAtk - c:skill_Axe + t:PhysDef
hammerDmg0
-w:Power - c:PhysAtk - c:skill_Hammer + t:PhysDef * 0.5
flailDmg0
-w:Power - c:PhysAtk - c:skill_Flail + t:PhysDef
whipDmg0
-w:Power - c:PhysAtk - c:skill_Flail + t:PhysDef * 1.2
spearDmg0
-w:Power - c:PhysAtk - c:skill_Spear + t:PhysDef
bowDmg0
-w:Power - c:PhysAtk - c:skill_Bow + t:PhysDef
aimDmg0
-w:Power - c:PhysAtk - c:skill_Aim + t:PhysDef
shieldDmg0
-w:Power - c:PhysAtk * 0.5 - c:skill_Shield * 0.5 + t:PhysDef
cannonDmg0
-x * m:cCrewLow - c:PhysAtk - m:cCrewNumMax(8) - m:cCrewMorale * 2.25 + t:PhysDef + m:distance
cannonDmg_crewHP0
-x * m:cCrewLow - c:PhysAtk - m:cCrewMorale * 3 - m:tCrewNum * 0.2 * x - m:cCrewNumMax(8) + t:PhysDef + m:distance
cannonDmg_grape_crewHP0
-x * 5 * m:cCrewLow - c:PhysAtk - m:cCrewMorale * 4 - m:tCrewNum * 0.2 * x - m:cCrewNumMax(8) + t:PhysDef + m:distance * 5
physDefPercent
1
physicalAcc
100 * c:Acc - t:PhysEva * m:evaFacing - d:darkAccPenalty - m:evaFacingMod
physicalAccWpn
100 * c:Acc - t:PhysEva * m:evaFacing - d:darkAccPenalty - m:evaFacingMod + d:supportAbilWpnAccMod
darkAccPenalty
m:dark * 25 * dMin0:darkAccPenaltyApplies
darkAccPenaltyApplies
1 - c:sight - c:blind
supportAbilWpnAccMod
sa:spiralCurrent * c:skill_Wind * 1.5
swordAcc
c:Acc * 1 * c:skill_Sword + d:physicalAccWpn
gswordAcc
c:Acc * 1 * c:skill_Sword + d:physicalAccWpn
rapierAcc
c:Acc * 2 * c:skill_Sword + d:physicalAccWpn + 5
daggerAcc
c:Acc * 2 * c:skill_Dagger + d:physicalAccWpn + 10
fistAcc
c:Acc * 2.5 * c:skill_Fist + d:physicalAccWpn
axeAcc
c:Acc * 1 * c:skill_Axe + d:physicalAccWpn - 4
hammerAcc
c:Acc * 1 * c:skill_Hammer + d:physicalAccWpn - 15
flailAcc
c:Acc * 1 * c:skill_Flail + d:physicalAccWpn
whipAcc
c:Acc * 1 * c:skill_Flail + d:physicalAccWpn + 3
spearAcc
c:Acc * 1 * c:skill_Spear + d:physicalAccWpn
bowAcc
c:Acc * 1 * c:skill_Bow + d:physicalAccWpn
aimAcc
c:Acc * 1 * c:skill_Aim + d:physicalAccWpn
shieldAcc
c:Acc * 1 * c:skill_Shield + d:physicalAccWpn - 5
laserAccBonus
3 + c:skill_Fire
windGunAccBonus
3 + c:skill_Wind
magicDmg
dMax0:magicDmg0(x) * d:magDefPercent * d:supportAbilMagDmgMult
fireDmg
dMax0:fireDmg0(x) * d:magDefPercent * d:supportAbilMagDmgMult
iceDmg
dMax0:iceDmg0(x) * d:magDefPercent * d:supportAbilMagDmgMult
elecDmg
dMax0:elecDmg0(x) * d:magDefPercent * d:supportAbilMagDmgMult
windDmg
dMax0:windDmg0(x) * d:magDefPercent * d:supportAbilMagDmgMult
lifeDmg
dMax0:lifeDmg0(x) * d:magDefPercent * d:supportAbilMagDmgMult
ruinDmg
dMax0:ruinDmg0(x) * d:magDefPercent * d:supportAbilMagDmgMult
Appendix: FormulaGlobal (2 / 4)
ID
Formula
magicDmg0
-c:MagAtk - x + t:MagDef
fireDmg0
-c:MagAtk - x - c:skill_Fire - m:isItThisDayOfWeek(0) + t:skill_Fire + t:MagDef
iceDmg0
-c:MagAtk - x - c:skill_Ice - m:isItThisDayOfWeek(1) + t:skill_Ice + t:MagDef
elecDmg0
-c:MagAtk - x - c:skill_Elec - m:isItThisDayOfWeek(2) + t:skill_Elec + t:MagDef
windDmg0
-c:MagAtk - x - c:skill_Wind - m:isItThisDayOfWeek(3) + t:skill_Wind + t:MagDef
lifeDmg0
-c:MagAtk - x - c:skill_Life - m:isItThisDayOfWeek(4) + t:skill_Life + t:MagDef
ruinDmg0
-c:MagAtk - x - c:skill_Ruin - m:isItThisDayOfWeek(5) + t:skill_Ruin + t:MagDef
fireDmgPlusRank
dMax0:fireDmg0PlusRank(x) * d:magDefPercent * d:supportAbilMagDmgMult
fireDmg0PlusRank
-c:MagAtk - x - c:skill_Fire - c:rank - m:isItThisDayOfWeek(0) + t:skill_Fire + t:MagDef
fireDmg20ScalePlusRank
dMax0:fireDmg20Scale0PlusRank(x) * d:magDefPercent * d:supportAbilMagDmgMult
fireDmg20Scale0PlusRank
-c:MagAtk * 1.2 - x - c:skill_Fire * 1.2 - c:rank - m:isItThisDayOfWeek(0) + t:skill_Fire + t:MagDef
magicDmgDisplay
c:MagAtk + x
fireDmgDisplay
c:MagAtk + x + c:skill_Fire - 1
iceDmgDisplay
c:MagAtk + x + c:skill_Ice - 1
elecDmgDisplay
c:MagAtk + x + c:skill_Elec - 1
windDmgDisplay
c:MagAtk + x + c:skill_Wind - 1
lifeDmgDisplay
c:MagAtk + x + c:skill_Life - 1
ruinDmgDisplay
c:MagAtk + x + c:skill_Ruin - 1
magicDmg20ScaleDisplay
c:MagAtk * 1.2 + x
fireDmg20ScaleDisplay
c:MagAtk * 1.2 + x + c:skill_Fire * 1.2 - 1
iceDmg20ScaleDisplay
c:MagAtk * 1.2 + x + c:skill_Ice * 1.2 - 1
elecDmg20ScaleDisplay
c:MagAtk * 1.2 + x + c:skill_Elec * 1.2 - 1
windDmg20ScaleDisplay
c:MagAtk * 1.2 + x + c:skill_Wind * 1.2 - 1
lifeDmg20ScaleDisplay
c:MagAtk * 1.2 + x + c:skill_Life * 1.2 - 1
ruinDmg20ScaleDisplay
c:MagAtk * 1.2 + x + c:skill_Ruin * 1.2 - 1
magicDmg20LessScaleDisplay
c:MagAtk * 0.8 + x
fireDmg20LessScaleDisplay
c:MagAtk * 0.8 + x + c:skill_Fire * 0.8 - 1
iceDmg20LessScaleDisplay
c:MagAtk * 0.8 + x + c:skill_Ice * 0.8 - 1
elecDmg20LessScaleDisplay
c:MagAtk * 0.8 + x + c:skill_Elec * 0.8 - 1
windDmg20LessScaleDisplay
c:MagAtk * 0.8 + x + c:skill_Wind * 0.8 - 1
lifeDmg20LessScaleDisplay
c:MagAtk * 0.8 + x + c:skill_Life * 0.8 - 1
ruinDmg20LessScaleDisplay
c:MagAtk * 0.8 + x + c:skill_Ruin * 0.8 - 1
magicDmgHalfDef
dMax0:magicDmg0HalfDef(x) * d:supportAbilMagDmgMult
fireDmgHalfDef
dMax0:fireDmg0HalfDef(x) * d:supportAbilMagDmgMult
iceDmgHalfDef
dMax0:iceDmg0HalfDef(x) * d:supportAbilMagDmgMult
elecDmgHalfDef
dMax0:elecDmg0HalfDef(x) * d:supportAbilMagDmgMult
windDmgHalfDef
dMax0:windDmg0HalfDef(x) * d:supportAbilMagDmgMult
lifeDmgHalfDef
dMax0:lifeDmg0HalfDef(x) * d:supportAbilMagDmgMult
ruinDmgHalfDef
dMax0:ruinDmg0HalfDef(x) * d:supportAbilMagDmgMult
magicDmg0HalfDef
-c:MagAtk - x + t:MagDef * 0.5
fireDmg0HalfDef
-c:MagAtk - x - c:skill_Fire - m:isItThisDayOfWeek(0) + t:skill_Fire + t:MagDef * 0.5
iceDmg0HalfDef
-c:MagAtk - x - c:skill_Ice - m:isItThisDayOfWeek(1) + t:skill_Ice + t:MagDef * 0.5
elecDmg0HalfDef
-c:MagAtk - x - c:skill_Elec - m:isItThisDayOfWeek(2) + t:skill_Elec + t:MagDef * 0.5
windDmg0HalfDef
-c:MagAtk - x - c:skill_Wind - m:isItThisDayOfWeek(3) + t:skill_Wind + t:MagDef * 0.5
lifeDmg0HalfDef
-c:MagAtk - x - c:skill_Life - m:isItThisDayOfWeek(4) + t:skill_Life + t:MagDef * 0.5
ruinDmg0HalfDef
-c:MagAtk - x - c:skill_Ruin - m:isItThisDayOfWeek(5) + t:skill_Ruin + t:MagDef * 0.5
magDefPercent
1
supportAbilMagDmgMult
1
magicDmgWpnPower
dMax0:magicDmgWpnPower0(x) * d:magDefPercent * d:supportAbilMagDmgMult
fireDmgWpnPower
dMax0:fireDmgWpnPower0(x) * d:magDefPercent * d:supportAbilMagDmgMult
iceDmgWpnPower
dMax0:iceDmgWpnPower0(x) * d:magDefPercent * d:supportAbilMagDmgMult
elecDmgWpnPower
dMax0:elecDmgWpnPower0(x) * d:magDefPercent * d:supportAbilMagDmgMult
windDmgWpnPower
dMax0:windDmgWpnPower0(x) * d:magDefPercent * d:supportAbilMagDmgMult
lifeDmgWpnPower
dMax0:lifeDmgWpnPower0(x) * d:magDefPercent * d:supportAbilMagDmgMult
ruinDmgWpnPower
dMax0:ruinDmgWpnPower0(x) * d:magDefPercent * d:supportAbilMagDmgMult
magicDmgWpnPower0
-c:MagAtk - w:Power - x + t:MagDef
fireDmgWpnPower0
-c:MagAtk - w:Power - x - c:skill_Fire - m:isItThisDayOfWeek(0) + t:skill_Fire + t:MagDef
iceDmgWpnPower0
-c:MagAtk - w:Power - x - c:skill_Ice - m:isItThisDayOfWeek(1) + t:skill_Ice + t:MagDef
elecDmgWpnPower0
-c:MagAtk - w:Power - x - c:skill_Elec - m:isItThisDayOfWeek(2) + t:skill_Elec + t:MagDef
windDmgWpnPower0
-c:MagAtk - w:Power - x - c:skill_Wind - m:isItThisDayOfWeek(3) + t:skill_Wind + t:MagDef
lifeDmgWpnPower0
-c:MagAtk - w:Power - x - c:skill_Life - m:isItThisDayOfWeek(4) + t:skill_Life + t:MagDef
ruinDmgWpnPower0
-c:MagAtk - w:Power - x - c:skill_Ruin - m:isItThisDayOfWeek(5) + t:skill_Ruin + t:MagDef
magicDmg20Scale
dMax0:magicDmg20Scale0(x) * d:magDefPercent * d:supportAbilMagDmgMult
fireDmg20Scale
dMax0:fireDmg20Scale0(x) * d:magDefPercent * d:supportAbilMagDmgMult
iceDmg20Scale
dMax0:iceDmg20Scale0(x) * d:magDefPercent * d:supportAbilMagDmgMult
elecDmg20Scale
dMax0:elecDmg20Scale0(x) * d:magDefPercent * d:supportAbilMagDmgMult
windDmg20Scale
dMax0:windDmg20Scale0(x) * d:magDefPercent * d:supportAbilMagDmgMult
lifeDmg20Scale
dMax0:lifeDmg20Scale0(x) * d:magDefPercent * d:supportAbilMagDmgMult
ruinDmg20Scale
dMax0:ruinDmg20Scale0(x) * d:magDefPercent * d:supportAbilMagDmgMult
Appendix: FormulaGlobal (3 / 4)
ID
Formula
magicDmg20Scale0
-c:MagAtk * 1.2 - x + t:MagDef
fireDmg20Scale0
-c:MagAtk * 1.2 - x - c:skill_Fire * 1.2 - m:isItThisDayOfWeek(0) + t:skill_Fire + t:MagDef
iceDmg20Scale0
-c:MagAtk * 1.2 - x - c:skill_Ice * 1.2 - m:isItThisDayOfWeek(1) + t:skill_Ice + t:MagDef
elecDmg20Scale0
-c:MagAtk * 1.2 - x - c:skill_Elec * 1.2 - m:isItThisDayOfWeek(2) + t:skill_Elec + t:MagDef
windDmg20Scale0
-c:MagAtk * 1.2 - x - c:skill_Wind * 1.2 - m:isItThisDayOfWeek(3) + t:skill_Wind + t:MagDef
lifeDmg20Scale0
-c:MagAtk * 1.2 - x - c:skill_Life * 1.2 - m:isItThisDayOfWeek(4) + t:skill_Life + t:MagDef
ruinDmg20Scale0
-c:MagAtk * 1.2 - x - c:skill_Ruin * 1.2 - m:isItThisDayOfWeek(5) + t:skill_Ruin + t:MagDef
magicDmg20LessScale
dMax0:magicDmg20LessScale0(x) * d:magDefPercent * d:supportAbilMagDmgMult
fireDmg20LessScale
dMax0:fireDmg20LessScale0(x) * d:magDefPercent * d:supportAbilMagDmgMult
iceDmg20LessScale
dMax0:iceDmg20LessScale0(x) * d:magDefPercent * d:supportAbilMagDmgMult
elecDmg20LessScale
dMax0:elecDmg20LessScale0(x) * d:magDefPercent * d:supportAbilMagDmgMult
windDmg20LessScale
dMax0:windDmg20LessScale0(x) * d:magDefPercent * d:supportAbilMagDmgMult
lifeDmg20LessScale
dMax0:lifeDmg20LessScale0(x) * d:magDefPercent * d:supportAbilMagDmgMult
ruinDmg20LessScale
dMax0:ruinDmg20LessScale0(x) * d:magDefPercent * d:supportAbilMagDmgMult
magicDmg20LessScale0
-c:MagAtk * 0.8 - x + t:MagDef
fireDmg20LessScale0
-c:MagAtk * 0.8 - x - c:skill_Fire * 0.8 - m:isItThisDayOfWeek(0) + t:skill_Fire + t:MagDef
iceDmg20LessScale0
-c:MagAtk * 0.8 - x - c:skill_Ice * 0.8 - m:isItThisDayOfWeek(1) + t:skill_Ice + t:MagDef
elecDmg20LessScale0
-c:MagAtk * 0.8 - x - c:skill_Elec * 0.8 - m:isItThisDayOfWeek(2) + t:skill_Elec + t:MagDef
windDmg20LessScale0
-c:MagAtk * 0.8 - x - c:skill_Wind * 0.8 - m:isItThisDayOfWeek(3) + t:skill_Wind + t:MagDef
lifeDmg20LessScale0
-c:MagAtk * 0.8 - x - c:skill_Life * 0.8 - m:isItThisDayOfWeek(4) + t:skill_Life + t:MagDef
ruinDmg20LessScale0
-c:MagAtk * 0.8 - x - c:skill_Ruin * 0.8 - m:isItThisDayOfWeek(5) + t:skill_Ruin + t:MagDef
magicDur
dMin0:magicDur0(x)
fireDur
dMin0:fireDur0(x)
iceDur
dMin0:iceDur0(x)
elecDur
dMin0:elecDur0(x)
windDur
dMin0:windDur0(x)
lifeDur
dMin0:lifeDur0(x)
ruinDur
dMin0:ruinDur0(x)
magicDur0
c:MagAtk * x - t:MagDef
fireDur0
c:MagAtk * x + c:skill_Fire * x * 2 + m:isItThisDayOfWeek(0)*x - t:skill_Fire - t:MagDef
iceDur0
c:MagAtk * x + c:skill_Ice * x * 2 + m:isItThisDayOfWeek(1)*x - t:skill_Ice - t:MagDef
elecDur0
c:MagAtk * x + c:skill_Elec * x * 2 + m:isItThisDayOfWeek(2)*x - t:skill_Elec - t:MagDef
windDur0
c:MagAtk * x + c:skill_Wind * x * 2 + m:isItThisDayOfWeek(3)*x - t:skill_Wind - t:MagDef
lifeDur0
c:MagAtk * x + c:skill_Life * x * 2 + m:isItThisDayOfWeek(4)*x - t:skill_Life - t:MagDef
ruinDur0
c:MagAtk * x + c:skill_Ruin * x * 2 + m:isItThisDayOfWeek(5)*x - t:skill_Ruin - t:MagDef
fireDurMax
c:MagAtk * x + c:skill_Fire * x * 2
iceDurMax
c:MagAtk * x + c:skill_Ice * x * 2
elecDurMax
c:MagAtk * x + c:skill_Elec * x * 2
windDurMax
c:MagAtk * x + c:skill_Wind * x * 2
lifeDurMax
c:MagAtk * x + c:skill_Life * x * 2
ruinDurMax
c:MagAtk * x + c:skill_Ruin * x * 2
magicAcc
97 + c:MagAtk - d:tMagicEva
magicProjectileAcc
c:Acc * 97 + c:MagAtk - d:tMagicEva - t:PhysEva * m:evaFacing - d:darkAccPenalty - m:evaFacingMod
magicAccFacing
100 - d:tMagicEva * m:evaFacing
tMagicEva
t:MagEva - t:MagEva * t:itchy * sa:soulpierce
fireAcc
99 + c:skill_Fire - d:tMagicEva
fireProjectileAcc
c:Acc * 99 + c:skill_Fire - d:tMagicEva - t:PhysEva * m:evaFacing - d:darkAccPenalty - m:evaFacingMod
iceAcc
99 + c:skill_Ice - d:tMagicEva
iceProjectileAcc
c:Acc * 99 + c:skill_Ice - d:tMagicEva - t:PhysEva * m:evaFacing - d:darkAccPenalty - m:evaFacingMod
elecAcc
99 + c:skill_Elec - d:tMagicEva
elecProjectileAcc
c:Acc * 99 + c:skill_Elec - d:tMagicEva - t:PhysEva * m:evaFacing - d:darkAccPenalty - m:evaFacingMod
windAcc
99 + c:skill_Wind - d:tMagicEva
windProjectileAcc
c:Acc * 99 + c:skill_Wind - d:tMagicEva - t:PhysEva * m:evaFacing - d:darkAccPenalty - m:evaFacingMod
lifeAcc
99 + c:skill_Life - d:tMagicEva
lifeProjectileAcc
c:Acc * 99 + c:skill_Life - d:tMagicEva - t:PhysEva * m:evaFacing - d:darkAccPenalty - m:evaFacingMod
ruinAcc
99 + c:skill_Ruin - d:tMagicEva
ruinProjectileAcc
c:Acc * 99 + c:skill_Ruin - d:tMagicEva - t:PhysEva * m:evaFacing - d:darkAccPenalty - m:evaFacingMod
reviveAcc
100 * m:incapped * m:sameHostile
breakableEquipShatterBonus
dMin0:breakableArmsShatterBonus + dMin0:breakableArmorShatterBonus
breakableArmsShatterBonus
m:tBrokenWeapon
breakableArmorShatterBonus
m:tArmored - m:tBreakableArmor
mightyBlockDef
27 - dMin0:mightyBlockDefPenalty
mightyBlockDefPenalty
c:recentlyBlocked * c:recentlyBlocked * 0.5 - 3
lifeMirrorAmt
-m:cLastDmgTakenVsHalfLifeSkill
tHPBasedDmgMax5
-m:tHPBasedMax5
vendorXPPerDay
1 + 3 * actorWithDialogNodeID:sport_training
gpCollectFromPort
gPlusLocIDTimeSince:gpCollect_ * d:gpCollectFromPortPerTime / 24
gpPerXP
1/2000
baseGPPerVendor
6
museumGPPerDay
m:museumValue * 0.008
gpCollectFromPortPerTime
1 + actorWithDialogNodeID:questgiver * d:baseGPPerVendor + getVendorTotalXP:questgiver * d:gpPerXP + actorWithDialogNodeID:sport_merchant_smithy * d:baseGPPerVendor + getVendorTotalXP:sport_merchant_smithy * d:gpPerXP +actorWithDialogNodeID:cafe * d:baseGPPerVendor + getVendorTotalXP:cafe * d:gpPerXP + actorWithDialogNodeID:shipwright * d:baseGPPerVendor + getVendorTotalXP:shipwright * d:gpPerXP + actorWithDialogNodeID:merchant_items * d:baseGPPerVendor + getVendorTotalXP:merchant_items * d:gpPerXP + actorWithDialogNodeID:harbor * d:baseGPPerVendor + getVendorTotalXP:harbor * d:gpPerXP + actorWithDialogNodeID:sport_museum * d:museumGPPerDay + getVendorTotalXP:sport_museum * d:gpPerXP+ actorWithDialogNodeID:sport_training * d:baseGPPerVendor + getVendorTotalXP:sport_training * d:gpPerXP
Appendix: FormulaGlobal (4 / 4)
ID
Formula
mpCostMod
0
mpCostMult
1
chargeTimeMod
0
chargeTimeMult
1
mpCostMod_onlyWithCT
0 + sa:quickCast * 2
mpCostMult_onlyWithCT
1 + sa:quickCast * 0.43
chargeTimeMod_onlyWithMP
0 - sa:quickCast * 0.035 * c:actTime
chargeTimeMult_onlyWithMP
1
Appendix: Support Abilities (1 / 7)
This lists all hardcoded Support Abilities. NOTE: THEY ARE NOT IN THE SAME FORMAT THAT MOD SUPPORT ABILITIES SHOULD BE. This is merely a list for reference sake; if you copy paste one of them into a mod file it will crash.

Their Actions are stored separately in actions_support.txt.

SAILOR
name = "Salty Dog"; tooltip = "Wet status lasts half as long on you, and your weapon attacks do 20% more damage to Wet targets."; icon = "iconP_Sai_saltyDog"; XPCostUnlock = 250; reactions.Add(new ElementReaction("wet", "", 0.5f, 1));
name = "Sea Legs"; tooltip = "Gain +1 <icon=moveDistance> when you start your turn adjacent to water."; reactions.Add(new ElementReaction(Element.timerUp, "", 0, 0, "seaLegs_act")); icon = "iconP_Sai_seaLegs"; XPCostUnlock = 350;
name = "Counter Push"; tooltip = "Push anyone who hits you with a melee weapon.<adjX=6>Pushes 3 tiles.<n=>(Can't use with other melee counters.)"; reactions.Add(new ElementReaction(Element.melee, "", 1, 1, "counterPush_act")); reactions[0].aiRatingMod = 0; icon = "iconP_Sai_counterPush"; XPCostUnlock = 150; supportAbilsToReplace.Add("counter"); supportAbilsToReplace.Add("counterFrenzy"); supportAbilsToReplace.Add("counterBreak"); supportAbilsToReplace.Add("counterWarp"); supportAbilsToReplace.Add("lifeMirror");

WARRIOR
name = "Valiant"; tooltip = "Do 15% more damage when attacking an enemy from the front with a weapon."; icon = "iconP_Wa_valiant"; XPCostUnlock = 350;
name = "Combat Ready"; tooltip = "Start combat with a morale boost for <icon=time>70."; reactions.Add(new ElementReaction(Element.combatStart, "", 0, 0, "combatReady_act")); icon = "iconP_Wa_combatready"; XPCostUnlock = 175;
name = "Counter"; tooltip = "Attack anyone who hits you with a melee weapon. Deals half damage.<n=>(Can't use with other melee counters.)"; reactions.Add(new ElementReaction(Element.melee, "", 1, 1, "counter_act")); reactions[0].aiRatingMod = -2; icon = "iconP_Wa_counter"; XPCostUnlock = 350; supportAbilsToReplace.Add("counterPush"); supportAbilsToReplace.Add("counterFrenzy"); supportAbilsToReplace.Add("counterBreak"); supportAbilsToReplace.Add("counterWarp"); supportAbilsToReplace.Add("lifeMirror");


SCOUT
name = "Quick Hands"; tooltip = "If you don't act, or you spend your combat action moving items, your next turn comes<n=>20%<adjX=2><icon=time> sooner. (Usually +5<adjX=2><icon=time>)"; reactions.Add(new ElementReaction(Element.endTurn, "", 1, 1, "quickHands_act")); icon = "iconP_Sc_quickHands"; XPCostUnlock = 150; supportAbilsToReplace.Add("heavyBandolier");
name = "Medic"; tooltip = "Increase healing done with bandages, splints, and First Aid by 50%."; icon = "iconP_Sc_medic"; XPCostUnlock = 250;
name = "Critical Mobility"; tooltip = "Gain +2 <icon=moveDistance> for <icon=time>35 when hit into critical condition (25% HP or less)."; reactions.Add(new ElementReaction(Element.physical, "", 1, 1, "criticalSpeed_act")); reactions[0].element.Add(Element.magic); icon = "iconP_Sc_criticalSpeed"; XPCostUnlock = 100;

SCHOLAR
name = "Elementary"; tooltip = "When you end your turn, the nearest creature directly in front of you has its current elemental resistances and weaknesses revealed."; icon = "iconP_Sch_elementary"; reactions.Add(new ElementReaction(Element.endTurn, "", 1, 1, "elementary_act")); XPCostUnlock = 75; canBeGivenToAI = false;
name = "Teacher"; tooltip = "At the start of your turn, adjacent allies gain 3<icon=MP>."; icon = "iconP_Sch_teacher"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "teacher_act")); XPCostUnlock = 300;
name = "Meditative"; tooltip = "When you end your turn without acting, gain +3 <icon=MagDef> until your next turn."; icon = "iconP_Sch_meditative"; reactions.Add(new ElementReaction(Element.noActionTaken, "", 1, 1, "meditative_act")); XPCostUnlock = 150;

BRAWLER
name = "Thousand Fists"; tooltip = "If your offhand is a fist weapon, make an extra punch with it for 50% damage when attacking."; tooltipIcons = "<icon=skill_Fist>Only"; icon = "iconP_Bra_thousandFists"; reactions.Add(new ElementReaction(Element.weaponBuff, "", 1, 1, "thousandFists_act")); XPCostUnlock = 700;
name = "Brawl Master"; tooltip = "At the start of combat, gain a <icon=PhysEva> bonus equal to 5x your lowest <icon=skill_Fist><icon=skill_Dagger> skill for <icon=time>300."; icon = "iconP_Bra_brawlMaster"; reactions.Add(new ElementReaction(Element.combatStart, "", 0, 0, "brawlMaster_act")); XPCostUnlock = 350;
name = "Iron Hands"; tooltip = "Bare handed punches deal<n>1 + half your <icon=skill_Fist> skill extra damage."; icon = "iconP_Bra_ironHands"; XPCostUnlock = 200;

BERSERKER
name = "Vicious"; tooltip = "Do bonus damage when attacking an enemy with worse morale than you (ranging from +8% to +32% damage)."; icon = "iconP_Ber_vicious"; XPCostUnlock = 400;
name = "Imposing"; effects.Add(new ActorValueEffect("imposing", "priority", 0.5f)); tooltip = "Enemies value attacks against you 50% more than against other targets."; icon = "iconP_Ber_imposing"; XPCostUnlock = 250; canBeGivenToAI = false;
name = "Counter Frenzy"; tooltip = "Attack everyone around you for 80% damage when you are hit by a melee weapon.<n=>(Can't use with other melee counters.)"; reactions.Add(new ElementReaction(Element.melee, "", 1, 1, "counterFrenzy_act")); reactions[0].aiRatingMod = -2; icon = "iconP_Ber_counterFrenzy"; XPCostUnlock = 350; supportAbilsToReplace.Add("counter"); supportAbilsToReplace.Add("counterWarp"); supportAbilsToReplace.Add("counterPush"); supportAbilsToReplace.Add("counterBreak"); supportAbilsToReplace.Add("lifeMirror");
Appendix: Support Abilities (2 / 7)
GLADIATOR
name = "Counter Throw"; tooltip = "Throw your weapon at anyone who hits you with a ranged attack. Max range is based on your skill with Hurl Weapon.<n=>(Can't use with other ranged counters.)"; tooltipIcons = "<icon=noRanged>"; icon = "iconP_Gla_counterThrow"; reactions.Add(new ElementReaction(Element.ranged, "", 1, 1, "counterThrow_act")); reactions[0].aiRatingMod = 0; XPCostUnlock = 200; supportAbilsToReplace.Add("counterShot"); supportAbilsToReplace.Add("lifeMirror"); canBeGivenToAI = false;
name = "Weapon Master"; tooltip = "At the start of combat, gain a <icon=PhysAtk> bonus equal to your lowest <icon=skill_Sword><icon=skill_Axe><icon=skill_Hammer><icon=skill_Spear><icon=skill_Flail> skill for <icon=time>300."; icon = "iconP_Gla_weaponMaster"; reactions.Add(new ElementReaction(Element.combatStart, "", 0, 0, "weaponMaster_act")); XPCostUnlock = 350;
name = "Reckless"; tooltip = "Start your first turn of combat with +5<icon=PhysAtk> and -2<icon=PhysDef>."; icon = "iconP_Gla_reckless"; reactions.Add(new ElementReaction(Element.combatStart, "", 0, 0, "reckless_act")); XPCostUnlock = 150;
name = "Timed Hits"; tooltip = "Your weapon attacks deal +25% damage if you press the 'Use' ( <keybind=use> ) button just before damage is dealt."; icon = "iconP_Gla_timedHits"; effects.Add(new ActorValueEffect("timedHits", "timedHitPowerMult", 25)); XPCostUnlock = 175; canBeGivenToAI = false;

RAVAGER
name = "Critical Destroy"; tooltip = "Instantly kill all nearby enemies with 10<icon=HP>HP or less when hit into critical condition. Range is determined by your skill with Destroy."; icon = "iconP_Rav_criticalDestroy"; reactions.Add(new ElementReaction(Element.physical, "", 1, 1, "criticalDestroy_act")); reactions[0].element.Add(Element.magic); reactions[0].actorValues.Add("HP"); XPCostUnlock = 160;
name = "Indomitable"; tooltip = "Disable and Immobilize effects last half as long on you."; icon = "iconP_Rav_indomitable"; reactions.Add(new ElementReaction("immob", "", 0.5f, 1)); reactions[0].actorValues.Add("disable"); XPCostUnlock = 400;
name = "Revel"; tooltip = "Gain a morale boost for <icon=time>50 when an enemy gets KO'd during your turn."; icon = "iconP_Rav_revel"; reactions.Add(new ElementReaction(Element.enemyKOd, "", 1, 1, "revel_act")); XPCostUnlock = 300;

GUARDIAN
name = "Bulwark"; tooltip = "Gain immunity to pushes, pulls, rotating effects, and negative morale."; icon = "iconP_Gu_bulwark"; reactions.Add(new ElementReaction(Element.any, "", 0, 0)); reactions[0].actorValues.Add("push"); reactions[0].actorValues.Add("push_safe"); reactions[0].actorValues.Add("pull"); reactions[0].actorValues.Add("rotate"); reactions.Add(new ElementReaction("morale", "", 0, 1)); XPCostUnlock = 80;
name = "Shield Bash"; tooltip = "Follow up attacks with a push from your shield."; tooltipIcons = "<icon=skill_Shield>Only"; icon = "iconP_Gu_shieldBash"; reactions.Add(new ElementReaction(Element.weaponBuff, "", 1, 1, "shieldBash_act")); XPCostUnlock = 450;
name = "Blockade"; tooltip = "When you end your turn, inflict -1 <icon=moveDistance> Move for a turn to any enemy directly in front of you."; icon = "iconP_Gu_blockade"; reactions.Add(new ElementReaction(Element.endTurn, "", 1, 1, "blockade_act")); XPCostUnlock = 750;
name = "Defensive"; tooltip = "When you end your turn without acting, gain +3 <icon=PhysDef> until your next turn."; icon = "iconP_Gu_defensive"; reactions.Add(new ElementReaction(Element.noActionTaken, "", 1, 1, "defensive_act")); XPCostUnlock = 150;

ROGUE
name = "Auto-Hide"; tooltip = "Become invisible at the start of combat for one turn. While invisible, enemies ignore you and your attacks are more accurate."; icon = "iconP_Ro_autoHide"; reactions.Add(new ElementReaction(Element.combatStart, "", 0, 0, "autoHide_act")); XPCostUnlock = 150; canBeGivenToAI = false;
name = "Backstabber"; tooltip = "Do 15% more damage when attacking an enemy from behind with a weapon."; icon = "iconP_Ro_backstab"; XPCostUnlock = 440;
name = "Stealth-sense"; tooltip = "When you press 'Highlight All', you can see the vision range of nearby enemies."; icon = "iconP_Ro_stealthsense"; XPCostUnlock = 120; canBeGivenToAI = false;

SHARPSHOOTER
name = "Shrapnel"; tooltip = "Projectile weapon attacks deal 20% damage to adjacent enemies."; tooltipIcons = "<icon=noMelee>"; icon = "iconP_Sha_ricochet"; reactions.Add(new ElementReaction(Element.weaponBuff, "", 1, 1, "ricochet_act")); XPCostUnlock = 650;
name = "Artillery"; tooltip = "Gain +2 skill with <icon=skill_Bow><icon=skill_Aim> at the cost of -1 <icon=moveDistance>."; icon = "iconP_Sha_artillery"; effects.Add(new ActorValueEffect("artillery", "skill_Bow", 2)); effects.Add(new ActorValueEffect("artillery", "skill_Aim", 2)); effects.Add(new ActorValueEffect("artillery", "moveDistance", -1)); XPCostUnlock = 150; canBeGivenToAI = false;
name = "Counter Shot"; tooltip = "Shoot anyone who hits you with a ranged weapon.<n=>(Can't use with other ranged counters.)"; tooltipIcons = "<icon=noMelee>"; reactions.Add(new ElementReaction(Element.ranged, "", 1, 1, "counterShot_act")); reactions[0].aiRatingMod = -2; icon = "iconP_Sha_counterShot"; XPCostUnlock = 325; supportAbilsToReplace.Add("counterThrow"); supportAbilsToReplace.Add("lifeMirror");

STORMSHOT
name = "Suppressive Fire"; tooltip = "Your ranged attacks inflict<n=>-1 <icon=time>Time to Act."; tooltipIcons = "<icon=noMelee>"; icon = "iconP_Sto_suppressiveFire"; reactions.Add(new ElementReaction(Element.weaponBuff, "", 1, 1, "suppressiveFire_act")); XPCostUnlock = 550;
name = "Projectile Mastery"; tooltip = "Ranged attacks do half damage to you."; icon = "iconP_Sto_projectileMastery"; reactions.Add(new ElementReaction(Element.ranged, "", 0.5f, 1, "")); XPCostUnlock = 950; canBeGivenToAI = false;
name = "Spiral Current"; tooltip = "Weapon accuracy is increased by +1.5% per <icon=skill_Wind>Skill."; icon = "iconP_Sto_spiralCurrent"; XPCostUnlock = 250;

SWASHBUCKLER
name = "Man of War"; tooltip = "When you reload or attack with a melee weapon, reload the weapon in your other hand."; tooltipIcons = ""; icon = "iconP_Swa_manOfWar"; reactions.Add(new ElementReaction(Element.weaponBuff, "", 1, 1, "manOfWar_act")); reactions.Add(new ElementReaction(Element.reloading, "", 1, 1, "doubleReload_act")); reactions.Add(new ElementReaction(Element.usedMeleeWeaponAtk, "", 1, 1, "manOfWar_act")); XPCostUnlock = 500;
name = "Swiftness"; tooltip = "Reduce <icon=time>Time to Act by 1."; icon = "iconP_Swa_swiftness"; effects.Add(new ActorValueEffect("swiftness", "actTime", -1)); XPCostUnlock = 275;
name = "Heavy Bandolier"; tooltip = "At the cost of -1 <icon=moveDistance>Move, you can rearrange & equip items freely during combat without using up your action."; icon = "iconP_Swa_heavyBandolier"; XPCostUnlock = 350; canBeGivenToAI = false; effects.Add(new ActorValueEffect("heavyBandolier", "moveDistance", -1)); supportAbilsToReplace.Add("quickHands");
Appendix: Support Abilities (3 / 7)
SAGE
name = "Green Touch"; tooltip = "At the start of your turn, adjacent allies heal 3<icon=HP> or more."; tooltipTopRight = "<icon=skill_Life_small>"; icon = "iconP_Sa_greenTouch"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "greenTouch_act")); XPCostUnlock = 350; fxEvery4Frames.Add("greenTouch_grassdust"); canBeGivenToAI = false;
name = "Pure Mind"; tooltip = "Gain immunity to Dispel, and casting cannot be interrupted (except by disabling effects such as Stun or Silence)."; icon = "iconP_Sa_pureMind"; reactions.Add(new ElementReaction("dispel", "", 0, 1)); reactions[0].actorValues.Add("charging"); reactions[0].actorValues.Add("casting"); XPCostUnlock = 80; canBeGivenToAI = false;
name = "Critical Recovery"; tooltip = "Heal 20%<icon=HP> when hit into critical condition."; icon = "iconP_Sa_criticalRecovery"; reactions.Add(new ElementReaction(Element.physical, "", 1, 1, "criticalRecovery_act")); reactions[0].element.Add(Element.magic); XPCostUnlock = 250;

WARDEN
name = "Lasting Shelter"; tooltip = "Ward, Guard, Regen, Aegis, Negate and Preserve spells last 50% longer on you."; icon = "iconP_Wrd_lastingShelter"; reactions.Add(new ElementReaction("ward", "", 1, 1.5f)); reactions[0].actorValues.Add("guard"); reactions[0].actorValues.Add("regen"); reactions[0].actorValues.Add("negate"); reactions[0].actorValues.Add("aegis"); reactions[0].actorValues.Add("preserve"); XPCostUnlock = 300;
name = "Auto-Aegis"; tooltip = "Gain 'Aegis' at the start of combat for <icon=time><math=50 + d:lifeDurMax(2)>, protecting you from one negative status effect."; icon = "iconP_Wrd_autoAegis"; reactions.Add(new ElementReaction(Element.combatStart, "", 0, 0, "autoAegis_act")); XPCostUnlock = 250;
name = "Enduring Negate"; tooltip = "'Negate' status is not removed from you if you take half your <icon=skill_Life> skill or less in damage."; icon = "iconP_Wrd_enduringNegate"; XPCostUnlock = 250;

SORCERER
name = "Fire Adept"; tooltip = "Gain +2 skill with <icon=skill_Fire> at the cost of -1 <icon=skill_Ice><icon=skill_Elec><icon=skill_Wind>."; icon = "iconP_So_fireAdept"; effects.Add(new ActorValueEffect("fireAdept", "skill_Fire", 2)); effects.Add(new ActorValueEffect("fireAdept", "skill_Ice", -1)); effects.Add(new ActorValueEffect("fireAdept", "skill_Elec", -1)); effects.Add(new ActorValueEffect("fireAdept", "skill_Wind", -1)); XPCostUnlock = 100; canBeGivenToAI = false;
name = "Lightning Adept"; tooltip = "Gain +2 skill with <icon=skill_Elec> at the cost of -1 <icon=skill_Fire><icon=skill_Ice><icon=skill_Wind>."; icon = "iconP_So_elecAdept"; effects.Add(new ActorValueEffect("elecAdept", "skill_Fire", -1)); effects.Add(new ActorValueEffect("elecAdept", "skill_Ice", -1)); effects.Add(new ActorValueEffect("elecAdept", "skill_Elec", 2)); effects.Add(new ActorValueEffect("elecAdept", "skill_Wind", -1)); XPCostUnlock = 100; canBeGivenToAI = false;
name = "Ice Adept"; tooltip = "Gain +2 skill with <icon=skill_Ice> at the cost of -1 <icon=skill_Fire><icon=skill_Elec><icon=skill_Wind>."; icon = "iconP_So_iceAdept"; effects.Add(new ActorValueEffect("iceAdept", "skill_Fire", -1)); effects.Add(new ActorValueEffect("iceAdept", "skill_Ice", 2)); effects.Add(new ActorValueEffect("iceAdept", "skill_Elec", -1)); effects.Add(new ActorValueEffect("iceAdept", "skill_Wind", -1)); XPCostUnlock = 100; canBeGivenToAI = false;
name = "Wind Adept"; tooltip = "Gain +2 skill with <icon=skill_Wind> at the cost of -1 <icon=skill_Fire><icon=skill_Ice><icon=skill_Elec>."; icon = "iconP_So_windAdept"; effects.Add(new ActorValueEffect("windAdept", "skill_Fire", -1)); effects.Add(new ActorValueEffect("windAdept", "skill_Ice", -1)); effects.Add(new ActorValueEffect("windAdept", "skill_Elec", -1)); effects.Add(new ActorValueEffect("windAdept", "skill_Wind", 2)); XPCostUnlock = 100; canBeGivenToAI = false;
name = "Critical Focus"; tooltip = "Recover 50%<icon=MP> when hit into critical condition."; icon = "iconP_So_criticalFocus"; reactions.Add(new ElementReaction(Element.physical, "", 1, 1, "criticalFocus_act")); reactions[0].element.Add(Element.magic); XPCostUnlock = 250;

ELEMENTALIST
name = "Firewalker"; tooltip = "Heal <icon=HP> instead of taking damage from walking through fire, acid, or electric water."; icon = "iconP_Ele_elementwalker"; reactions.Add(new ElementReaction(Element.elementwalker, "", -1, 1, "")); reactions[0].fx = "briefAuraSound"; reactions.Add(new ElementReaction(Element.elementwalker_status, "", 0, 1, "")); XPCostUnlock = 175;
name = "Stone Savant"; tooltip = "Trigger Stones and similar weapons have triple their normal range and their effects are 15% stronger."; icon = "iconP_Ele_stoneSavant"; XPCostUnlock = 600;
name = "Element Master"; tooltip = "At the start of combat, gain a <icon=MagAtk> bonus equal to your lowest <thinIcon=skill_Fire><thinIcon=skill_Ice><thinIcon=skill_Elec><thinIcon=skill_Wind><thinIcon=skill_Life><thinIcon=skill_Ruin> skill for <icon=time>300."; icon = "iconP_Ele_elementMaster"; reactions.Add(new ElementReaction(Element.combatStart, "", 0, 0, "elementMaster_act")); XPCostUnlock = 450;

BLADE
name = "Fragile Edge"; tooltip = "Gain +2 skill with <icon=skill_Dagger><icon=skill_Sword><icon=skill_Axe><icon=skill_Spear> at the cost of -1<icon=PhysDef> and -5<icon=PhysEva>."; icon = "iconP_Bl_fragileEdge"; effects.Add(new ActorValueEffect("fragileEdge", "skill_Dagger", 2)); effects.Add(new ActorValueEffect("fragileEdge", "skill_Sword", 2)); effects.Add(new ActorValueEffect("fragileEdge", "skill_Axe", 2)); effects.Add(new ActorValueEffect("fragileEdge", "skill_Spear", 2)); effects.Add(new ActorValueEffect("fragileEdge", "PhysDef", -1)); effects.Add(new ActorValueEffect("fragileEdge", "PhysEva", -5)); XPCostUnlock = 150;
name = "Dual Strike"; tooltip = "If your off hand weapon is a dagger, make an extra stab with it for 50% damage when attacking."; tooltipIcons = "<icon=skill_Dagger>Only"; icon = "iconP_Bl_dualstrike"; reactions.Add(new ElementReaction(Element.weaponBuff, "", 1, 1, "dualstrike_act")); XPCostUnlock = 700;
name = "Tempest"; tooltip = "At the start of your turn, and when you use an ability that moves you, attack adjacent enemies for 15% damage."; icon = "iconP_Bl_tempest"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "tempest_act")); reactions.Add(new ElementReaction(Element.moveAbilUsed, "", 1, 1, "tempest_act")); XPCostUnlock = 600; emitFxWhileMoving = false; fxEvery4Frames.Add("tempestAura");
Appendix: Support Abilities (4 / 7)
BREAKER
name = "Counter Break"; tooltip = "Attempt to break any melee weapon that hits you. Accuracy is based on your skill with Break Weapon.<n=>(Can't use with other melee counters.)"; tooltipIcons = "<icon=bluntWeapons>Only"; reactions.Add(new ElementReaction(Element.melee, "", 1, 1, "counterBreak_act")); reactions[0].aiRatingMod = -2; icon = "iconP_Br_counterBreak"; XPCostUnlock = 300; supportAbilsToReplace.Add("counterWarp"); supportAbilsToReplace.Add("counterPush"); supportAbilsToReplace.Add("counterFrenzy"); supportAbilsToReplace.Add("counter"); supportAbilsToReplace.Add("lifeMirror");
name = "Brittle Stone"; tooltip = "Gain +2 skill with <icon=skill_Hammer><icon=skill_Flail><icon=skill_Fist><icon=skill_Shield> at the cost of -1<icon=PhysDef> and -5<icon=PhysEva>."; icon = "iconP_Br_brittleStone"; effects.Add(new ActorValueEffect("brittleStone", "skill_Hammer", 2)); effects.Add(new ActorValueEffect("brittleStone", "skill_Flail", 2)); effects.Add(new ActorValueEffect("brittleStone", "skill_Fist", 2)); effects.Add(new ActorValueEffect("brittleStone", "skill_Shield", 2)); effects.Add(new ActorValueEffect("brittleStone", "PhysDef", -1)); effects.Add(new ActorValueEffect("brittleStone
name = "Stunning Blow"; tooltip = "Stun an enemy for <icon=time>2 when you attack."; tooltipIcons = "<icon=bluntWeapons>Only"; icon = "iconP_Br_stunningBlow"; reactions.Add(new ElementReaction(Element.weaponBuff, "", 1, 1, "stunningBlow_act")); XPCostUnlock = 500;

BALANCER
name = "Geomancy"; tooltip = "Draw <icon=skill_Fire><icon=skill_Ice><icon=skill_Elec><icon=skill_Wind><icon=skill_Life> power from nearby terrain at the start of your turn, boosting the associated elemental skills.<n=>Grants +1<icon=skill_Wind>if no elemental terrain is within 2 tiles."; icon = "iconP_Ba_geomancy"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "geomancy_act")); XPCostUnlock = 600;
name = "Counter Mirror"; tooltip = "Deflect half your <icon=skill_Life> skill damage back on your attacker when hit.<n=>(Can't use with any other counters.)"; icon = "iconP_Ba_lifeMirror"; reactions.Add(new ElementReaction(Element.magic, "", 1, 1, "lifeMirror_act")); reactions[0].element.Add(Element.physical); reactions[0].actorValues.Add("HP"); reactions[0].aiRatingMod = -1; XPCostUnlock = 450; supportAbilsToReplace.Add("counter"); supportAbilsToReplace.Add("counterWarp"); supportAbilsToReplace.Add("counterPush"); supportAbilsToReplace.Add("counterFrenzy"); supportAbilsToReplace.Add("counterBreak"); supportAbilsToReplace.Add("counterShot"); supportAbilsToReplace.Add("counterThrow"); supportAbilsToReplace.Add("counterEnchant");
name = "Critical Preserve"; tooltip = "Gain 'Preserve' status when hit into critical condition."; icon = "iconP_Ba_criticalPreserve"; reactions.Add(new ElementReaction(Element.physical, "", 1, 1, "criticalPreserve_act")); reactions[0].element.Add(Element.magic); reactions[0].actorValues.Add("HP"); XPCostUnlock = 650;

UNMAKER
name = "Necromancy"; tooltip = "Draw <icon=skill_Ruin> power from bones within 2 tiles at the start of your turn."; icon = "iconP_Un_necromancy"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "necromancy_act")); XPCostUnlock = 500;
name = "Absorb Magic"; tooltip = "Gain <icon=MP>MP when damaged by a magical attack equal to half the damage taken."; icon = "iconP_Un_absorbMagic"; reactions.Add(new ElementReaction(Element.magic, "", 1, 1, "absorbMagic_act")); reactions[0].actorValues.Add("HP"); XPCostUnlock = 250;
name = "Ruin Aura"; tooltip = "At the start of your turn, adjacent enemies take <thinnerIcon=skill_Ruin>5 or more damage."; tooltipTopRight = "<icon=skill_Ruin_small>"; icon = "iconP_Un_ruinAura"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "ruinAura_act")); XPCostUnlock = 650; emitFxWhileMoving = false; fxEvery4Frames.Add("ruinAura");

DEFILER
name = "Sacrifice"; tooltip = "While Silenced, gain +6 <icon=PhysAtk>. While Blinded, gain +6 <icon=MagAtk>."; icon = "iconP_De_sacrifice"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "sacrifice_act")); XPCostUnlock = 200;
name = "Soulpierce"; tooltip = "Spells you cast against Itchy targets ignore <icon=MagEva>Resistance."; icon = "iconP_De_soulpierce"; XPCostUnlock = 660;
name = "Absorb Aura"; tooltip = "At the start of your turn, steal 3<icon=MP>MP from adjacent enemies."; icon = "iconP_De_absorbAura"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "absorbAura_act")); XPCostUnlock = 500;

TACTICIAN
name = "Commanding Aura"; tooltip = "At the start of your turn, adjacent allies gain +2 <icon=time>."; icon = "iconP_Tac_commandingAura"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "commandingAura_act")); XPCostUnlock = 350;
name = "Rush Gambit"; tooltip = "At the start of combat, all allies gain +1 <icon=moveDistance> in exchange for -3<icon=PhysDef><icon=MagDef> for <icon=time>40."; icon = "iconP_Tac_rushGambit"; reactions.Add(new ElementReaction(Element.combatStart, "", 1, 1, "rushGambit_act")); XPCostUnlock = 250; supportAbilsToReplace.Add("defenseGambit");
name = "Defense Gambit"; tooltip = "At the start of combat, all allies gain +3<icon=PhysDef><icon=MagDef> in exchange for -1 <icon=moveDistance> for <icon=time>40."; icon = "iconP_Tac_defenseGambit"; reactions.Add(new ElementReaction(Element.combatStart, "", 1, 1, "defenseGambit_act")); XPCostUnlock = 250; supportAbilsToReplace.Add("rushGambit");
name = "Pensive"; tooltip = "When you end your turn without acting, gain +2 <icon=MagAtk> until the end of your next turn."; icon = "iconP_Tac_pensive"; reactions.Add(new ElementReaction(Element.noActionTaken, "", 1, 1, "pensive_act")); XPCostUnlock = 200;

MINSTREL
name = "Battle Caster"; tooltip = "Gain +35%<icon=PhysEva> while casting a spell or charging an ability."; icon = "iconP_Min_battleCaster"; reactions.Add(new ElementReaction("casting", "", 1, 1, "battleCaster_act")); reactions[0].actorValues.Add("charging"); reactions.Add(new ElementReaction(Element.endTurn, "", 1, 1, "battleCaster_act")); XPCostUnlock = 250;
name = "Cheerful"; tooltip = "When you end your turn with positive morale, adjacent allies gain a morale boost for <icon=time>35."; icon = "iconP_Min_cheerful"; reactions.Add(new ElementReaction(Element.endTurn, "", 1, 1, "cheerful_act")); XPCostUnlock = 175;
name = "Critical Oath"; tooltip = "Gain Ward, Guard, and a morale boost for <icon=time>35 when hit into critical condition."; reactions.Add(new ElementReaction(Element.physical, "", 1, 1, "criticalOath_act")); reactions[0].element.Add(Element.magic); icon = "iconP_Min_criticalOath"; XPCostUnlock = 200;
Appendix: Support Abilities (5 / 7)
ENCHANTER
name = "Counter Enchant"; tooltip = "When struck by <icon=skill_Fire><thinIcon=skill_Ice><thinIcon=skill_Elec><thinIcon=skill_Wind>, enchant yourself with that element.<n=>(Can't use with Counter Mirror.)"; icon = "iconP_En_counterEnchant"; reactions.Add(new ElementReaction(Element.fire, "", 1, 1, "counterEnchant_fire_act")); reactions.Add(new ElementReaction(Element.ice, "", 1, 1, "counterEnchant_ice_act")); reactions.Add(new ElementReaction(Element.lightning, "", 1, 1, "counterEnchant_elec_act")); reactions.Add(new ElementReaction(Element.wind, "", 1, 1, "counterEnchant_wind_act")); reactions[0].aiRatingMod = -1; reactions[1].aiRatingMod = -1; reactions[2].aiRatingMod = -1; reactions[3].aiRatingMod = -1; XPCostUnlock = 300; supportAbilsToReplace.Add("lifeMirror");
name = "Essence Flow"; tooltip = "When you have exactly 1 <icon=MP>MP, your <icon=MP>MP instantly refills."; icon = "iconP_En_essenceFlow"; reactions.Add(new ElementReaction(Element.any, "MP", 1, 1, "essenceFlow_act")); reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "essenceFlow_act")); XPCostUnlock = 500;
name = "Siphon Enchant"; tooltip = "When enchanted, you gain +4 to the relevant <icon=skill_Fire><thinIcon=skill_Ice><thinIcon=skill_Elec><thinIcon=skill_Wind> skill instead."; icon = "iconP_En_siphonEnchant"; reactions.Add(new ElementReaction("fireWpn", "", 1, 1, "siphonEnchant_fire_act")); reactions.Add(new ElementReaction("iceWpn", "", 1, 1, "siphonEnchant_ice_act")); reactions.Add(new ElementReaction("elecWpn", "", 1, 1, "siphonEnchant_elec_act")); reactions.Add(new ElementReaction("windWpn", "", 1, 1, "siphonEnchant_wind_act")); canBeGivenToAI = false; XPCostUnlock = 250;

SPELL ARCHON
name = "Magic Residue"; tooltip = "When you fire a projectile, allies adjacent to the target recover 3<icon=MP>."; tooltipIcons = "<icon=noMelee>"; icon = "iconP_Sp_residue"; reactions.Add(new ElementReaction(Element.weaponBuff, "", 1, 1, "residue_act")); XPCostUnlock = 350;
name = "Imbue Momentum"; tooltip = "Your weapon attacks deal extra damage the further the target is from you (+3% per tile)."; icon = "iconP_Sp_imbueMomentum"; XPCostUnlock = 600;
name = "Imbue Augments"; tooltip = "Trigger stones within your weapons deal +2 damage and have +10% accuracy."; icon = "iconP_Sp_empowerAugment"; XPCostUnlock = 475;

SHIFTCLOAK
name = "Distracting Aura"; tooltip = "At the start of your turn, adjacent enemies are turned around 90 degrees."; icon = "iconP_Shi_distractingAura"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "distractingAura_act")); XPCostUnlock = 200; emitFxWhileMoving = false; fxEvery4Frames.Add("distractingAura");
name = "Adaptability"; tooltip = "You can change your secondary skillset or passives during combat (doing so uses up your action for that turn)."; icon = "iconP_Shi_adaptability"; XPCostUnlock = 750; canBeGivenToAI = false;
name = "Melee Momentum"; tooltip = "The further your target is from where you started your turn, the more damage your melee weapons deal (+2% per tile)."; tooltipIcons = "<icon=noRanged>"; icon = "iconP_Shi_meleeMomentum"; XPCostUnlock = 600;
name = "Rolling Reload"; tooltip = "When you use an ability that moves you, reload both equipped weapons."; tooltipIcons = ""; icon = "iconP_Shi_rollingReload"; reactions.Add(new ElementReaction(Element.moveAbilUsed, "", 1, 1, "doubleReload_instant_act")); XPCostUnlock = 500;

GATEKEEPER
name = "Voidlight"; tooltip = "A gate to the bright sky creates perpetual light for you."; icon = "iconP_Ga_sunGate"; effects.Add(new ActorValueEffect("sunGate", "light", 1)); //spawns brightOrb on the player XPCostUnlock = 220; canBeGivenToAI = false;
name = "Gate Hand"; tooltip = "Using Gate magic, you can interact with objects far away from you, even during combat."; icon = "iconP_Ga_gateHand"; XPCostUnlock = 360; canBeGivenToAI = false;
name = "Realmsense"; tooltip = "You can see distant areas using the <keybind=leftArrow><adjX=2>, <keybind=rightArrow><adjX=2>, <keybind=upArrow> & <keybind=downArrow> keys."; icon = "iconP_Ga_realmsense"; XPCostUnlock = 150; canBeGivenToAI = false;

WARPBLADE
name = "Warplash"; tooltip = "Melee weapon attacks deal 20% damage to adjacent enemies."; tooltipIcons = "<icon=noRanged>"; icon = "iconP_Wb_warplash"; reactions.Add(new ElementReaction(Element.weaponBuff, "", 1, 1, "warplash_act")); XPCostUnlock = 650;
name = "Counter Warp"; tooltip = "Teleport behind and then attack anyone who hits you with a melee weapon. Deals half damage.<n=>(Can't use with other melee counters.)"; reactions.Add(new ElementReaction(Element.melee, "", 1, 1, "counterWarp_act")); reactions[0].aiRatingMod = -2; icon = "iconP_Wb_counterWarp"; XPCostUnlock = 350; supportAbilsToReplace.Add("counter"); supportAbilsToReplace.Add("counterPush"); supportAbilsToReplace.Add("counterFrenzy"); supportAbilsToReplace.Add("counterBreak"); supportAbilsToReplace.Add("lifeMirror");
name = "Gate Leap"; tooltip = "Use Gates to jump over obstacles, granting +2<icon=jumpDistance> Jump."; icon = "iconP_Wb_gateLeap"; effects.Add(new ActorValueEffect("gateleap", "jumpDistance", 2)); XPCostUnlock = 400;

GATEWARDER
name = "Critical G. Shield"; tooltip = "Gain a Gate Shield while in critical condition."; reactions.Add(new ElementReaction(Element.physical, "", 1, 1, "criticalGShield_act")); reactions[0].element.Add(Element.magic); reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "criticalGShield_act")); icon = "iconP_gateW_critGShield"; XPCostUnlock = 275;
name = "Gate Adept"; tooltip = "Gain +1 range with all Gate spells at the cost of -1 <icon=moveDistance> Move."; effects.Add(new ActorValueEffect("gateAdept", "moveDistance", -1)); icon = "iconP_gateW_gateAdept"; XPCostUnlock = 800;
name = "Resistant"; tooltip = "When you take magic damage, your <icon=MagEva> Resistance doubles until your next turn."; reactions.Add(new ElementReaction(Element.magic, "", 1, 1, "resistant_act")); icon = "iconP_gateW_resistant"; XPCostUnlock = 450;

BOMBARDIER
name = "Bomb Mastery"; tooltip = "Remote devices only deal 15% damage to you."; icon = "iconP_Bom_mechMastery"; reactions.Add(new ElementReaction(Element.mechanistAbil, "", 0.15f, 1, "")); XPCostUnlock = 150; canBeGivenToAI = false;
name = "Tool Talent"; tooltip = "Increases dart and minibomb range by 1 and damage by 50% or more."; icon = "iconP_Bom_toolTalent"; XPCostUnlock = 300;
name = "Active Arms"; tooltip = "Your projectile weapon attacks Activate adjacent devices."; icon = "iconP_Bom_activeArms"; reactions.Add(new ElementReaction(Element.weaponBuff, "", 1, 1, "activeArms_act")); XPCostUnlock = 400; canBeGivenToAI = false;
Appendix: Support Abilities (6 / 7)
MECHANIST
name = "Augment Charger"; tooltip = "After attacking with a weapon that has a <icon=skill_Fire><thinIcon=skill_Ice><thinIcon=skill_Elec><thinIcon=skill_Wind> augment, enchant yourself with that element for <icon=time>50.<n>Costs 5<icon=MP>, and won't reapply an existing enchantment."; tooltipIcons = "<icon=MP>5"; icon = "iconP_Mec_augmentCharger"; reactions.Add(new ElementReaction(Element.appliedWeaponBuffs, "", 1, 1, "augmentCharger_act")); reactions.Add(new ElementReaction(Element.usedMeleeWeaponAtk, "", 1, 1, "augmentCharger_act")); XPCostUnlock = 475; canBeGivenToAI = false;
name = "Ability Scanner"; tooltip = "You can view enemies' known class abilities in the tooltip by hovering over them."; icon = "iconP_Mec_abilityScanner"; XPCostUnlock = 150;
name = "Essence Converter"; tooltip = "Receive half as much healing, but healing also restores <icon=MP>MP."; icon = "iconP_Mec_essenceConverter"; reactions.Add(new ElementReaction("HP", "", 1, 0.5f, "essenceConverter_act")); XPCostUnlock = 550; canBeGivenToAI = false;

IGNIS KNIGHT
name = "Smolder"; tooltip = "Take half damage from 'Burn', but it lasts twice as long."; icon = "iconP_iK_smolder"; XPCostUnlock = 250; reactions.Add(new ElementReaction("burn", "", 2, 2)); reactions.Add(new ElementReaction(Element.burnStatus, "", 0.5f));
name = "Purifire"; tooltip = "Being afflicted by 'Burn' cures all other negative statuses."; reactions.Add(new ElementReaction("burn", "", 1, 1, "purifire_act")); reactions[0].aiRatingMod = 0; icon = "iconP_iK_purifire"; XPCostUnlock = 300;
name = "Firewall"; tooltip = "At the end of your turn, gain +1 <icon=PhysDef><icon=MagDef> for each fiery object adjacent to you."; reactions.Add(new ElementReaction(Element.endTurn, "", 1, 1, "firewall_act")); icon = "iconP_iK_firewall"; XPCostUnlock = 550;

KRAKENSLAYER
name = "Brutal Reach"; tooltip = "Do 12% more damage with melee weapon attacks against non-adjacent targets."; icon = "iconP_Kra_brutalReach"; XPCostUnlock = 375;
name = "Giantkiller"; tooltip = "Melee weapon attacks also inflict 3% of the target's Max HP damage."; icon = "iconP_Kra_giantKiller"; XPCostUnlock = 770;
name = "Static Buildup"; tooltip = "When pushed, pulled, or you use an ability that moves you, leave behind a Static Field."; icon = "iconP_Kra_staticBuildup"; reactions.Add(new ElementReaction(Element.moveAbilUsed, "", 1, 1, "staticBuildup_act")); reactions.Add(new ElementReaction("push", "", 1, 1, "staticBuildup_act")); reactions[1].actorValues.Add("pull"); XPCostUnlock = 250;

BATHANDLER
name = "Batling"; tooltip = "A loyal batling accompanies you, granting you +10%<icon=PhysEva><n>and +5% Accuracy."; icon = "iconP_Bat_batling"; XPCostUnlock = 350; effects.Add(new ActorValueEffect("batling", "PhysEva", 10)); effects.Add(new ActorValueEffect("batling", "Acc", 0.05f));
name = "Tamer"; tooltip = "When you end your turn, adjacent enemy creatures in critical condition join your side for the rest of the battle. Doesn't work on huge animals."; icon = "iconP_Bat_tamer"; reactions.Add(new ElementReaction(Element.endTurn, "", 1, 1, "tamerAdj_act")); XPCostUnlock = 250; canBeGivenToAI = false;
name = "Everswarm"; tooltip = "At the start of your turn, all enemies take 1<icon=HP> damage.<n>Can't break 'Negate'."; icon = "iconP_Bat_everswarm"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "everswarm_act")); XPCostUnlock = 750; canBeGivenToAI = false;
Appendix: Support Abilities (7 / 7)
BOAT
name = "Long Shot"; tooltip = "Cannons gain +1 range."; icon = "iconP_Ga_"; XPCostUnlock = 750;

ENEMY
name = "Alertness"; tooltip = "Gain +3 <icon=time> at the start of combat."; reactions.Add(new ElementReaction(Element.combatStart, "", 1, 1, "alertness_act")); icon = "iconP_enemy_alertness"; XPCostUnlock = 325;
name = "Wind Aura"; tooltip = "At the start of your turn, adjacent enemies are pushed away."; icon = "iconP_Bl_tempest"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "windAura_act")); XPCostUnlock = 500; emitFxWhileMoving = false; fxEvery4Frames.Add("tempestAura");
name = "Slow Start"; tooltip = "Start combat with -1 <icon=moveDistance> Move for a turn."; reactions.Add(new ElementReaction(Element.combatStart, "", 0, 0, "slowStart_act")); icon = "iconP_enemy_slowStart"; XPCostUnlock = 150;
name = "Escape Gate"; tooltip = "Use Gate magic to make an emergency getaway."; icon = "iconP_Ga_escapeGate"; reactions.Add(new ElementReaction(Element.physical, "", 1, 1, "escapeGate_act")); reactions[0].element.Add(Element.magic); reactions[0].element.Add(Element.timerUp); XPCostUnlock = 750;
name = "Escape Gate"; tooltip = "Use Gate magic to make an emergency getaway."; icon = "iconP_Ga_escapeGate"; reactions.Add(new ElementReaction(Element.physical, "", 1, 1, "criticalEscapeGate_act")); reactions[0].element.Add(Element.magic); reactions[0].element.Add(Element.timerUp); XPCostUnlock = 750;
name = "Bristling Setae"; tooltip = "At the start of your turn, adjacent enemies take 2<icon=HP> damage and become Itchy."; icon = "iconP_enemy_setaeAura"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "setaeAura_act")); XPCostUnlock = 450;
name = "Drooling"; tooltip = "Constantly drip with acidic drool."; icon = "iconP_enemy_goopDrool"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "sogbog_drool_act")); XPCostUnlock = 450;
name = "Counter Vomit"; tooltip = "Reflexively vomit on anything that attacks you."; reactions.Add(new ElementReaction(Element.magic, "", 1, 1, "sogbog_counterVomit_act")); reactions[0].element.Add(Element.physical); reactions[0].actorValues.Add("HP"); reactions[0].aiRatingMod = -2; icon = "iconP_enemy_counterVomit"; XPCostUnlock = 650; supportAbilsToReplace.Add("counter"); supportAbilsToReplace.Add("counterPush"); supportAbilsToReplace.Add("counterShot"); supportAbilsToReplace.Add("counterFrenzy"); supportAbilsToReplace.Add("counterBreak"); supportAbilsToReplace.Add("lifeMirror");
name = "Bone Hoard"; tooltip = "Gain <icon=PhysAtk><icon=MagAtk><icon=PhysDef><icon=MagDef> for <icon=time>25 from bones within 2 tiles at the start of your turn."; icon = "iconP_enemy_boneHoard"; reactions.Add(new ElementReaction(Element.timerUp, "", 1, 1, "boneHoard_act")); XPCostUnlock = 80;
name = "Brittle Armor"; tooltip = "Blunt weapon attacks permanently reduce <icon=PhysDef> by 1."; icon = "iconP_enemy_brittleArmor"; reactions.Add(new ElementReaction(Element.smash, "", 1, 1, "brittleArmor_act")); XPCostUnlock = 80;
name = "Multiscale"; tooltip = "Incoming damage is reduced by half of all previous damage taken that turn."; icon = "iconP_enemy_multiscale"; effects.Add(new ActorValueEffect("multiscale", "multihitDefense", 50, -1)); XPCostUnlock = 999;
name = "Anchored"; tooltip = "Gain immunity to pushes and pulls."; icon = "iconP_enemy_anchored"; reactions.Add(new ElementReaction(Element.any, "", 0, 0)); reactions[0].actorValues.Add("push"); reactions[0].actorValues.Add("push_safe"); reactions[0].actorValues.Add("pull"); XPCostUnlock = 80;
name = "Spore Field"; tooltip = "Start combat with full HP and dispel all status effects on the field."; reactions.Add(new ElementReaction(Element.combatStart, "", 0, 0, "gusgen_startCombat")); icon = "iconP_enemy_sporeField"; XPCostUnlock = 150;
//for use with monsters that have ranged weapons as their unarmed strike name = "Counter Shot"; tooltip = "Shoot anyone who hits you with a ranged weapon."; reactions.Add(new ElementReaction(Element.ranged, "", 1, 1, "counterShot_any_act")); reactions[0].aiRatingMod = -2; icon = "iconP_Sha_counterShot"; XPCostUnlock = 325; supportAbilsToReplace.Add("counterThrow"); supportAbilsToReplace.Add("lifeMirror");
//for use with monsters that have ranged weapons as their unarmed strike name = "Shrapnel"; tooltip = "Projectile weapon attacks can cause 30% damage to adjacent enemies."; tooltipIcons = "<icon=noMelee>"; icon = "iconP_Sha_ricochet"; reactions.Add(new ElementReaction(Element.weaponBuff, "", 1, 1, "ricochet_any_act")); XPCostUnlock = 650;
name = "Wobbly"; tooltip = "Turn to face whoever attacked you last."; reactions.Add(new ElementReaction(Element.any, "", 1, 1, "counterLookAt_act")); reactions[0].aiRatingMod = 0; icon = "iconP_enemy_look"; XPCostUnlock = 325; supportAbilsToReplace.Add("counterThrow"); supportAbilsToReplace.Add("lifeMirror");
name = "Shy"; tooltip = "Turn away from whoever attacked you last."; reactions.Add(new ElementReaction("HP", "", 1, 1, "counterLookAway_turtle_act")); reactions[0].aiRatingMod = 0; icon = "iconP_enemy_lookAway"; XPCostUnlock = 325; supportAbilsToReplace.Add("counterThrow"); supportAbilsToReplace.Add("lifeMirror");
name = "Critical Phantom"; tooltip = "Create a clone of pure magic when hit into critical condition."; icon = "iconP_enemy_criticalPhantom"; reactions.Add(new ElementReaction(Element.physical, "", 1, 1, "criticalPhantom_act")); reactions[0].element.Add(Element.magic); XPCostUnlock = 750;
23 Comments
clarkeveritas 21 Apr @ 8:35pm 
Not sure if this is up-to-date or anything, but nice guide. As someone with a little programming but not a ton- this game looks like you could pretty easily do a lot of cool stuff with it. This wouldn't be a bad place for someone to start if they were interesting in modding.
J0hñ RæmbOŠ™ 7 Jul, 2022 @ 1:00am 
Okay i tried building mode with new zone i call "wild" and i saved, but suddenly when i quit the game to rest for a couple hours then want to continue my project and tried to access my "wild" zone from "go wild" command, i got error messages... so, is my "wild" zone gone now and can't be accessed, or is there something i can do? It's not much but i rather not start again from scratch...
Oh, i seems can't find "sea" in building mode... Can i get some help here? Thank you...
Raxiael 19 Nov, 2021 @ 6:17am 
is there any way to Add Ai to companions? and thanks for the guide
Rad Codex  [author] 2 Sep, 2021 @ 12:38pm 
@Hex: nope, it's just Shift and the ` key (~) together. Although I have heard some reports of certain keyboards not registering the ` key properly, perhaps that is the issue?
Hex 2 Sep, 2021 @ 11:28am 
I dont seem to be able to bring up the console. Is there a step I must do before? Like a command line in the game shortcut or?
Rad Codex  [author] 22 Feb, 2021 @ 9:40am 
@Waiflu: It doesn't seem so. If you want to change your party size to 6 in your current save, you can enter the console command "set partySizeMod 1".

@Archmagexemnos: Thanks! : ) It is possible. You can edit existing ActorTypes or create completely new ActorTypes.
Archmagexemnos 21 Feb, 2021 @ 6:25pm 
As a fan of your previous games, the fact the you included in-depth modding support makes me super happy. It makes this game go from great to amazing! One question I have for you in regards to modding is that is it possible to make custom races? If not, is that a feature that you would consider adding? Given that we can already make custom items and classes, i feel like this would open up a ton of avenues for creative content making.
Barnabas Ballins 8 Feb, 2021 @ 6:28pm 
sooooooooooo has anyone made >5 party size mod yet? or am I missing something ingame to increase it?
Rad Codex  [author] 25 Nov, 2020 @ 6:14pm 
@ 人外スライム : yep, in order to spawn a randomized group of enemies, you have to define a SpawnData. Check out ModSamples/SpawnDataSample.txt, and feel free to send me any questions!
人外スライム 25 Nov, 2020 @ 4:34pm 
Is there any way to use the spawn trigger to spawn a randomized amount/assortment of enemies, or do you have to define spawn data for a group first?