Reference: AbilityTable.txt

Purpose

Contains all the player and NPC abilities. Note that this file controls server-side operation only. Changes to this file will not change anything in the client (like the descriptions or tooltips).

To modify the client, this table must be converted into a Squirrel script.

Note: A separate file, AbilityTableAdmin.txt, holds extra abilities for administrative use. They are not exposed to the client, but can be activated on the server side. This is merely an organizational thing, it doesn't matter if they're included into the official table or client.

Contents

Client Modding -- How to mod the client's ability table.
Event Types -- Ability event types.
Target Types -- Ability target types.
Target Status Filters -- Ability target status filters.
Ability Functions -- Documentation of all ability condition and action functions.
Other Notes -- Things to keep in mind if you're serious about ability modding.
Evaluations -- How evaluations and variables in ability functions work.

Modifying The Client's Ability Table

AbilityTable.txt must be converted into a Squirrel script file, which later must be compiled and archived.

For the purposes of conversion, the table must be limited to exactly 28 columns wide. Extra columns are used by the server but should not be included in the client.

The Squirrel table should look something like the following example, taken from the first two lines. This essentially creates an array of arrays. The main array holds each ability entry. The individual array for each ability entries contain 28 strings holding the first 28 columns of the table.

Each string must be enclosed in double quotation marks (ASCII character code 34), even if the string is empty. All text must be ASCII-style characters only, below character code 127. Higher codes such as accented characters or fancier Unicode-style opening/closing double quotes (often auto generated by modern word-processors and spreadsheet programs) may crash the client or prevent the script from being compiled or loaded correctly.

AbilityIndex <- [ ["1","Two Hand Weapons","0","0","","0","0","","0","","onActivate:Self:Status(CAN_USE_WEAPON_2H,-1)","","1","1,,0,(),K","Icon-32-Ability-W_2H_Weapons.png|Icon-32-BG-Black.png","Allows the use of Two Hand Weapons.","Weapon","0","1","1","Passive","4","0","0","2","0","",""], ["2","One Hand Weapons","0","0","","0","0","","0","","onActivate:Self:Status(CAN_USE_WEAPON_1H,-1)","","1","1,,0,(),KRD","Icon-32-Ability-W_1H_Weapons.png|Icon-32-BG-Black.png","Allows the use of One Hand Weapons.","Weapon","0","3","2","Passive","4","0","0","2","0","",""], ];

Included in the utility programs is EEUtilAbilityTable.exe (Windows only, but if necessary you can make your own converter). Copy the utility to the same folder with AbilityTable.txt, or copy the ability table to the folder you're running the utility from. It will load AbilityTable.txt from the same folder the utility is launched from, generating a new file AbilityTable.nut. Then run the following command line operation to compile the Squirrel table: sq.exe -o Abilities.cnut -c AbilityTable.nut

Ensure the Squirrel compiler did not encounter any errors. In the case of an error, find out what's wrong, maybe a formatting error or unidentified character, and try again.

Use CARDecode.exe (Windows only) and drag Catalogs.car onto the executable file to decrypt it into Catalogs.zip

Add the new version of Abilities.cnut to Catalogs.zip, replacing the existing file. Then use CARDecode.exe to encrypt it back into Catalogs.car.

Recalculate the MD5 checksum of the new Catalogs.car. A crude command line program MD5.exe is provided (Windows only) but other programs may be found online. If using this program, run the following command line: md5 Catalogs.car \Release\Current\Media > NewChecksum.txt

Take the generated hash (from NewChecksum.txt if using the above method) and copy and paste the updated line into Data\HTTPChecksum.txt.

Restart the server (required for any change to AbilityTable.txt itself). If only updating the CAR checksums, then alternatively use the Reload Checksum tool in the server's administrative panel.

Restart the client. If all steps were correct, it should now download the updated Catalogs.car and will be synchronized with the server.

Every time you modify AbilityTable.txt, the update procedure must be run again. It may be helpful to write some command line scripts to help automate this process.

Tips For Editing

This file is best edited by importing into a spreadsheet application like LibreOffice. Check to make sure what kind of quotation marks your editor program uses! LibreOffice Calc by default uses different marks for opening and closing quotation marks. These will not be loaded correctly by the server. Make sure to use ASCII quotation marks ("") instead. If necessary, you can do a find and replace to make sure that all are fixed.

