The Guide to Almost All Non-Missile Skill Functions

Post here about all aspects of D2 mod making whether it's information, problems or whatever. Please specify whether your post is relating to Classic D2 or the Expansion.

Moderator: Nizari

Post Reply
User avatar
Cypress
Posts: 96
Joined: Fri Dec 01, 2017 2:08 am

The Guide to Almost All Non-Missile Skill Functions

Post by Cypress » Sun Sep 06, 2020 5:23 pm

I was bored and decided to check out how a bunch of skills work. This is the result. Note that I purposely did not cover most skills involving srv/cltmissilea/b/c/d because that is in a separate guide I am working on; I chose to separate them since missile skills work very distinctly and there are a ton of them.

This guide is quite lengthy (around 21 and a half pages long), so I recommend using ctrl+F to find specific skills you are interested in, each entry begins with the name of skills that use the respective function(s).

The only non-missile skills that aren't covered in this guide are: Cry Help, Diabprison, Submerge, Emerge, Self-Resurrect, Quick Strike, DiabRun, Suck Blood (I did however hybridize it and found that it was a kicking skill which is bizarre, as described below), FetishAura, Nest, EvilHutSpawner, Swarm Move and Jump; these skills either seemed to do nothing when used by a player, or cause crashes.

If you notice any errors, or any notable features given by skills that I missed, then please let me know!

THANKS: Red Havoc for explaining a lot of monster functions (viewtopic.php?t=1073), Ogodei and LadyIsabelle for finding out how broken Shadow Warrior/Master are (viewtopic.php?t=66555) and Nefarius for his description of charge-ups (viewtopic.php?t=48854), the Amazon Basin Wiki for their detailed skill descriptions

---
[ATTACKS] This section describes attacking skills.
[OTHER ATTACKS] This section describes unusual attack skills that use damage from shields or boots.
[SEQUENCE] This section describes skills that require sequences.
[SPELLS] This section describes skills that carry out some unusual function that doesn't involve weapon damage, states nor sequences.
[STATES] This section describes skills that aren't attacks but do apply states.
[PETS] This section describes skills that use the summon and pet columns.
[SUMMONS] This section describes skills that use the summon columns, but not the pet columns.
[USEFUL CLTFUNCS]
[GENERALIZED NON-FUNCTIONS] This section describes skill features that may seem as if they are unique to a function, but are in fact more generally applicable.
[LIMITED FUNCTIONS] This section describes skill functions that are seemingly worthless by being so limited in comparison to other functions that may make use of all the columns these do and more. However, in some very specialized contexts, these functions may still have uses.

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


[ATTACKS]


[ATTACK] Hardcoded so that in ID=0, it is the only skill that allows the main-hand and off-hand weapon to be swapped on each use. When in any other ID, this skill only attacks with the main-hand. Note that Attack is special in that it ALWAYS rolls chance to cast on attack, even if it misses or is blocked, even if you aren't using it in ID=0.
(srvdofunc=1)
(SrcDam=)
(note: in vanilla, it also uses srvstfunc=1, cltstfunc=1, cltdofunc=1 but these do not seem to do anything)
(note: for dual wielding, you can even remove srvdofunc=1 if it is from ID=0 and it'll still attack, but it won't swap hands)


[KICK] Always "hits" and always rolls chance to cast on attack and on striking despite not dealing any damage (descdam=2, the default, wrongly thinks it gains damage). It also always applies normal knockback.
(srvstfunc=2,srvdofunc=2)
(aurastate=,auratargetstate=,auralencalc=,aurastat1-6=; applies aurastate to the player while the animation is playing, and applies the auratargetstate to the hit target for as long as auralencalc, uses all aurastats; hitting the target again causes the state to toggle off)
(interrupt=1; if this is not set, then it will interrupt itself on subsequent uses, causing major desync issues)
(note: in vanilla, it uses cltstfunc=0, cltdofunc=0, but I do not notice any differences, and I do not even think these are valid func IDs)


[THROW] Releases the missile assigned in weapons.txt in the direction you click. Hardcoded such that Throwing Mastery stats will not apply unless the skill is ID=2.
(srvdofunc=3,cltdofunc=2)
(note: in vanilla, it has srvstfunc=65,cltstfunc=2, but these do not seem to do anything)


[LEFT HAND THROW] Releases the missile assigned in weapons.txt in the direction you click of a throwing weapon, but only if you are dual-wielding throwing weapons (trying to use this function when you are not dual-wielding will cause a crash). Hardcoded such that Throwing Mastery stats will not apply unless the skill is ID=3.
(srvdofunc=5,cltdofunc=2)
(weapsel=1; otherwise will throw your main-hand weapon)
(note: in vanilla, it has srvstfunc=65,cltstfunc=2, but these do not seem to do anything)


[Jab] Uses a sequence to release hits in melee range; if you do not use a sequence, then it will only hit according to normal animation rates.
(srvdofunc=7)
(range=h2h; recommended but not required)
(anim=SQ or other,seqnum=; you can choose not to use SQ, but then you will lose most of the special features of this skill; the seqnum changes how this skill works, for example if you use whirlwind's then it will rapidly hit for as long as you hold down, if you use jab's then it will rapidly hit three times in a row)
(clc1=damagepercent added to each hit)
(clc4=damage converted to etype; multiplies damage by every % over 100%)
(tohit,levtohit,tohitcalc)
(srcdam=,etype,emin/emax,elen)
(note: has srvstfunc=5 in vanilla, but it doesn't seem to be necessary)


[Power Strike] Attack a target and add damage, and apply states to self and target. Note that tohit,levtohit,tohitcalc do NOT work despite the vanilla skill thinking they do.
(srvstfunc=6,srvdofunc=2)
(aurastate=,auratargetstate=,auralencalc=,aurastat1-6=; applies aurastate to the player while the animation is playing, and applies the auratargetstate to a target within melee range for as long as auralencalc, uses all aurastats; hitting the target again causes the state to toggle off)
(range=h2h; recommended but not required)
(clc1=damagepercent added to each hit)
(clc4=damage converted to etype; multiplies damage by every % over 100%)
(srcdam=,etype,emin/emax,elen)

[Impale] Attack a target in melee range and modify your weapon if you successfully hit. Can apply a state to both the player and target. For non-stacked weapons, this skill can increase or decrease the durability. For stacked weapons, this skill will always reduce stack size by 1 regardless of clc3.
(srvstfunc=7,srvdofunc=2)
(aurastate=,auratargetstate=,auralencalc=,aurastat1-6=; applies aurastate to the player while the animation is playing, and applies the auratargetstate to a target within melee range for as long as auralencalc, uses all aurastats; hitting the target again causes the state to toggle off)
(range=h2h; not required but recommended)
(clc1=damagepercent added to each hit)
(clc2=chance to modify durability of your weapon)
(clc3=amount of durability to add or subtract to your weapon; positive numbers reduce durability, negative numbers increase durability; added durability can go over maxdurability; does not affect stacked weapons)
(clc4=damage converted to etype; multiplies damage by every % over 100%)
(tohit,levtohit,tohitcalc)
(srcdam=,etype=,emin/emax,elen)
(NOTE: this skill ignores stats that double damage, like deadly strike and critical strike)


[Charged Strike] Attack that releases zig-zagging missiles.
(srvstfunc=6,srvdofunc=11,cltdofunc=19)
(range=h2h; not required but recommended)
(srv/cltmissilea=; released in a zig-zag)
(clc1=number of srv/cltmissilea to release)
(clc4=damage converted to etype; multiplies damage by every % over 100%)
(srcdam=,etype=,emin/emax,elen)


[Lightning Strike] Attack that releases a chaining missile. Adds lightning damage to attacks and converts attack damage to an element of choice, making it the only skill able to do multielemental (lightning + a second, converted element) damage without using the stat columns.
(srvstfunc=10,srvdofunc=14,cltdofunc=22)
(clc1=radius to seek targets)
(clc2=number of targets to hit)
(clc4=damage converted to etype; seems to cap at around 255%)
(etype=,emin/max=; regardless of the etype it will be added to your attack as lightning damage)




[Fend] Unlike most vanilla sequenced skills, this one works fine with any anim, sequence or not, it seems to automatically go into a sequence after the first anim is finished. Attacks additional targets around you automatically, up to once each, repeating the same anim each time for each attack.
(srvstfunc=9,srvdofunc=13,cltstfunc=14,cltdofunc=21)
(range=h2h; not required but recommended)
(anim=; anything should work well, including sequences)
(clc1=number of targets within melee range to hit once each)
(clc2=damagepercent added to each hit)
(clc4=damage converted to elem; multiplies damage by every % over 100%)
(par2=frame rollback; modifies sequence speed, oddly seems like sometimes a lower value is faster and sometimes a higher value is faster, depending on the weapon and anim)
(tohit,levtohit,tohitcalc)
(srcdam=,etype=,emin/emax,elen)


[Poison Dagger] A seemingly redundant attack skill, especially given that it requires both srvstfunc and srvdofunc to be able to do anything (although you can create working hybrids with other skills).
(srvstfunc=16,srvdofunc=32)
(range=h2h; not required but recommended)
(clc1=damagepercent added to each hit)
(clc4=damage converted to elem; multiplies damage by every % over 100%)
(tohit,levtohit,tohitcalc)
(srcdam=,etype=,emin/emax,elen)


[Sacrifice] A fairly varied attack that gets flags and all of the usual columns. Does not gain damage doubling, nor damage to undead/demons.
(srvstfunc=29,srvdofunc=64)
(range=h2h; not required but recommended)
(clc1=damagepercent added to each hit)
(clc2=percent of physical damage to deal to self)
(clc4=damage converted to elem; multiplies damage by every % over 100%)
(tohit,levtohit,tohitcalc)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects)
(srcdam=,etype=,emin/emax,elen)
(note: in vanilla, it has cltdofunc=34, which allows you to release cltmissilea on each attack, but it isn't necessary for the skill to animate properly)


[Zeal][Fury] Releases a normal hit, followed by more hits that can be sped up.
(srvstfunc=37,srvdofunc=13,cltstfunc=53,cltdofunc=21)
(range=h2h; not required but recommended)
(clc1=number of hits)
(clc2=damagepercent added to each hit)
(clc4=damage converted to elem; multiplies damage by every % over 100%)
(param2=frame rollback; modifies the speed of the hits beyond the first)
(tohit,levtohit,tohitcalc)
(srcdam=,etype=,emin/emax,elen)


[Charge][SerpentCharge] Moves the user toward the selected point with a non-modifiable movement speed changer after the anim finishes, surprisingly does not require a sequence. Always attempts to cause knockback and applies the bash overlay effect.
(srvstfunc=31,srvdofunc=67,cltdofunc=37)
(clc1=damagepercent added to each hit)
(clc4=damage converted to elem; multiplies damage by every % over 100%)
(tohit,levtohit,tohitcalc)
(srcdam=,etype=,emin/emax,elen)
(note: cltstfunc=25 is used in vanilla, but does not seem to be necessary)


[Vengeance] An attack that gets most features, along with added additional fire/cold/lightning damage. Notably, it is one of the few attacks that does not allow for damage conversion.
(srvstfunc=35,srvdofunc=2)
(aurastate=,auratargetstate=,aurastat1-6=; applies aurastate to the player while the animation is playing, and applies the auratargetstate to the hit target for as long as auralencalc, uses all aurastats; hitting the target again causes the state to toggle off)
(range=h2h; not required but recommended)
(clc1=percent of base damage to add as additional fire damage)
(clc2=percent of base damage to add as additional cold damage)
(clc3=percent of base damage to add as additional lightning damage)
(tohit,levtohit,tohitcalc)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects)
(srcdam=,etype=,emin/emax,elen)