Note: The bad quotation marks will look like this:
“Wrong!”

When instead they should look like this:
"Correct"

Follow established form whenever possible. Some cells require explicit values like "0" instead of being left blank with "".

The easiest way to figure out how things work is to look at existing abilities that use whatever behavior you're looking for. For example, to see how channels work, look at Healing Tendril. More complex skills like Healing Breeze are useful to examine because it has a casting warmup, channel iterations, active effect, and a secondary channel effect.

Pay close attention to syntax, punctuation, opening and closing quotes and parenthesis. They are very important and a small typo or invalid character could easily break the table, or the game client.

Data Format

Table file. Tab separated values.
Comment character: semicolon (;)
No header.
Index Property Description
0 Ability ID This forms the key of the table entry. Must be a unique number.
1 Name Ability name displayed in the tooltip.
2 Hostility Not used by the server. Not sure if used by the client either. Common values are -1, 0, or 1.
3 Warmup Time Casting warmup time, in milliseconds. If set, this distinguishes this ability as a warmup, instead of an instant cast. Example: Healing Hand
4 Warmup Cue The client effect script to play during a timed ability cast. Scripts are packaged in EarthEternal.car in the Effects folder.
5 Duration For channels, this is the duration in milliseconds. If set, this ability is considered a channel.

If you want this channel to have special effects, like running in the background or be uninterruptable, refer to the last column: Server Flags.

6 Interval For channels, this is the time between iterative effects, in milliseconds.
7 Cooldown Category Can be anything. Any abilities sharing this cooldown category name cannot be used until the cooldown expires. The actual amount of time depends on the next column. Note that different abilities may have different cooldown times, even if they share the same cooldown category.
8 Cooldown Time Time for the cooldown to expire, in milliseconds.
9 Activation Criteria A list of conditions that must be passed before an ability can be casted.

Function(arg1,arg2)[, ...]

Multiple function arguments are separated by commas.
Multiple functions are separated by commas.

10 Activation Actions A list of actions that are performed when the ability is casted.

onEvent:TargetType(range):Function1(),Function2();onEvent:[...]

onEvent: Refer to the possible Event Types.
TargetType: Refer to the possible Target Types. Some of them have a range argument in parenthesis, some do not.
Multiple function arguments are separated by commas.
Multiple functions are separated by commas.
Multple events are separated by a semicolon.

11 Visual Cue The client effect script to play when casted. This is the name of a scripted event, often specifically programmed for particular abilities, such as animations, projectile and particle effects, glows, auras, etc. Scripts are packaged in EarthEternal.car in the Effects folder.
12 Tier The ability tier. Typically one of the following values:
  1     =  Level 1
  2     =  Level 6 
  3     =  Level 20
  4     =  Level 30
  5     =  Level 40
  6     =  Level 50
  
13 Prereq A list of purchase requirements. Tier, Ability Cost, Prereq Abilities, etc). Contains up to 5 requirements, separated by commas, in the following format:

Level,CostOtherClass,CostInClass,(Abilities),Classes

Level: Character level required.

CostOtherClass: Ability point cost for cross-class skills of a different class. This value is not used by the server.

CostInClass: Ability point cost for same-class skills. This is the actual cost used by the server, for all classes.

Abilities: A list of Ability IDs that must already be purchased. Separate multiple abilities with a pipe [ | ]. This entire block is enclosed in parenthesis.

Classes: A string of characters, where each character denotes a class (Knight, Rogue, Mage, Druid). Often KRMD for all classes, but any combination is possible.

For example, here is the Prereq entry for the Blazing (mage) cross-class ability. It is level 20, costs 4 points, requires abilities 379 (Hand of Heraclitus - Tier 3) and 411 (Incinerate - Tier 3), and is open to all classes.

20,4,4,(379|411),KRMD
14 Icon Icon to display in the ability window, and buff icons. Either a single image, or two can be combined in the format of:
Foreground|Background
15 Description Description displayed in the ability tooltip. Important! You must update any skill formulas or numbers here or else the client descriptions will not match the actual values used by the server. Remember that damage mitigation and randomized damage ranges will produce different numbers in combat, too. These formulas do not include weapon or element specialization, or other effects.

To determine if damage ranges are accurate, it is recommended to test abilities with custom weapons with a min/max damage of the same value (ex: 10-10), without specializations, and against custom enemies with zero physical and elemental armor ratings. This will most easily allow a damage number in the description to match actual combat damages in game.

16 Category Which class/classification tab page this ability is found under.
17 Coordinate X Location in the ability window grid.
18 Coordinate Y Location in the ability window grid.
19 Group ID Very important. This is what groups different tiers of abilities together, and also serves to prevent multiple buff types from overlapping. Every distinct ability (for example, all tiers of Bash) should have the same group ID.
20 Ability Class Unknown/unused/obsolete in the client. If set to "Passive", the server will automatically activate this skill for the player when they log in.
21 Use Type Unknown/unused/obsolete in the client. If set to 4, the server will consider this as a passive and will automatically activate this skill for the player when they log in (redundant to Ability Class).
22 Add Melee Charge Unknown/unused/obsolete.
23 Add Magic Charge Unknown/unused/obsolete.
24 Ownage Unknown/unused/obsolete.
25 Gold Cost Cost to purchase, in copper. Presently ignored by the server.
26 Buff Category This is required for buff icons to appear in the client. If this field begins with {+,-,w} then it means Buff, Debuff, or World Buff, respectively. Not sure if the rest are important, you may need to experiment. Refer to abilities providing similar effects for reference on how this field is used. Abilities which require separate buff icons (for example Bounder Dash and a speed potion) may need to have a unique buff name, so keep that in mind too.
27 Target Status A restriction of target types to cast on. Independent from action targets. Refer to Target Filters.
28 Server Flags Optional. Custom server-side parameters. Do not include this column in the client table (Abilities.nut). Multiple options can be combined by separating them with a pipe [ | ]. Does not allow spaces. Possible flags:

secondarychannel : Runs an onIterate ability as a secondary passive channel, and will continue to function while the player uses other abilities (for example, bleeding or burning damage). Only one secondary channel can be active per character. If a secondary channel is already running, it will be replaced by the new effect.

unbreakablechannel : This channel cannot be interrupted by attacks.

allowdeadstate : Normally players cannot use abilities while dead. This will bypass that check.

Event Types

onRequest Called when an ability is first requested for activation. This is responsible for checking the activation criteria and confirming targets. If there is a warmup time, this will begin the warmup countdown.
onActivate Called when an ability actually fires. Assumes all casting conditions have been met. If there is a warmup time, it has finished.
onIterate Called during each iteration of a channelled effect.
onParry Called when a successful parry has been triggered against the target. This is a special event used for some abilities. Abilities containing this action will be automatically registered as a potential implicit action to take against an attacker when a parry is successful. This should only be used for passive abilities.

Target Types

Note! Some target types require a distance too (in parenthesis). 10 units of distance equals 1 meter in game.

Note! Even for target types that support multiple targets, the server is hardcoded with a maximum of 8 targets that can be affected at once. Ordering is not based on any criteria. The first targets found when iterating over the zone creature lists will be returning, which will be in a non-specific, undefined order.