[Conversion] An attack that has a chance to convert monsters. Unfortunately, cannot apply aurastats to the converted monster.
(srvstfunc=32,srvdofunc=79)
(aurastate=,auratargetstate=,auralencalc=,aurastat1-6=; applies aurastate to the player while the animation is playing, and applies the auratargetstate to a target within melee range for as long as auralencalc; note that the aurastats only apply to the player, not to monsters even if converted)
(range=h2h; not required but recommended)
(clc1=chance to convert a monster for as long as auralencalc)
(clc4=damage converted to elem; multiplies damage by every % over 100%)
(tohit,levtohit,tohitcalc)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects)
(srcdam=,etype=,emin/emax,elen)



[Bash][Stun][Concentrate] An attack that does almost everything, including states, full clcs (damage%, drain damage, speed and conversion), elemental damage/length, hit chance and resultflags/hitflags/hitclass. This is one of the ultimate plain-attack functions.
(srvstfunc=32,srvdofunc=2)
(aurastate=,auratargetstate=,aurastat1-6=; applies aurastate to the player while the animation is playing, and applies the auratargetstate to the hit target for as long as auralencalc, uses all aurastats; hitting the target again causes the state to toggle off)
(range=h2h; not required but recommended)
(clc1=damagepercent added to each hit)
(clc2=drain damage to add to each hit; this damage only counts towards life/mana steal and is only reduced by drain resistance)
(clc3=attack rate bonus; works very unusually since it doesn't actually change the displayed animation; lower values are slower, higher values are faster; it seems like it can be slowed enough such that you won't ever hit, and can be sped up enough that your subsequent attacks will be slightly faster, but only barely; not very useful unless someone finds out cltfuncs that make it not desync)
(clc4=damage converted to elem; multiplies damage by every % over 100%)
(tohit,levtohit,tohitcalc)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects)
(srcdam=,etype=,emin/emax,elen)



[Double Swing] An attack that can increase attack rate, surprisingly does not require a sequence, so you can use it with a single weapon. Does not actually require you to dual wield.
(srvdofunc=70,cltstfunc=27; cltdofunc=39 should only be used if you are dual wielding, I think it controls the double hitting sound and maybe some other dual wielding stuff)
(range=h2h; not required but recommended)
(aurastate=,aurastat1-6=; applies aurastate to the player while the animation is playing, uses all aurastats)
(cltcalc1=cltside attack rate bonus; probably should set this to reference clc3)
(clc1=damagepercent added to each hit)
(clc3=srvside attack rate bonus; determines how much faster you actually attack; doesn't work well with certain animations so be cautious as to which weapons/anims you use and allow)
(clc4=damage converted to elem; multiplies damage by every % over 100%)
(tohit,levtohit,tohitcalc)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects)
(srcdam=,etype=,emin/emax,elen)



[Frenzy] Attack that activates a auralencalc controlled state on the second attack in a row, does not actually require two weapons, nor does it require a sequence. The aurastat values of the state can scale with the number of hits if using dm/ln/lvl, with each hit setting the stat to the max value of that given level (so the first hit is level 1, the second is level 2, etc).
(srvdofunc=9; cltdofunc=39 should only be used if dual wielding)
(range=h2h; not required but recommended)
(aurastate=,auralencalc,aurastat1-6=; applies aurastate to the player for as long as auralencalc, uses all aurastats; for aurastat clcs, lvl is equivalent to the number of hits beyond the first)
(clc1=damagepercent added to each hit)
(clc4=damage converted to elem; multiplies damage by every % over 100%)
(tohit,levtohit,tohitcalc)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects)
(srcdam=,etype=,emin/emax,elen)


[Berserk] An attack that can apply a state to self and the enemy for set, independent durations. Also applies most other features, including elemtype/len, resultflags/hitflags/hitclass, toht and a few clcs to play with.
(srvstfunc=39,srvdofunc=2)
(aurastate=,auratargetstate=,auralencalc=,aurastat1-6=; applies aurastate to the player for as long as calc2, and applies the auratargetstate to the hit target for as long as auralencalc, uses all aurastats; hitting the target again causes the state to toggle off)
(range=h2h; not required but recommended)
(clc1=damagepercent added to each hit)
(clc2=duration of aurastate on user when attacking in melee range)
(clc4=damage converted to elem; multiplies damage by every % over 100%)
(tohit,levtohit,tohitcalc)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects)
(srcdam=,etype=,emin/emax,elen)


[Feral Rage][Maul] An attack that gives the user a state that can accumulate aurastat with subsequent hits.
(srvstfunc=56,srvdofunc=120)
(range=h2h; not required but recommended)
(aurastate=,auralencalc,aurastat1-6=; applies aurastate to the player for as long as auralencalc, uses all aurastats; for aurastat clcs, lvl is equivalent to the number of hits, up to a maximum of clc2)
(clc1=damagepercent added to each hit)
(clc2=max lvl of charge; this sets it so that when you use lvl in any aurastat calculation, the lvl value will increase by 1 per attack until it hits this value)
(clc4=damage converted to elem; multiplies damage by every % over 100%)
(tohit,levtohit,tohitcalc)
(srcdam=,etype=,emin/emax,elen)