None Nothing.
Self Always affects the caster, even if another target is selected.
ST Single target, whoever the actor has selected (could be friend or foe, other conditions must determine which are allowed). Will default to self if no target is selected (if the skill allows).
Implicit Used with the onParry event type. This is the action to perform against the actor that has parried an attack.
Party(distance) Party members within a certain distance of the caster.
Cone180(distance) Any applicable targets within a 180 degree cone directly in front of the caster.
Cone90(distance) Any applicable targets within a 90 degree cone directly in front of the caster.
GTAE(distance) Ground target area-of-effect. This is for abilities where the caster manually selects a target location (like mage's Frost Storm or druid's Swarm).
PBAE(distance) Area-of-effect surrounding the caster (like knight's Blender, druid's Nefritari's Aura)
STAE(distance) Area-of-effect surrounding the target (like mage's Cataclysm)
STXAE(distance) Area-of-effect surrounding the target, but excludes the target (like mage's Wildfire).
STP Similar to ST, but is guaranteed to default to self if no target is selected. Typically only used by the henge abilities.

Target Filter

Filters targets based on friend/foe and alive/dead conditions. Abilities cannot be performed unless at least one target is accepted (up to a maximum of 8 targets).

Dead Target must be dead, no destinction between friend or foe. Should only be used in very specific cases.
Enemy Target must be a valid combat enemy, no distinction between dead or alive. Should only be used in very specific cases.
Enemy Alive Target must be a valid combat enemy, and alive (example: pretty much any combat ability).
Friend Target must be friendly (self, party member, other players). No distinction between dead or alive. Should only be used in very specific cases.
Friend Alive Friendly target, must be alive (heals and buffs).
Friend Dead Friendly target, must be dead (resurrect).

Ability Functions

A list of all condition and action functions. Some functions accept parameters, which will be one of the following types:

Integer: A whole integer, positive or negative (1, -5, etc).
Float: Numbers which may have a decimal point (0.2, -5.0, etc).
String: Text, usually enclosed in double quotation marks.
Evaluation: Evaluates a basic mathematical expression (including some variables) into either an integer or float, depending on the function. Refer to Evaluations for which variables and operations are available.

Function Description, Parameters, Example Use
Facing() This condition is successful if the caster is facing its target (180 degrees), whether a creature or the center of a GTAE (ground target) location. Takes no parameters.

Facing()
InRange(range) This condition is successful if the caster is within range of the target creature or GTAE location.

Range: float. Units. 10 units = 1 meter

InRange(30.0)
NotSilenced() This condition is successful if the target is not silenced (does not have the SILENCE status effect. Takes no parameters.

NotSilenced()
HasStatus(effect) This condition is successful if the target has the required status effect. Refer to Status Effects. The status name should be ALL CAPS.

HasStatus(IN_COMBAT)
NotStatus(effect) This condition is successful if the target does NOT have the required status effect. Refer to Status Effects. The status name should be ALL CAPS.

NotStatus(IN_COMBAT)
Interrupt() Action. Interrupts the target's casting warmup or channel. Takes no parameters.

Interrupt()
Might(amount) This condition is successful if the caster has enough Might. If the ability cast is successful, this amount of Might will be subtracted.

Amount: Integer

Might(3)
Will(amount) This condition is successful if the caster has enough Will. If the ability cast is successful, this amount of Will will be subtracted.

Amount: Integer

Will(3)
MightCharge(min,max) This condition is successful if the caster has enough Might charges (at least as much as min). If the ability cast is successful, as many charges will be subtracted (but no more than max).

Min: Integer

Max: Integer

MightCharge(1,5)
WillCharge(min,max) This condition is successful if the caster has enough Will charges (at least as much as min). If the ability cast is successful, as many charges will be subtracted (but no more than max).

Min: Integer

Max: Integer

WillCharge(1,5)
A_AddMightCharge(amount) Adds a Might charge to the caster (or subtracts if negative).

Amount: Integer

A_AddMightCharge(1)
A_AddWillCharge(amount) Adds a Will charge to the caster (or subtracts if negative).

Amount: Integer

A_AddWillCharge(1)
T_AddMightCharge(amount) Adds a Might charge to the target (or subtracts if negative).

Amount: Evaluates to integer

T_AddMightCharge(-2)
T_AddWillCharge(amount) Adds a Will charge to the target (or subtracts if negative).

Amount: Evaluates to integer

T_AddWillCharge(-2)
StealWillCharge(amount) Action. Not present in the original game. Removes Will charges from the target and grants them to the caster. The number of charges removed is based on the target's current charge count, but will not exceed 'amount'. Must be positive.

Amount: Evaluates to integer

StealWillCharge(2)
StealMightCharge(amount) Action. Not present in the original game. Removes Might charges from the target and grants them to the caster. The number of charges removed is based on the target's current charge count, but will not exceed 'amount'. Must be positive.

Amount: Evaluates to integer

StealMightCharge(2)
FullMight() Fully replenishes the target's Might bar to maximum (10 units). Takes no parameters.

FullMight()
FullWill() Fully replenishes the target's Will bar to maximum (10 units). Takes no parameters.

FullWill()
hasMainHandWeapon This condition returns true if the caster has a weapon equipped in its main hand. Always true for NPCs. Takes no parameters.

hasMainHandWeapon
hasOffHandWeapon This condition returns true if the caster has an offhand weapon equipped. Always true for NPCs. Takes no parameters.

hasOffHandWeapon
hasMeleeWeapon This condition returns true if the caster has a melee weapon equipped. Functionally equivalent to hasMainHandWeapon. Always true for NPCs. Takes no parameters.

hasMeleeWeapon
hasRangedWeapon This condition returns true if the caster has a ranged weapon equipped. Always true for NPCs. Takes no parameters.

hasRangedWeapon
hasShield This condition is a placeholder and is not implemented. Takes no parameters. Always returns true.

hasShield
hasBow This condition returns true if the caster has a bow equipped in its ranged weapon slot. Always true for NPCs. Takes no parameters.

hasBow
has2HorPoleWeapon This condition returns true if the caster has a Two-Handed or Pole weapon equipped in its main hand slot. Always true for NPCs. Takes no parameters.

has2HorPoleWeapon
hasWand This condition returns true if the caster has a Wand equipped in its ranged weapon slot. Always true for NPCs. Takes no parameters.

hasWand
Status(effect,duration) Adds a status effect for the given duration (in seconds). If the duration is -1, it will not expire. Refer to Status Effects. The status name should be ALL CAPS.

Effect: Status effect name.

Duration: Evaluation to float. Seconds.

Status(STUN,6)
Amp(stat,percent,duration) Amplifies a stat by a percentage of its current amount. Percent is a floating point number, and may be negative. Duration may be evaluated, but is converted to whole seconds. Refer to Character Stats. Only numerical stats can be modified. The stat name should be ALL CAPS. Uses the buff category listed in column index[26] (column #27) of the ability entry.

Stat: Character stat name

Percent: Float

Duration: Evaluation to integer. Seconds

Amp(STRENGTH,0.05,3600)
Add(stat,amount,duration) Modifies a stat by specific amount, which may be either a buff or debuff. The amount may be evaluated. Duration may be evaluated, but is converted to whole seconds. If the duration is -1, it will not expire. Refer to Character Stats. Only numerical stats can be modified. The stat name should be ALL CAPS. Uses the buff category listed in column index[26] (column #27) of the ability entry.

Stat: Character stat name

Amount: Evaluation to float.

Duration: Evaluation to integer. Seconds

Add(SPIRIT,3,3600)
AmpCore(percent,duration) Amplifies each of the core stats (strength, dexterity, constitution, psyche, spirit) by a percentage of their current amounts. Percent is a floating point number, and may be negative. Duration may be evaluated, but is converted to whole seconds. Uses the buff category listed in column index[26] (column #27) of the ability entry.

Percent: Float

Duration: Evaluates to integer. Seconds.

AmpCore(-0.06,60)
Nullify(stat,duration) Negates a stat by adding a debuff for the inverse of its current value. (N + (-N) = 0). Operates on the current value only, does not take into account any other buffs that may be active. For example, if the stat changes while Nullify() is still active, the sum total of all active buff amounts would no longer equal zero. Duration may be evaluated, but is converted to whole seconds. Refer to Character Stats. Only numerical stats can be modified. The stat name should be ALL CAPS. Uses the buff category listed in column index[26] (column #27) of the ability entry.

Stat: Stat name.

Duration: Evaluates to integer. Seconds.

Nullify(WILL_REGEN,(3*willCharges))
CheckBuffLimits(level,buffcategory) Unused. The condition is not emulated and always returns true. In the original game this served to prevent abilities from functioning if a stronger buff was active. In some cases this introduced bugs where certain buffs or even attacks could not be used in some situations. The server automatically handles buff effects by denying weaker tier buffs if a stronger tier version of that ability has been casted. However, this may produce a potentially unwanted side effect where buffs or debuffs from different abilities may stack.

Level: Integer

buffcategory: Buff category name.

CheckBuffLimits(20,+/BuffMove/Buff:Run Speed)
MeleeDamage(amount) Applies physical damage. This function will not work if the caster has the DISARM status effect. The amount is evaluated. The calculated result will automatically include bonuses from the dmg_mod_melee stat, hit chance and damage reduction, and critical hit amplification if applicable. Also calculates damage reduction from the target's armor, and can be fully negated by the target's dodge/block/parry chances, if successful. Note: each call to MeleeDamage() rolls dodge/block/parry chances, so using the function multiple times might increase the chances that the final result will be negated.

Amount: Evaluates to integer

MeleeDamage((A_STRENGTH*0.112+6)*1)
FireDamage(amount) Applies fire damage. The final result will automatically include bonuses from the caster's appropriate elemental specialization, and also the target's damage reduction for that element.

Amount: Evaluates to integer

FireDamage(((A_PSYCHE*1.35+32)*1)*0.65)
FrostDamage(amount) ...
MysticDamage(amount) ...
DeathDamage(amount) ...
Heal(amount) Heals the target. Automatically includes bonuses from the caster's healing specialization.

Amount: Evaluation to integer. Hitpoints to heal.

Heal((A_SPIRIT*2.1448+20)/8)
A_Heal(amount) Heals the caster. Automatically includes healing specialization.

Amount: Evaluation to integer. Hitpoints to heal.

A_Heal(((A_SPIRIT*1.792+131)*1.2)/5)
Harm(amount) Deals direct hitpoint damage to the target. This amount is not affected by specialization or armor. Cannot achieve critical hit. Not subject to block/parry/dodge.

Amount: Evaluation to integer. Hitpoint damage to deal.

Harm(MAX_HEALTH*0.25)
PercentMaxHealth(ratio) This condition is passed if the caster has enough health, based on the ratio of current health to maximum. The ratio should be between 0.0 and 1.0

Ratio: floating point

PercentMaxHealth(0.251)
Regenerate(amount) Heals the target for a flat amount. Not affected by healing specialization. This only seems to be used for some potions in the official ability table. Typically Heal() is used instead.

Amount: Evaluation to integer.

Regenerate(8)
AttackMelee(amount) Performs a melee autoattack. Autoattacks are hardcoded and should not be used directly through the ability table.

AttackMelee(0)
AttackRanged(amount) Performs a ranged autoattack. Autoattacks are hardcoded and should not be used directly through the ability table.

AttackRanged(0)
Taunt(duration) Taunts the target to attack the caster, by forcing the target to select the caster. If the target is an NPC, it will hold its target for the specified duration even if another player has generated more hate.

Duration: Integer, time in seconds.

Taunt(4)
AddHate(amount) The target will gain a specific amount of hate toward the caster. Hate is normally generated by attacks, based on damage ((Adjusted Damage / MaxHealth) * 100). NPCs will target the most hated player for attack. Only works against NPCs.

Amount: Integer

AddHate(200)
TopHated(amount) Unknown. Not implemented. Only officially used in the Frost Mire skill, but there is no mention in the skill description of altering creature hate.

Amount: Integer

TopHated(10)
UnHate() Any hate generated by the caster is removed from all creatures in the instance, effectively returning to neutral status. This will not prevent re-aggro if the player is still within range of the creature.

UnHate()
LeaveCombat() Shuts off the caster's autoattack and disables its combat flags (IN_COMBAT, IN_COMBAT_STAND). This does not remove hate or affect other creatures in any way.

LeaveCombat()
Behind This condition is successful if the caster is behind its target. For the purposes of this calculation, behind means outside the target's 180 degree forward view cone.

Behind
Spin() Rotates the target's current directional facing by 180 degrees. This may be somewhat erratic in the client, especially on players since the client does not seem to accept forced player rotations. Creature AI immediately turns to face their target on the next frame, so this may not be very effective against the target unless it can be stunned or dazed too.

Spin()
Duration(time) Increases the duration of channel effects to match the specified time. The resulting time will be automatically constrained to fit within a limit of 1 to 32 seconds.

Time: Evaluation to integer. Seconds.

Duration(mightCharges*5)
Resurrect(healthRatio,luckRatio) Resurrect the target with the given health and luck ratios. (1.0 = 100%). If luckRatio is not provided, it defaults to maximum.

healthRatio: float

luckRatio (optional): float

Resurrect(0.4, 1)
NearbySanctuary This condition is successful if the caster is within range (25 meters) of a sanctuary.

NearbySanctuary
BindTranslocate() Binds the caster to the nearest sanctuary.

BindTranslocate()
Translocate() Warp the caster to their bound sanctuary.

Translocate()
PortalRequest(internalName,destinationName) Sends a portal request to the target. Typically used by the stonehenge abilities. Ensure that an InteractDef entry is supplied for the destination. The InteractDef's Message field must match destinationName exactly.

internalName: string. Unused.

destinationName: string. Destination.

PortalRequest("Transport_Stonehenge", "Stonehenge")
Go(destination) Unused. Not implemented. Teleports the caster to a named location.

destination: string

Go("LOC5")
GoSanctuary() Teleports the target to the nearest sanctuary. Usually called for the caster, but can be used for party members too like the Exodus skill.

GoSanctuary()
RemoveAltDebuff() Removes one of the following debuffs from the target: Negative amount stat modifiers for {MELEE_ATTACK_SPEED, MAGIC_ATTACK_SPEED, MOD_MOVEMENT}, and status effects {FEAR, CHARM, ROOT} in that order. Refer to the Free ability.

RemoveAltDebuff()
RemoveStatDebuff() Removes one of the following debuffs from the target: Negative amount stat modifiers for {STRENGTH, DEXTERITY, CONSTITUTION, PSYCHE, SPIRIT, MOD_LUCK} in that order. Refer to the Cleanse ability.

RemoveStatDebuff()
RemoveEtcDebuff() Removes one of the following debuffs from the target: Negative amount stat modifiers for {BASE_DAMAGE_FIRE, BASE_DAMAGE_FROST, BASE_DAMAGE_MYSTIC, BASE_DAMAGE_DEATH, DAMAGE_RESIST_MELEE, DAMAGE_RESIST_FIRE, DAMAGE_RESIST_FROST, DAMAGE_RESIST_MYSTIC, DAMAGE_RESIST_DEATH, BASE_HEALTH} in that order. Refer to the Purge ability.

RemoveEtcDebuff()
RemoveAltBuff() Removes one of the following buffs from the target: Positive amount stat modifiers for {MELEE_ATTACK_SPEED, MAGIC_ATTACK_SPEED, MOD_MOVEMENT}. Refer to the Suppress ability.

RemoveAltBuff()
RemoveStatBuff() Removes one of the following buffs from the target: Positive amount stat modifiers for {STRENGTH, DEXTERITY, CONSTITUTION, PSYCHE, SPIRIT, MOD_LUCK}. Refer to the Corrupt ability.

RemoveStatBuff()
RemoveEtcBuff() Removes one of the following buffs from the target: Positive amount stat modifiers for {BASE_DAMAGE_FIRE, BASE_DAMAGE_FROST, BASE_DAMAGE_MYSTIC, BASE_DAMAGE_DEATH, DAMAGE_RESIST_MELEE, DAMAGE_RESIST_FIRE, DAMAGE_RESIST_FROST, DAMAGE_RESIST_MYSTIC, DAMAGE_RESIST_DEATH, BASE_HEALTH}. Refer to the Abolish ability.

RemoveEtcBuff()
Invisible(duration,distance,unknown Activate Mage invisibility. Travel distance regeneration (when idle) is based on Psyche.

Duration: Evaluates to integer. Seconds.

Distance: Evaluates to integer. Distance units (10 = 1 meter)

Unknown: Evaluates to integer. Not used.

Invisible(120,A_PSYCHE*1,0)
WalkInShadows(duration,distance) Activate Rogue invisibility. Travel distance regeneration (when idle) is based on Dexterity.

Duration: Evaluates to integer. Seconds.

Distance: Evaluates to integer. Distance units (10 = 1 meter)

WalkInShadows(120,A_DEXTERITY*1.0)
AddWDesc(stat,iteration,time,desc) Not implemented. Probably had some effect in the client when describing iterative damage from channel ability. The description in the client's ingoing/outgoing damage filter seems be fine without this.

Stat: Stat name. Refer to Character Stats

Iteration: Evaluates to integer. Seconds between interations?

Time: Evalutes to integer. Maximum duration of channel (seconds)?

Desc: String. Alternate text to display?

AddWDesc(BLEEDING,1,8,"Shadow Strike")
HealthSacrifice(amount) Transfers hitpoints from the caster to the target. Health will not transfer if the target is at maximum HP. Only transfers as much health as the target needs, up to the specified amount. The caster will be damaged and lose HP equivalent to the transfer amount. The caster will die if they do not have enough HP to withstand the damage.

Amount: Evalutes to integer. Hitpoints.

HealthSacrifice(150)
DoNothing() Placeholder function. As the name implies, it doesn't do anything

DoNothing()
Reagent(itemID,count) Not implemented. This condition is passed if the player has enough items in their inventory, and consumes them if the ability successfully activates. This function was never implemented server-side because reagents were usually an unnecessary, stupid requirement. Always returns successful.

itemID: Integer, ItemDef mID.

count: Integer, number of items.

Reagent(20522,2)
SetAutoAttack(effect) Custom, unofficial function. Don't use this in the ability table. The function exists for internal server use only. Effect corresponds to AUTO_ATTACK or AUTO_ATTACK_RANGED.
DisplayEffect(name) Custom, unofficial function. Performs a visual effect. This can be used to simulate visual effects in cases when particular abilities are not scripted. For example, a custom ability that launches a fireball against multiple targets. The effect name must exist in the client's ability effect scripting. Not to be confused with status effects.

Name: String. Effect name.

DisplayEffect("Firebolt")
InterruptChance(amount) Custom, unofficial function. Modifies the interrupt chance of a channel performed by this ability. Internally the amount is considered as an additive bonus to CHANNELING_BREAK_CHANCE but does not alter the stat itself, and therefore does not affect the interrupt chance of other abilities.

Amount: Evaluates to integer. 10 units = 1% chance.

InterruptChance(-150)

Other Notes

These are some advanced points of interest for how some of the values are loaded from the table.

Skills that use MeleeDamage() are flagged as dealing physical damage. Skills that use FireDamage(), FrostDamage(), MysticDamage(), or DeathDamage() are flagged as dealing magic damage. Skills that are only flagged for physical (and not magic) are subject to the DISARM status effect and may prevent the caster from using the ability (if CustomAbilityMechanics is enabled, see ServerConfig.txt).

Skills default to instant cast. If the "Warmup Time" column value is greater than zero, the ability is a timed cast instead.

If the "Duration" column value is set to nonzero, the ability is considered a channel.

If the "Ability Class" column value is set to "Passive" OR the "Use Type" column value is set to 4, then the ability is considered a passive. Passive abilities are activated when a player logs in.

Skills that contain the onParry event are registered to the creature for implicit response actions when a parry is successful. Logically these should be activated as passives, since implicit events are effectively permanent and are not removed except for a relog or respec.

Concerning the client-side ability Description: A_STRENGTH and similar prefixed names seem to have a special case when used in the client. Anything following the A_ is interpreted as a Character Stat name and can be used to display information from the caster. If you're reading an ability tooltip, it's from the player's avatar stats. T_ stats have not been tested in the description field.

Evaluations

Any function parameter that is mentioned as evaluating to a float or integer will be processed as a simple expression. Expressions may contain parenthesis and basic mathematical operations: addition, subtraction, multiplication, division, and modulo division. ( + - * / % ) . Watch out for divide by zero (which will fail out a particular term with a zero value instead). If using a variable or character stat, think if there's any possibility that it might be zero.

Order of operations has not been fully tested, so if it's producing incorrect results, you may need to explicitly define them with parenthesis.

Expression may also allow the following variables which will be substituted during the evaluation process. Note: Case Sensitive!

A_STRENGTH         Caster's STRENGTH property.
A_DEXTERITY        Caster's DEXTERITY property.
A_SPIRIT           Caster's SPIRIT property.
A_PSYCHE           Caster's PSYCHE property.
A_CONSTITUTION     Caster's CONSTITUTION property.
A_LEVEL            Caster's LEVEL property (character level).
mightCharges       The number of might charges spent casting this ability.  Some abilities don't use all charges.
willCharges        The number of will charges spent casting this ability.  Some abilities don't use all charges.
MWD                Calculates melee weapon damage[*]. Mainhand + Offhand (if applicable).
RWD                Calculates ranged weapon damage[*].
WMD                Calculates melee weapon damage[*]. Does not include offhand.
MAX_HEALTH         The caster's max health.
damage             Intended for implicit actions only (parries), returns the parried damage.
Notes:
[*] These damage calculations include: Weapon item damage (from min/max), Strength bonus (30% of current strength added to damage points), Weapon Specialization, and the "base_damage_melee" stat (often used by NPCs since they don't have actual weapons). Offhand damage applies to rogues only, and includes offhand mastery percentage. These calculations are physical damage only, and are used as the base amount for autoattacks and many physical abilities. They do not include elemental bonuses to auto attacks.

The following properties are new custom features in the server:

T_mightCharges        The target's current might charges.
T_willCharges         The target's current will charges.
mightChargesCurrent   The caster's current might charges.
willChargesCurrent    The caster's current will charges.