[Fists of Fire][Claws of Thunder][Blades of Ice] Allow you to build-up charges on each attack, which can be released to execute specific functions. Read viewtopic.php?t=48854 for a better explanation than I can give.
(srvdofunc=35)
(srvprgfunc1/2/3,prgcalc1/2/3,prgdam,cltprgfunc1/2/3; prgfunc allows you to control which srv/clt functions to call upon when releasing respective charges, with prgcalc1/2/3 allowing executing some specific modifications to the skill function; prgdam has a few different results depending on the input, see the above linked guide)
(aurastate=,auralencalc,aurastat1=,aurastat2=; note that the aurastate must have pgsv=1 or it won't build up charges properly)
(range=h2h; not required but recommended)
(progressive=1; otherwise it won't gain charges)
(tohit,levtohit,tohitcalc)
(srcdam=,etype=,emin/emax,elen; notably, emin/emax and elen are only released when the charges are released under prgdam 3 or 4)
(NOTE: in vanilla, these skills use srvstfunc=23, but it doesn't seem to do anything important)


[Tiger Strike][Cobra Strike][Phoenix Strike] I was unable to find any difference between these and the specific elemental charge-up functions. Notably, in vanilla these skills do not use prgstack, whereas the others do, but from what I can tell these can use prgstack by just setting it =1. If there is an actual difference in features, then I can't find it.
(srvdofunc=34)


[Dragon Claw] An attack that always acts as a finishing move; surprisingly, does not require finishing=1. Useful and versatile seeing as it has an open srvstfunc and is one of a few skills (one of two regular, weapon-based attacks; the other being Attack) that can act as a finishing move. Does not require a sequence despite using one normally.
(srvdofunc=46)
(range=h2h; not required but recommended)
(clc1=damagepercent added to each hit)
(clc4=damage converted to elem; multiplies damage by every % over 100%)
(tohit,levtohit,tohitcalc)
(srcdam=,etype=,emin/emax,elen)
(NOTE: vanilla dragon claw uses srvstfunc=25, but this doesn't seem to do anything)


[Blade Shield] This skill is described in two different sections because its function massively changes based on how you configure it, and both the srvstfunc and srvdofunc have interesting capabilities. This section describes Blade Shield's srvdofunc, it is perhaps the most unique attack skill in the game. It deals area of effect damage, every hit of which to each monster can apply effects, so you can trigger ctc on attack or striking numerous times in a single use. It also gains mindam/maxdam, which no other non-kicking attack skills gain. Unfortunately, this attack has the same range constraints as the state-based Blade Shield, which makes it really awkward to use with any weapon with added melee range (the only vanilla item types that work nicely are daggers, wands, orbs, bows, crossbows and non-javelin throwing weapons). It doesn't seem to have any clcs, but you can easily add a state onto it since it does not require a srvstfunc which can apply damagepercent as a stat.
(srvdofunc=54)
(range=h2h; not required but strongly recommended)
(tohit,levtohit,tohitcalc)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects on each attack; by default, it uses 32/0/3; resultflag=32 prevents quite a few effects from being applied, like ctc on striking and crushing blow)
(srcdam=,mindam/maxdam,etype=,emin/emax,elen; note that mindam/maxdam is increased by damagepercent, strength/dex when applicable, etc)


[monfrenzy][BloodLordFrenzy] Attack that activates an auralencalc controlled state on the first attack. Aurastat value of dm/ln/lvl scales with number of hits, with each hit being equivalent to an additional level. Basically, the same as Frenzy but only requiring a single hit to activate the aurastate instead of two. This skill also doesn't get elemental conversion. srv=64,109
(srvdofunc=109)
(range=h2h; not required but recommended)
(aurastate=,auralencalc,aurastat1-6=; applies aurastate to the player for as long as auralencalc, uses all aurastats; for aurastat clcs, lvl is equivalent to the number of hits beyond the first)
(clc2=damagepercent added to each hit)
(tohit,levtohit,tohitcalc)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects)
(srcdam=,etype=,emin/emax,elen)
(NOTE: vanilla monfrenzy uses srvstfunc=64, but this doesn't seem to do anything; vanilla bloodlordfrenzy uses srvstfunc=37 but I didn't bother checking if it does anything relevant to non-bloodlords)



------

[OTHER ATTACKS]


[Smite] Attacks with a shield; does nothing if you are not wielding a shield. Cannot miss; ignores hit chance and blocking, uses the damage of your shield. Ignores numerous properties that are usually applied to weapons (+damage, dmg% to a monster type, damage doubling, elemental damage, life/mana steal). Despite not adding elemental damage from items, it does add elemental damage from the elemental damage columns.
(srvdofunc=150)
(range=h2h; not required but recommended)
(clc1=damagepercent added to each hit)
(clc2=length of stun from each hit, in frames)
(etype=,emin/emax,elen)


[Dragon Talon] Attacks with boots (meaning it can follow kicking rules, adding damage from str/dex, etc). Uniquely, kicking attacks make use of the mindam/maxdam (added physical damage) columns, which is particularly fortunate for Dragon Talon considering that the kick damage% is determined by param1/2, which do not accept calculations.
(srvstfunc=24,srvdofunc=42,cltstfunc=6,cltdofunc=4)
(range=h2h; not required but strongly recommended)
(clc1=number of kicks per use)
(clc2=knockback chance on the last kick, versus uniques)
(clc3=knockback chance on the last kick, versus bosses)
(clc4=knockback chance on the last kick, versus players)
(param1=base percent kick damage; note that percent kick damage is multiplicative with percent damage when being applied to kick damage added by str/dex)
(param2=additional percent kick damage per level)
(tohit,levtohit,tohitcalc)
(kick=1; without this, your attack will not gain kick damage from str/dex)
(mindam/maxdam,etype=,emin/emax,elen)


[Dragon Tail] Attacks with boots (meaning it can follow kicking rules, adding damage from str/dex, etc). Produces a fire explosion within aurarangecalc based on the amount of kick damage you deal to a target. Uniquely, kicking attacks make use of the mindam/maxdam (added physical damage) columns; in the context of Dragon Tail, this also massively boosts the fire explosion since the added mindam/maxdam counts as kick damage.
(srvstfunc=27,srvdofunc=50; cltdofunc=7 only if you want to produce cltmissilea)
(aurarangecalc=; radius of fire explosion)
(h2h; not required but recommended)
(clc1=percent kick and fire explosion damage; note that percent kick damage is multiplicative with percent damage when being applied to kick damage added by str/dex)
(tohit,levtohit,tohitcalc)
(kick=1; without this, your attack will not gain kick damage from str/dex)
(mindam/maxdam,etype=,emin/emax,elen)
(NOTE: vanilla dragon tail uses cltstfunc=9, but it doesn't seem to do anything)


[Suck Blood] This is a hybrid skill using Suck Blood and a fairly common attack srvdofunc, srvdofunc=2; it could probably be used with just about any attack srvdofunc. Based on my experimentation, this actually seems to be a kicking skill, given that kicking=1 works and that it gains damage from the mindam/maxdam added physical damage columns, but doesn't gain weapon damage and doesn't gain +min/max damage from equipment. What this skill does is act as a kicking attack skill and appends life/mana steal to each hit equivalent percent kicking damage, which is kind of awkward since you probably don't want those to be equal.
(srvstfunc=60,srvdofunc=2)
(range=h2h; not required but recommended)
(aurastate=,auratargetstate=,aurastat1-6=; applies aurastate to the player while the animation is playing, and applies the auratargetstate to the hit target for as long as auralencalc, uses all aurastats; hitting the target again causes the state to toggle off)
(clc1=percent kick damage and leech; note that percent kick damage is multiplicative with percent damage when being applied to kick damage added by str/dex; the leeching applies to both life and mana)
(tohit,levtohit,tohitcalc)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects)
(kick=1; without this, your attack will not gain kick damage from str/dex)
(mindam/maxdam,etype=,emin/emax,elen)
(NOTE: in vanilla, suck blood uses srvdofunc=127, but this causes the game to crash, so I instead tried salvaging it with a different function)


-----

[SEQUENCE]


[Leap] Requires a sequence, but most sequences won't work and results are different for different characters. You can't make it release missiles without breaking it and there is no state attached to it. Not very useful for doing anything except an almost exact Leap clone.
(srvstfunc=40,srvdofunc=77,cltstfunc=29,cltdofunc=43)
(aurarangecalc=; leaping distance)
(anim=SQ,seqnum=; only works properly with some sequences, and sequences that work for one character might not work for another)
(useattackrate=0; otherwise it will be jittery and messed up)
(clc1=radius of knockback around landing point)


[Leap Attack] Requires a sequence, but most sequences won't work and results are different for different characters. You can't make it release missiles without breaking it and there is no state attached to it. Not very useful for doing anything except an almost exact Leap Attack clone.
(srvstfunc=41,srvdofunc=78,cltstfunc=30,cltdofunc=44)
(anim=SQ,seqnum=; only works properly with some sequences, and sequences that work for one character might not work for another)
(useattackrate=0; otherwise it will be jittery and messed up)
(clc1=damagepercent added to each hit)
(clc4=damage converted to elem; multiplies damage by every % over 100%)
(tohit,levtohit,tohitcalc)
(srcdam=,etype=,emin/emax,elen)


[Whirlwind] A moving attack. Technically does not require a sequence, but is really awkward without one. Will not trigger chance to cast while animating.
(srvstfunc=38,srvdofunc=76,cltstfunc=31,cltdofunc=45)
(aurastate=,aurastat1-6=; applies aurastate to the player while the animation is playing, uses all aurastats)
(anim=SQ,seqnum=; using non-SQ will cause it to be very slow and virtually unusable; usually you will want seqnum=11, the default, but some other seqs also work well enough)
(clc1=damagepercent added to each hit)
(param3=attacks per tick; supposedly gives an additional chance to hit if it misses per attempt at an attack, although I didn't notice a difference in practice, might have very low limits which would make hard to confirm)
(tohit,levtohit,tohitcalc)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects)
(srcdam=,etype=,emin/emax,elen)


[Dragon Flight] A target specified warp that only attacks if you use an attacking sequence. Attacks with boots (meaning it can follow kicking rules, adding damage from str/dex, etc). Uniquely, kicking attacks make use of the mindam/maxdam (added physical damage) columns, which is particularly fortunate for Dragon Flight considering that the kick damage% is determined by param1/2, which do not accept calculations.
(srvdofunc=52)
(aurarangecalc=; the radius from the user for selecting targets that it will warp and then attack)
(warp=1; otherwise will fade to black after each use)
(anim=SQ or other,seqnum=; requires an attacking sequence if you want it to attack e.g. whirlwind or dragon flight sequence, if you only want it to teleport then any anim is fine)
(param1=base percent kick damage; note that percent kick damage is multiplicative with percent damage when being applied to kick damage added by str/dex)
(param2=additional percent kick damage per level)
(tohit,levtohit,tohitcalc)
(kick=1; without this, your attack will not gain kick damage from str/dex)
(mindam/maxdam,etype=,emin/emax,elen)
(NOTE: vanilla dragon flight also uses srvstfunc=12 and cltstfunc=5, but these do not seem to do anything)


[Fire Hit] An attack that should use a sequence (but doesn't have to, but you really should use a sequence). Most notably, it applies an aurastate while you are using a sequence and has access to most of the usual columns.
(srvstfunc=42,srvdofunc=83)
(aurastate=,aurastat1-6=; applies aurastate during the anim and maintains it until the user moves, uses all aurastats)
(range=h2h; not required but recommended)
(anim=SQ,seqnum=; strongly recommended to use a sequence, you technically can use a non-sequence, but it will cause the user to be broken until they move, but has the amusing side effect of keeping the aurastate active indefinitely)
(clc1=damagepercent added to each hit)
(clc4=damage converted to elem; multiplies damage by every % over 100%)
(tohit,levtohit,tohitcalc)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects)
(srcdam=,etype=,emin/emax,elen)

[Mosquito] A melee damage spell; technically does not require a sequence, but you probably want to use a sequence with it given that it allows a great amount of sequence customization. Applies poison according to the elemental damage columns regardless of the etype, allowing you to do multiple elemental damage types. Seems to fully regenerate the user's mana with each successful use (but the amount is reduced by drain resistances).
(srvstfunc=55,srvdofunc=107; cltstfunc=42,cltdofunc=62 are only necessary if you are using a sequence and want it to do multiple loops)
(clc1=min loops; minimum number of times to repeat a sequence if you are using a sequence)
(clc2=max loops; maximum number of times to repeat a sequence if you are using a sequence)
(clc3=life gained; gains life based on the amount of physical damage you can deal regardless of how much damage you actually deal to the enemy, this means it ignores physical resistance, it also ignores drain resistance; also allows for negative values to do the opposite)
(param1=reset loop frame; chooses the frame at which the sequence starts over, so you probably want to make sure your given sequence does not reset before the activation frame occurs)
(range=h2h; not required but recommended)
(tohit,levtohit,tohitcalc)
(mindam/maxdam,etype=,emin/emax,elen; emin/emax and elen are added as poison damage regardless of the element, allowing you to deal up to two types of elemental damage at once)



-----

[SPELLS]



[Static Field] Deals damage in a defined radius of a defined element.
(srvdofunc=20)
(aurarangecalc=; radius of damage)
(clc1=percent of current monster life removed, damage type is based on etype and can be resisted)
(clc2={min damage}; supposedly does something, but I don't see any difference when messing with it)
(etype=,elen; uses etype for its damage and applies elen to monsters in radius)


[Telekinesis] Deals physical and/or elemental damage to a selected target, and also applying resultflags/hitflags/hitclass.
(srvdofunc=21)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects; by default it is set to 5/2/109, which gives a chance of knockback based on param2)
(mindam/maxdam,etype=,emin/emax,elen)
(note: the vanilla skill has srvstfunc=12, although this does not seem to do anything)


[Teleport] Immediately teleports the user to the clicked point.
(srvdofunc=27)
(warp=1; not required, but without it you will fade from black after every use)


[Find Potion] Consume a corpse for a chance to get a healing, mana or rejuvenation potion.
(srvstfunc=69; cltdofunc=38 only if you want the corpse to release blood droplets)
(searchenemynear=1,selectproc=4,targetcorpse=1; this will allow it to select specific corpses, as well as nearby corpses)
(clc1=chance for a consumed corpse to drop a potion)
(param1=chance of getting a heart; probably doesn't do anything)
(param2=chance of getting a healing potion; doesn't actually matter since this is the default selection and is overridden by the other two)
(param3=chance of getting a mana potion; this takes priority over health and rejuvenation)
(param4=chance of getting a rejuvenation potion; this takes priority over health)
(NOTE: vanilla find potion has srvstfunc=33,cltstfunc=26, but these do not seem to do anything)


[Find Item] Consume a corpse for a chance to drop its treasureclass a second time.
(srvdofunc=72; cltdofunc=40 only if you want blood droplets after use)
(searchenemynear=1,selectproc=5,targetcorpse=1; this will allow it to select specific corpses, as well as nearby corpses)
(clc1=chance for a consumed corpse to re-drop items)
(param1/2/3/4=supposedly change minheart/maxheart/quality/magic item drop chance, but I saw no differences in my testing)
(NOTE: vanilla find item has srvstfunc=34 and cltstfunc=28, but these do not seem to do anything)


[monteleport][Teleport 2][Baal Teleport][Baal Clone Teleport] Seems to be identical to Teleport.
(srvdofunc=98)
(warp=1; not required, but without it you will fade from black after every use)
(NOTE: vanilla teleport 2 and baal teleport use cltstfunc=48,cltdofunc=73 which produce cltmissilea/b on start/end)


[Imp Teleport] Seems to be identical to Teleport.
(srvdofunc=129)
(warp=1; not required, but without it you will fade from black after every use)
(NOTE: vanilla imp teleport uses cltstfunc=48,cltdofunc=74 which produce cltmissilea/b on start/end)


[DiabCold] Damages the selected target and chills/freezes them for as long as elen.
(srvdofunc=100)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects)
(etype=,emin/emax,elen; regardless of etype, it will freeze/chill for as long as elen)


[RegurgitatorEat] Consumes a corpse and adds or removes life to the user.
(srvdofunc=108; cltdofunc=63 is used by the vanilla skill to release cltside missiles, but it will activate even if you do not consume a corpse)
(searchopenXY=1,selectproc=1,targetcorpse=1; these should be set so that you can select a target corpse)
(clc1=life gained or lost by consuming a corpse; value is in 1/50ths, so 100*50=100 life restored and -100*50=100 life lost)



[Baal Corpse Explode] Consumes/disappears corpses within a radius around the selected target corpse. Does not explode corpses anymore because that was removed in 1.10f, along with the fancy corpse explosion graphics.
(srvdofunc=141)
(aurarangecalc=radius within to consume/disappear corpses)
(searchopenXY=1,selectproc=1,targetcorpse=1; these should be set so that you can select a target corpse)
(NOTE: vanilla baal corpse explode has cltstfunc=82, but it doesn't seem to do anything important for a player character)


[MagottDown] Creates a small, invisible block that can be flown over, and also slightly teleports the user in a northern, slightly western direction. Casting it a bunch of times in a row creates a wall.
(srvstfunc=45,srvdofunc=86,cltstfunc=33)
(warp=1; set this if you do not want the screen to fade from black with each use)
(NOTE: vanilla magottdown uses cltdofunc=47, but it doesn't seem to do anything)



[MagottUp] Cast to allow yourself to move after using MagottDown.
(srvdofunc=45; cltstfunc=32 is only necessary if you want to release cltmissilea vaguely in the direction of casting)


[Resurrect][Resurrect2] Resurrects the target monster's corpse. Seems to work on absolutely everything.
(srvdofunc=97)
(selectproc=1,targetcorpse=1,targetally=1; recommendations for targeting all corpses)
(NOTE: vanilla resurrect uses cltstfunc=39, but this doesn't seem to do anything)


[ZakarumHeal][Bestow] Heals the selected target.
(srvdofunc=96)
(clc1=the minimum percent of healing; negative values do not seem to apply)
(clc2=the maximum percent of healing; negative values do not seem to apply)


[Siege Beast Stomp] Deals explosive damage around the player and shakes the screen. The screen shaking lasts even if you start a new session.
(srvdofunc=134; cltdofunc=75 is only necessary if you want screen shaking)
(srvmissilea=; must have a valid entry from missiles.txt to deal damage, but it doesn't actually release the missile)
(aurarangecalc=; the radius of the explosive damage)
(param1=screen shake magnitude; strength of shaking)
(param2=screen shake build; how long it takes for the screen to reach peak magnitude)
(param3=screen shake duration; how long the screen shakes at the peak magnitude)
(param4=screen shake fade; how long it takes to go from peak magnitude to no shaking)

-----


[STATES]


[Inner Sight][Slow Missiles] Applies a state to targets within a radius around the user, applying only one stat.
(srvdofunc=6)
(aurafilter=,auratargetstate=,auralencalc=,aurarangecalc=,aurastat1=; aurafilter determines what will be targeted, auratargetstate determines the state applied, auralencalc is the length of the state, aurarangecalc is the radius around the player, only aurastat1 is applied)


[Amplify Damage][Dim Vision][Weaken][Terror][Life Tap][Decrepify][Lower Resist] Applies a state to targets within a radius around the selected point.
(srvdofunc=30; cltstfunc=18,cltdofunc=30 are not necessary but recommended, given that they produce a missile from/at the location, with the missile at the location sharing the radius of the srvside function)
(aurafilter=,auratargetstate=,auralencalc=,aurarangecalc=,aurastat1-6=; aurafilter determines what will be targeted, auratargetstate determines the state applied, auralencalc is the length of the state, aurarangecalc is the radius around the clicked point, all aurastats are applied to the target)
(NOTE: srvstfunc=18 is used by these vanilla skills, but I do not notice any differences with it gone)


[Confuse] Apply a 5-stat state in a radius around the selected point to targets, making them of neutral alignment (they attack and can be attacked by everything). State will not be applied to non-normal monsters.
(srvdofunc=61; cltstfunc=18,cltdofunc=30 are not necessary but recommended, given that they produce a missile from/at the location, with the missile at the location sharing the radius of the srvside function) (aurafilter=,auratargetstate=,auralencalc=,aurarangecalc=,aurastat2-6=; aurafilter determines what will be targeted, auratargetstate determines the state applied, auralencalc is the length of the state, aurarangecalc is the radius around the clicked point, for some reason aurastat1 doesn't apply but the rest work)


[Attract] Apply a statless state to a target which makes it of neutral alignment (it attacks and can be attacked by everything). State will not be applied to non-normal monsters.
(srvdofunc=59; cltstfunc=18,cltdofunc=30 are not necessary, but are used by the vanilla variation of the skill, with cltdofunc=30 using aurarangecalc despite the srvside function not using it, and 18 producing a graphical missile)
(aurafilter=,auratargetstate=,auralencalc=; aurafilter determines what will be targeted, auratargetstate determines the state applied, auralencalc is the length of the state)
(NOTE: srvstfunc=18 is used by these vanilla skills, but I do not notice any differences with it gone)


[Frozen Armor][Shiver Armor][Chilling Armor][Bone Armor][Cyclone Armor][Burst of Speed][Fade][Venom] Applies a state to the user.
(srvdofunc=18)
(aurastate=,auralencalc=,aurastat1-6=,auraevent; aurastate determines the state applied, auralencalc is the length of the state, all aurastats are applied to the target)


[Enchant] Applies a state to a target, either the user or a pet/ally.
(srvdofunc=25)
(aurastate=,auralencalc=,aurastat1-6=, auraevent; aurastate determines the state applied, auralencalc is the length of the state, all aurastats are applied to the target)
(targetpet=1,targetally=1; if you want it to be applicable to allies)


[Might][Prayer][Resist Fire][Resist Cold][Resist Lightning][Defiance][Thorns][Cleansing][Meditation][Fanaticism][Concentration][Blessed Aim][Vigor][Salvation][Barbs Aura][Wolverine Aura][Oak Sage Aura] Apply a state to yourself and/or to allies and/or enemies. Also allows you to gain passive stats, but only while the aurastate is active.
(srvdofunc=65)
(aurafilter=,aurastate=,auratargetstate=,aurarangecalc=,aurastat1-6=; aurafilter determines what will be targeted, auratargetstate determines the state applied, aurarangecalc is the selection radius around the user, all aurastats are applied to the user and target)
(passivestat1-6=; these are applied only to the user while the aurastate is active)
(aura=,periodic=,perdelay=; these are not required, but are usually used, aura=1 makes it so it is active as long as it is on the skill bar, and periodic allows perdelay which determines how long the aurastate and auratargetstate last as well as how often they update, in frames)


[Holy Fire][Holy Shock][Sanctuary][Conviction] Apply an aurastate and its stats to selected targets. Also allows the user to gain passive stats, but only while the aurastate is active. Also deals elemental damage within aurarangecalc every time it updates/activates; this allows it to function well even when not being used as an aura (e.g. as an area of effect explosive damage spell).
(srvdofunc=66)
(aurafilter=,aurastate=,auratargetstate=,aurarangecalc=,aurastat1-6=; aurafilter determines what will be targeted, auratargetstate determines the state applied, aurarangecalc is the selection radius around the user for applying the auratargetstate and applying elemental damage, all aurastats are applied to the to the user and target)
(passivestat1-6=; these are applied only to the user while the aurastate is active)
(aura=,periodic=,perdelay=; these are not required, but are usually used, aura=1 makes it so it is active as long as it is on the skill bar, and periodic allows perdelay which determines how long the aurastate and auratargetstate last as well as how often they update, in frames)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects; by default it is set to 16385, which makes the elemental damage effects show up)
(etype=,emin/emax,elen)


[Holy Freeze] Apply an aurastate and its stats to selected targets. Also allows the user to gain passive stats, but only while the aurastate is active. Also deals elemental damage within aurarangecalc every time it updates/activates; this allows it to function well even when not being used as an aura (e.g. as an area of effect explosive damage spell). Unlike the above srvdofunc=66, coldeffect in monstats.txt is relevant for this, with coldeffect=0 rendering a monster immune to the auratargetstate.
(srvdofunc=81)
(aurafilter=,aurastate=,auratargetstate=,aurarangecalc=,aurastat1-6=; aurafilter determines what will be targeted, auratargetstate determines the state applied, aurarangecalc is the selection radius around the user for applying the auratargetstate and applying elemental damage, all aurastats are applied to the to the user and target)
(passivestat1-6=; these are applied only to the user while the aurastate is active)
(aura=,periodic=,perdelay=; these are not required, but are usually used, aura=1 makes it so it is active as long as it is on the skill bar, and periodic allows perdelay which determines how long the aurastate and auratargetstate last as well as how often they update, in frames)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects; by default it is set to 16385, which makes the elemental damage effects show up)
(etype=,emin/emax,elen)



[Redemption] Apply an aurastate to the user along with its aurastats, as well as passivestats. Also can search for corpses and redeem them for life and mana, always spawning the red redemption ghost.
(srvdofunc=82)
(aurafilter=,auratargetstate=,aurarangecalc=,aurastat1-6=; aurafilter determines which corpses should be selected (set to 4354 by default), aurarangecalc is the selection radius around the user for selecting corpses, all aurastats are applied to the user)
(passivestat1-6=; these are applied only to the user while the aurastate is active)
(aura=,periodic=,perdelay=; these are not required, but are usually used, aura=1 makes it so it is active as long as it is on the skill bar, and periodic allows perdelay which determines how long the aurastate lasts as well as how often it updates as well as how often corpses are selected for redeeming, in frames)
(clc1=chance of redeeming a corpse)
(clc2=amount of life gained from redeeming a corpse)
(clc3=amount of mana gained from redeeming a corpse)


[Taunt] Apply an aurastate to a single monster, along with all of the associated aurastats.
(srvdofunc=71)
(aurafilter=,auratargetstate=,auralencalc=,aurastat1-6=; aurafilter determines what will be targeted, auratargetstate determines the state applied, auralencalc is the length of the state, aurarangecalc is the radius around the player, only aurastat1 is applied)


[Werewolf][Werebear][Delerium Change] Apply a state to the user which can have different overlays when activating or deactivating.
(srvdofunc=116; cltstfunc=45 should be used only if you want to make use of cltoverlaya/b when activating/deactivating)
(cltoverlaya=,cltoverlayb=; required for activation/deactivation but only if you are using cltstfunc=45)
(aurastate=,auralencalc=,aurastat1-6=; aurastate determines the state applied, auralencalc is the length of the state, all aurastats are applied)


[Cloak of Shadows] Apply an aurastate to the user (which provides passivestats) and an auratargetstate to all targets (which provides aurastats) within the aurafilter and range. The auratargetstate always applies blind. The auralencalc prevents you from using this skill until it runs out. Note that it only prevents casting if you have that aurastate currently, this means you can allow yourself to cast it again earlier if you replace it with an identical state of a shorter duration, and likewise you will be prevented from casting it even if you haven't cast it if you already have the state from something else. So for example, if you are a paladin and cast Cloak of Might (which gives the Might state), and then select Might (the aura) then unselect it, you will be able to cast Cloak of Might again; and if you keep Might active, then you won't be able to cast Cloak of Might.
(srvdofunc=47,cltstfunc=7)
(aurafilter=,aurastate=,aurarangecalc=,auralencalc=,aurastat1-6=; aurafilter determines which targets should be selected to gain auratargetstate (set to 57347 by default), aurarangecalc is the selection radius around the user for selecting targets, auralencalc determines how long the aurastate and auratargetstate last as well as how long it takes to be able to use this skill again, all aurastats are applied to the targets)
(passivestats1-5=; applied to the user while aurastate is active)


[MonCurseCast] Applies a random curse (ID=66,72,76,82,87,91; Amplify Damage, Weaken, Iron Maiden, Life Tap, Decrepify, Lower Resist). I think the Iron Maiden part doesn't exist anymore in 1.13+. Note that this skill does not read the aurastats of the given curses, it reads the params and calcs. So for example, if you set Decrepify param5=50 (from -50) and set the aurastats to be multiplied by -1, then it'll speed up targets, even though a Necromancer using the skill will still slow down targets as per usual. This also means any new aurastats that the curse may give due to your modding will be ignored by this function. It also seems that you can't change srvdofunc=30 of the respective curses, or otherwise the function won't be able to use them). It directly uses the aurarangecalc/auralencalc from the curses it casts.
(srvdofunc=112; cltdofunc=30 is used by the vanilla skill, but it is awkward since the aurarangecalc is a single value, but the curses it casts have different aurarangecalcs which causes a desync between the apparent radius and the actual radius; cltstfunc=18 is also used by the vanilla skill, but it isn't necessary)
(aurarangecalc=; only relevant if you want to use cltdofunc=30)


[Blade Shield] This skill is described in two different sections because its function massively changes based on how you configure it, and both the srvstfunc and srvdofunc have interesting capabilities. This section describes Blade Shield's srvstfunc, which is highly unique since it applies a state to the user for a set duration without even having to use a srvdofunc.
(srvstfunc=28; srvdofunc=54 is only necessary if you want it to hit nearby monsters like Blade Shield does)
(srvmissilea=; as long as it references an actual missile it will allow the state to attack)
(aurafilter,aurastate=,auralencalc=,aurastat1-6=; aurafilter determines the monsters it will attack, aurastate determines the state applied to the user, auralencalc is the length of the state, all aurastats are applied)
(periodic=,perdelay=; periodic=1 if you want it to hit, perdelay determines how many frames must pass before it attempts to attack again)
(tohit,levtohit,tohitcalc)
(resultflags,hitflags,hitclass; can make use of these columns to apply a few different possible effects on each attack; by default, it uses 32/0/3; resultflag=32 prevents quite a few effects from being applied, like ctc on striking and crushing blow)
(srcdam=,mindam/maxdam,etype=,emin/emax,elen; note that mindam/maxdam is increased by damagepercent, strength/dex when applicable, etc)



[fenris rage] Consume a corpse to gain a state with full aurastats.
(srvdofunc=137; cltstfunc=51,cltdofunc=79 if you want cltmissilea to be released from the consumed corpse)
(aurastate=,auralencalc=,aurastat1-6=; aurastate determines the state applied, auralencalc is the length of the state, all aurastats are applied)


[Overseer Whip] For the far majority of monsters, this applies an auratargetstate and its stats. To monsters with monstats.txt: baseid=minion1, this either applies an auratargetstate and its stats (if it succeeds) or converts them into the defined summon, turning into an equivalent monster in the respective chain (e.g. minion1=scarab1, minion2=scarab2, minion3=scarab3, etc).
(srvdofunc=131)
(auratargetstate=,auralencalc=,aurastat1-6=; auratargetstate determines the state applied, auralencalc is the length of the state, all aurastats are applied)
(summon=,summode=; summon determines what monster it will convert into, spawning along the equivalent nextinclass chain; summode determines the animation upon spawning, make sure it uses an animmode that the given monster actually has, something like A1 is almost always safe)
(clc1=chance of applying auratargetstate; if it fails, then the monster is converted into the monster in the column "summon" instead, but only if it a minion; the replacement monster is janky and dies when it gets near you, but it carries at least most of the stats, at least including monprops, of the given monster)

-----

[PETS]

[Unsummon] Unsummons (does not kill; the unsummoned will not trigger death effects) one of your pets.
(srvstfunc=3,srvdofunc=4)
(targetpet=1)


[Dopplezon] Summons a timed pet at the clicked point that can borrow your life; pet triggers death effects when the duration runs out.
(srvdofunc=15)
(aurastats1-6; applied to the summon)
(passivestats1-5; applied to the summon)
(summon=,pettype=,petmax=,summode=,sumsk1-5=)
(clc1=multiplier to base life; multiplicative with other sources of life%)
(clc2=pet duration, in frames)
(clc3=the percent of life it borrows from the user for its own base life)
(tohit,levtohit,tohitcalc)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column)


[Valkyrie] Summons a pet at the selected location that must have an inventory or suffer a crash. If you do not summon from hcldx=357 (valkyrie), then it will be invisible. No matter what it will have a glowy full set aura. Attempting to transform it into something else via a state does not seem to work.
(srvdofunc=16)
(aurastat1-6; applied to the summon)
(passivestat1-5; applied to the summon)
(summon=,pettype=,petmax=,summode=,sumsk1-5=)
(monstats.txt: summon must have inventory=1)
(clc1=multiplier to base life; multiplicative with other sources of life%)
(clc2=supposedly ilvl of magic items; but I created a very common magicsuffix that has ilvl=99, rlvl=99 on a level 90 character with a level 1 valkyrie clone and she was still spawning with the item)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column)


[Hydra] Creates 3 summons, with the specified summon and the two rows following it in monstats.txt. Only one of the summons can have a pet leash, more than one will cause a crash. All of the summons can be unsummoned, even if they are not aligned. Regardless of the monster alignment, the summons will be incapable of harming you (although they will still attempt and fail to harm you if they aren't aligned). Summons with monstats.txt:AI=necropet immediately die (and trigger death effects) when getting near monsters. All summons die (and trigger death effects) after clc1 runs out.
(srvdofunc=)
(aurastat1-6; applied to the summon)
(passivestat1-5; applied to the summon)
(summon=,pettype=,petmax=,summode=,sumsk1-5=; the following two entires in monstats.txt will also be summoned alongside the entered summon; petmax counts all three of the summons, so you need at least petmax=3 to summon all three)
(clc1=duration of summons, in frames)
(tohit,levtohit,tohitcalc)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column)
(NOTE: vanilla hydra uses srvstfunc=14 and cltstfunc=17 but they don't seem to do anything)


[Raise Skeleton][Raise Skeletal Mage] Consume a corpse to make it release a pet. Also hurts (and possibly kills) Paladins, dealing 1/8th of their max life per use.
(srvdofunc=31; cltstfunc=20,cltdofunc=31 are only needed if you want the corpse to also release cltmissilea)
(aurastat1-6; applied to the summon)
(passivestat1-5; applied to the summon)
(summon=,pettype=,petmax=,summode=,sumsk1-5=)
(selectproc=2,targetcorpse=1; required for a corpse to be targeted)
(clc1=multiplier to base life; multiplicative with other sources of life%)
(tohit,levtohit,tohitcalc)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column)
(NOTE: has srvstfunc=15, but it doesn't seem to do anything)


[Clay Golem][Blood Golem][Fire Golem] Summons a pet at the selected location.
(srvdofunc=56)
(aurastat1-6; applied to the summon)
(passivestat1-5; applied to the summon)
(summon=,pettype=,petmax=,summode=,sumsk1-5=)
(clc1=multiplier to base life; multiplicative with other sources of life%)
(tohit,levtohit,tohitcalc)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column)


[Bone Wall] Release two missiles at the target location that travel in opposite directions perpendicular to the user and spawn a pet at the target location. If using the bonewallmaker missile (a missile with psrvdofunc=13 will create summon as it moves), then be sure to not use a pet with a leashed AI or it'll crash the game. If you use unaligned monsters as the summon, they will be hostile to everything, including each other. Note that the 24 second duration of Bone Wall is only applied to monsters with a monstats.txt AI=BoneWall. Also note that the summon that gets produced seems to have a broken hit calculation, always having the minimum 5% hit chance (the monster's level is equivalent to you however), as such it is recommended that if you want to make summons with this then you make them use missiles or skills that can either properly calculate hit chance or ignore hit calculations entirely. Also, the monsters summoned sort of have their normal AI behavior but with severe brain damage, so you'll probably want to make sure they use a skill that is smarter than they are (e.g. auras that hit in a radius, Guided Arrow, Bone spirit). Also, the summons share an unusual cooperation, in that if any of the pieces besides the center-most die, then all the others die; this means you can trigger ctc on death at most twice (once from the center piece, causing that piece to die, and once from a side piece, causing all the pieces to die).
(srvdofunc=60; cltdofunc=26 if you want to shoot out missiles along the length of the bone wall)
(srvmissilea; only use a missile with bonewallmaker's psrvdofunc=13 if the summon doesn't have a leash; modifying the velocity of the missile will space out the distance between each summon; if you want to make it like a hybrid between fire wall and bone wall, then use cltmissilea and cltdofunc=26)
(aurastat1-6; applied to the summon)
(passivestat1-5; applied to the summon)
(summon=,pettype=,sumsk1-5=; be sure not to use a summon with a leash if you spawn more than 1 summon; note that there is no cap to the number of pets)
(clc1=multiplier to base life; multiplicative with other sources of life%)
(clc2=makes a missile with psrvdofunc=13 spawn an equal amount of summons as this clc, plus one extra that is always spawned in the middle)
(tohit,levtohit,tohitcalc)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column)
(NOTE: vanilla bone wall has cltstfunc=22, but it doesn't seem to do anything)


[Bone Prison] Seems to basically follow the same rules as Bone Wall, just without the center summon and instead producing a ring of summons.
(srvdofunc=62; srvstfunc=19 is not required, it just makes it so you have to target a specific monster for it to cast)
(aurastat1-6; applied to the summon)
(passivestat1-5; applied to the summon)
(summon=,pettype=,sumsk1-5=; be sure not to use a summon with a leash if you spawn more than 1 summon; note that there is no cap to the number of pets)
(clc1=multiplier to base life; multiplicative with other sources of life%)
(tohit,levtohit,tohitcalc)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column)
(NOTE: vanilla bone prison has cltstfunc=22, but it doesn't seem to do anything)


[Iron Golem] Memory is hardcoded to ID=90 and makes it impossible to fully clone Iron Golem's behavior. Still useful if you want to have a temporary pet that can only be spawned from metal items and adopts the stats of the used item, it won't interfere with the memory of the actual IronGolem skill either. Also can be set to only get the Fade stat when produced from an ethereal item, but only works properly if one of its aurastats has Fade=16 {ethereal fading seems to only work for the IronGolem monster, but there might be some other stuff required, e.g. Fade in monprops}.
(srvdofunc=57)
(aurastat1-6; applied to the summon; one of these must have aurastat=fade and aurastatcalc=16 or otherwise the summon will not become faded from an ethereal item)
(passivestat1-5; applied to the summon)
(summon=,pettype=,petmax=,summode=,sumsk1-5=)
(targetitem=1; required for an item to be targeted)
(clc1=multiplier to base life; multiplicative with other sources of life%)
(tohit,levtohit,tohitcalc)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column)
(NOTE: vanilla irongolem has srvstfunc=20 and cltstfunc=23, but they don't seem to do anything)


[Revive] Revives selected corpses and appends additional stats and skills to them. Also hurts (and possibly kills) Paladins, dealing 1/8th of their max life per use.
(srvdofunc=58; cltstfunc=24 is only necessary if you want different cltmissiles released from the corpse based on its size in monstats2.txt, with small=0,large=0 releasing cltmissilea, small=1,large=0 releasing cltmissileb and small=0,large=1 releasing cltmissilec)
(aurastat1-6; applied to the summon)
(passivestat1-5; applied to the summon)
(pettype=,petmax=,sumsk1-5=; sumsk allows for stuff like auras to be added to all your revives)
(selectproc=2,targetcorpse=1; required for a corpse to be targeted)
(clc1=multiplier to base life; multiplicative with other sources of life%)
(clc2=duration of revives, in frames)
(NOTE: vanilla revive has srvstfunc=21, but it doesn't seem to do anything)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column of every single monster you revive, also note that these bonuses are applied to the monster even when not revived, however if you set it so that srcdam=0 and mindam/maxdam=0, then you can freely modify min/maxlevdam1-6 without making monsters any stronger, although this whole process is essentially pointless since you can just give it to them via aurastats/passivestats/sumsks)


[Raven] Summons a pet at the selected location. The pet cannot be harmed and will not be targeted by enemies. Number of hits until death is not controlled by this skill function.
(srvdofunc=114)
(aurastat1-6; applied to the summon)
(passivestat1-5; applied to the summon)
(summon=,pettype=,petmax=,summode=,sumsk1-5=)
(clc1=multiplier to base life; multiplicative with other sources of life%)
(clc2=level of the pet; doesn't seem to change the result from ulvl clcs on the summon for things like aura/passivestats, but it definitely changes the actual level of the monster as far as hit chance is concerned)
(tohit,levtohit,tohitcalc)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column)


[Poison Creeper][Cycle of Life][Solar Creeper] Summons a pet at the selected location. The summon cannot display overlays (but still does can any bonuses from states) and produces vine graphics/sounds as it moves. Hit chance seems to be bugged and always set to the minimum 5%.
(srvdofunc=115)
(aurastat1-6; applied to the summon)
(passivestat1-5; applied to the summon)
(summon=,pettype=,petmax=,summode=,sumsk1-5=)
(clc1=multiplier to base life; multiplicative with other sources of life%)
(clc2=level of the pet; doesn't seem to change the result from ulvl clcs on the summon for things like aura/passivestats, but it definitely changes the actual level of the monster as far as hit chance is concerned)
(tohit,levtohit,tohitcalc)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column)



[Oak Sage][Summon Spirit Wolf][Heart of Wolverine][Summon Dire Wolf][Spirit of Barbs][Summon Grizzly] Summons a pet at the selected location. Appears to be essentially identical to the golem srvdofunc.
(srvdofunc=119)
(aurastat1-6; applied to the summon)
(passivestat1-5; applied to the summon)
(summon=,pettype=,petmax=,summode=,sumsk1-5=)
(clc1=multiplier to base life; multiplicative with other sources of life%)
(clc2=level of the pet; doesn't seem to change the result from ulvl clcs on the summon for things like aura/passivestats, but it definitely changes the actual level of the monster as far as hit chance is concerned)
(tohit,levtohit,tohitcalc)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column)


[Blade Sentinel] Summons a pet at the user's location. The pet will not be selected by enemies, but can be harmed and even killed by colliding with incidental missiles and explosions. This also allows for Blade Sentinel to move between the user and selected location (requires monstats.txt: AI=BladeCreeper), but otherwise Blade Sentinel's vanilla features (e.g. the way it hurts things it moves into and its duration) are not controlled by functions.
(srvdofunc=44)
(aurastat1-6; applied to the summon)
(passivestat1-5; applied to the summon)
(summon=,pettype=,petmax=,sumsk1-5=)
(tohit,levtohit,tohitcalc)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column)


[Charged Bolt Sentry][Wake of Fire][Lightning Sentry][Wake of Inferno][Death Sentry] Summons a pet at the selected location. The pet will not be selected by enemies, but can be harmed and even killed by colliding with incidental missiles and explosions.
(srvdofunc=45)
(aurastat1-6; applied to the summon)
(passivestat1-5; applied to the summon)
(summon=,pettype=,petmax=,summode=,sumsk1-5=)
(tohit,levtohit,tohitcalc)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column)


-----


[SUMMONS]


[MagottLay] Spawns a summon at the user. There is an odd hinderance that occurs after each use, which requires you to move before you can summon again. You can use a sequence with multiple activation frames to summon multiple times, but it'll still lock up after using them up (until you move). Note that the summon also includes minion1/2 and min/maxgrp, so you can spawn large armies.
(srvdofunc=87)
(summon=,summonmode=; summon creates the monster, and summonmode controls the animation the summon plays on spawning; minion1/2 and min/maxgrp of the summon are also spawned alongside it)


[MaggotEgg] Spawns one or more of a specific monster, also using the monstats.txt: minion1/2,mingrp/maxgrp of the defined monster (meaning it can spawn packs of up to 3 different monsters). The monsters spawned by the summon column (meaning not minion1/2) use anim S1 (so you'll want to either make sure the monsters are damaged/knocked back/etc as soon as they spawn so that they are immediately kicked out of their non-existent animation, or add in S1 animdata for those monsters).
(srvdofunc=84; also uses srvstfunc=43 in vanilla, but it only seems to change where the summons spawn, so it may or may not be desirable over some other srvstfunc)
(summon=; the specific monster to create along with its minion1/2,mingrp/maxgrp columns in monstats.txt; the specific monster always is spawned with anim S1, which most monsters do not have)
(clc1=number of summons to spawn; limit depends on the size of the monster with a box-sized area around the user being available to fill up, anything beyond that area will not spawn, meaning smaller monsters have a higher limit)
(NOTE: vanilla maggotegg uses cltdofunc=46, but it doesn't seem to do anything)


[MinionSpawner] Spawns a single defined monster, also using the monstats.txt: minion1/2,mingrp/maxgrp of the defined monster (meaning it can spawn up to 3 different monsters and also allowing you to spawn more than a single monster). The monster (but not minion1/2) cannot be selected, but can be killed by area of effect.
(srvstfunc=62,srvdofunc=135)
(summon=,summode=; the specific monster to create along with its minion1/2,mingrp/maxgrp columns in monstats.txt; summode determines which animation it plays on spawning)


[Baal Tentacle] Spawns 1-4 of the first monster in monstats.txt (in vanilla, skeleton1) that are unselectable until you move really far away from them. They are spawned around the selected target, unless there aren't any around, in which case they spawn around the user. Doesn't actually make use of the summon column.
(srvdofunc=140)


[Impregnate] Makes it so the afflicted monster summons one or more monsters on death; hardcoded to only use the Pregnant state (this means it can be disabled by applying the Pregnant state via some other aurastate applying means); the monster inherits all of its stats from MonStats.txt. Monsters with baseid=putriddefiler1 or baseid=painworm1 cannot be impregnated. Summoned monsters are also accompanied by min/maxgrp minion1/2. If the monsters are chained via nextinclass, then both monlvlex (the area level of levels.txt) and level (the monster level of monstats.txt) are considered: the highest level monster in the chain that is at least of an equal level to the area level will be selected. This means you can produce 99+ different summons from a single skill, making it incredibly useful.
(srvdofunc=133)
(summon=monster spawned after the death of the host; the monster is summoned according to a chain based on monster level)
(summon=,summode=; the specific monster to create along with its minion1/2,mingrp/maxgrp columns in monstats.txt; summode determines which animation it plays on spawning)


-----


[USEFUL CLTFUNCS]


[Cloak of Shadows] Prevents the user from using a skill again until the aurastate runs out. This can work as a kind of softcoded skill delay to any skill that applies an aurastate controlled by auralencalc.
(cltstfunc=7)

-----


[GENERALIZED NON-FUNCTIONS]


[Energy Shield] If the user gains a state, then damage can be absorbed by mana.
(aurastate=,auralencalc,auraevent,auraeventfunc; auraevent and its auraeventfunc should be absorbdamage/24)
(clc1=; what percent of damage is taken from mana before life, capped at 95%)
(clc2=; resistance to all non-poison damage types, with each increment being worth 6.25%, with 32 being -100% resistance, 31 being -93.75% resistance and so on; I've read on the d2mods forum that it breaks below the value of 16, but this is definitely not true, it is effective down to a value of 1, or the equivalent of 93.75% resistance; there seems to be no upper limit, I was able to get to at least 256, or -300% resistance, and it seems like it may have even worked up to 1024 but I didn't thoroughly check at that point)


[Raven] The limited number of hits is based on monstats.txt: skill1. Whatever skill1 is, the number of hits will be equivalent to ln56 of that skill. This only applies if using AI=Raven.


[Charged Bolt Sentry][Wake of Fire][Lightning Sentry][Wake of Inferno][Death Sentry] The limited number of shots is based on monstats.txt: skill1. Whatever skill1 is, the number of shots will be equivalent to clc4 of that skill. This only applies if using AI=AssassinSentry.


[Blade Sentinel] The duration and hitting of this skill is based on monstats.txt and missiles.txt, which open up clc4 and srvmissilea to be borrowed by the summon. Srvmissilea is released only once on initial use. AI=BladeCreeper is required for any of this to work.
(srvmissilea=the missile that the summon releases; is released only once)
(clc4=duration, how long the summon lasts in frames)


[Shadow Warrior][Shadow Master] Their power to use skills has nothing to do with the function, only AItype (see: viewtopic.php?t=21049&highlight=shadow+master for a good explanation) and AI=ShadowWarrior or ShadowMaster (with ShadowWarrior using your current skills and ShadowMaster using any skills with AItype). This is very fortunate since their function (srvdofunc=49) does nothing useful, but breaks a lot of features that work for every other summon. The only reason these skills do not cast Shadow Warrior and Shadow Master in vanilla (which would cause a crash) is apparently because of hardcoding, cloning one of these skills will allow them to cast it (and crash the game). It is worth noting that ShadowMaster will only cast skills given to her via Monstats.txt Sk1-8 and with AItype that is either of no class or of the same class as the caster (so if some skills with charclass=sor have AItype and a sorceress makes the ShadowMaster, then the ShadowMaster will use those skills).


-----


[LIMITED FUNCTIONS]


[Energy Shield] Applies a state to the user that cannot apply aurastats. This function seems utterly useless, given that srvdofunc=18 can do everything this one can; clc1 and clc2 are not special features of this dofunc, rather they are apparently always read by auraevent/auraeventfunc=absorbdamage/24.
(srvdofunc=27)
(aurastate=,auralencalc=,auraevent,auraeventfunc; aurastate determines the state applied, auralencalc is the length of the state)


[Shadow Warrior][Shadow Master] Summons a pet at the selected location. The pet will not display immunities. It apparently gains life, but only via params (or maybe it is hardcoded? either way I didn't bother checking since this function has no apparent use). It also is broken (thanks Ogodei and LadyIsabelle: viewtopic.php?t=66555) in that auracalc2/passivecalc2 determine the values for all the other calcs of their type; it can be fixed via hardcoding as described in the aforementioned link. I figured that maybe this function prevents the summon from summoning itself, but it doesn't even do that. As such, it seems that this function is completely worthless, I cannot think of a single reason to use this over a different summoning function.
(srvdofunc=49)
(aurastat1-6,auracalc2; applied to the summon; auracalc2 is used for all aurastats)
(passivestat1-5,passivecalc2; applied to the summon; passivecalc2 is used for all passivestats)
(summon=,pettype=,petmax=,summode=,sumsk1-5=)
(param7,param8; supposedly these control the item level of the summon, but I made an affix rlvl=50,ilvl=50 and set both params to 1 with a level 10 skill and it was still spawning with the affix so I don't think they do anything)
(tohit,levtohit,tohitcalc)
(srcdam=,mindam/maxdam; srcdam is the percentage of its base damage from monstats, mindam/maxdam is added damage, but these only apply if the monstats.txt entry is linked via the "SkillDamage" column)
Last edited by Cypress on Wed Sep 16, 2020 8:03 pm, edited 3 times in total.


User avatar
Whaag
Posts: 11
Joined: Thu Feb 13, 2020 10:07 pm
Germany

Re: The Guide to Almost All Non-Missile Skill Functions

Post by Whaag » Mon Sep 07, 2020 10:18 am

This is already very helpful to me cause i`m working on skills right now. Thanks man.

Post Reply

Return to “General Mod Making”