The Guide to Almost All Missile 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
Junior Member
Champion of the Light
Posts: 278
Joined: Fri Dec 01, 2017 2:08 am

The Guide to Almost All Missile Functions

Post by Cypress » Fri Apr 02, 2021 5:02 pm

This is my attempt at describing as many missile functions as possible, primarily looking at skills.txt and missiles.txt. I made this to get an idea as to the limits of using missiles.

See here for the Guide to Non-Missile Functions: https://d2mods.info/forum/viewtopic.php?t=66934

I also use a color scheme to describe how useful a missile might be.
Indicates the function is hardcoded, broken, has no known purpose or is not understood
Indicates the function works, but is either awkward or seems to be an inferior version of another function
Indicates the function works and is highly recommended for use; subsequent green-labeled entries are alternatives that might work just as well
Indicates the function works and has a unique behavior with no available alternatives
Indicates the function works somewhat, but is cltside only; these can also sometimes be hardcoded, but I don't care enough about cltside missiles to make a distinction
Indicates the function works and is cltside only, but is still interesting

Also, I recommend looking at mishy23's excellent guide: https://d2mods.info/forum/viewtopic.php?t=29595; a few of the missiles described in that guide are not described here, and it also fully describes pSrvDmgFunc which is not described in this guide at all.

THANKS TO:
mishy23 for his missile guide
Ogodei for his description and understanding of doomknightmissile/necromagemissile
Whoever figured out the hidden monster spawning missile function
Hygiliak for describing hit function 39, Brother Laz for popularizing it
Vicarious Visions for including "diabloiidatafileguide" in D2R.

EDIT:
(4/9/2021) Added Sacrifice's cltdofunc
(4/13/2021) Added param6 to Strafe and updated PrimePoisonNova, describing how it uses a missile's params
(4/26/2021) Added Imp Spawn Monster's hitfunc 39, which is highly useful and most well known as MXL's Book of Summoning
(5/12/2021) Added more information to Unholybolt, which has a changing srvmissilea based on ID. Also AndrialSpray. Added Quick Strike.
(5/13/2021) Updated RogueMissile.
(5/14/2021) Merged Frost Nova+Nova and Howl after realizing they are the same.
(5/18/2021) Updated imp fire missile
(6/15/2021) Further described Howl's missile, psrvhitfunc 17
(9/21/2021) Described moltenboulderemerge a bit better.
(10/13/2021) Organized guide. Also described many functions thanks to VV: psrvhitfunc=14,4,23,5,11,30,50,51 and psrvdofunc=8,9 (and some cltfuncs that I don't care about enough to list).
(11/16/2021) Thanks to VV: psrvhitfunc=52 and psrvdofunc=37


[SKILLS MODIFYING AND/OR USING MISSILES.TXT] This section describes how skills modify and control missiles via skill functions.
[DOFUNC MISSILES] Missile function that will do something while the missile exists and/or as it moves.
[HITFUNC MISSILES] Missile function that will hit something and produce an effect (if collidekill=0, then the hitfunc will only trigger on the first hit, unless piercing is used, in which case each time the missile successfully pierces it will trigger another hitfunc).
[MIXED MISSILES] Missiles that make sense to be used with both hitfuncs and dofuncs. Also some odd missiles that aren't understood.
[OTHER WAYS OF GENERATING MISSILES] Lists a few other ways to generate missiles.


----


[SKILLS MODIFYING AND/OR USING MISSILES.TXT]

srvmissile/cltmissile: Makes a skill shoot out a srvside/cltside missile from the user's location. These columns function for every skill, although they break moving sequences, making them virtually unusable for Charge, Whirlwind, Leap and Leap Attack. These missiles are not influenced by Skills.txt (except for the following periodic setup) or unless you set specific functions/parameters in Missiles.txt that reference Skills.txt.

[Any skill] Releases a missile while a state is active after every perdelay frames elapse
(srvmissile/cltmissile=missile to launch)
(pcltdofunc=any function that applies a state to self)
(aurafilter=determines the targets for blade shield to attack)
(aurastate=state that must be active for missile launching)
(auralencalc=duration of state)
(periodic=1;perdelay=frames that must pass for another missile launch)

srvmissilea/b/c and cltmissilea/b/c/d: Due to the complexity of these columns, I will individually describe as many cases as I can find. Following are numerous cases, first describing what occurs, then in parentheses describing the srvside requirements followed by the cltside requirements. Following are the relevant fields that change the missile, which have mostly been described by other sources, but I'm doing it again anyways for the sake of being thorough.


[Multiple Shot][Teeth] Multiple missiles launched when not using a crossbow
(a,srvdofunc=8,cltdofunc=17)
[Multiple Shot][Teeth] Multiple missiles launched when using a crossbow
(b,srvdofunc=8,cltdofunc=17)
(clc1=number of missiles that cannot cause hit effects)
(clc2=how many frames must pass until the missile can collide with something; submissiles ignore this)
(clc3=number of clc1 missiles that cause hit effects; if the number is greater than clc1, then an additional clc3-clc1 srvside hit effect missiles are released)
(note: can also add in cltstfunc=19 to release cltmissilec)

[N/A] An unused srvdofunc. Appears to work identically to srvdofunc=4, it releases a cone of missiles which gets tighter as you aim farther away, the number of missiles equivalent to calc1. Unlike srvdofunc=4, it does not change missile based on the weapon you equip.
(srv:a,srvdofunc=138)
(calc1=number of srvmissilea to release)

[Strafe] Repeated missiles launched when not using a crossbow
(a,srvdofunc=8,srvdofunc=12,cltstfunc=13,cltdofunc=20)
[Strafe] Repeated missiles launched when using a crossbow
(b,srvdofunc=8,srvdofunc=12,cltstfunc=13,cltdofunc=20)
(clc1=number of nearby targets to fire missiles at)
(clc2=applies damagepercent to all physical damage of missile)
(clc3=number of missiles to fire at nearby targets; cannot exceed clc1)
(param6=% frame rollback; percentage of frames to shave off from the action frame for each repeat)


[Guided Arrow][Bone Spirit] Missile locks onto a nearby target
(a,srvdofunc=10,cltdofunc=18)
(clc2=applies damagepercent to all physical damage of missile)
(missiles.txt: pclthitfunc=13,pcltdofunc=7,psrvhitfunc=10,pcltdofunc=7)
(param1/cltparam1=appears to be nonfunctional)
(param2=radius of target searching)

[FingerMageSpider] Releases a single missile with controllable subloops{?}. Seems to lock on just like Guided Arrow.
(a,svdofunc=101,cltdofunc=57)
(clc1={subloops; not sure what this does})


[Charged Strike] Multiple zig-zagging missiles launched from target
(a,srvdofunc=11,cltdofunc=19)
(clc1=number of missiles)


[Lightning Strike] Missile launched from target locks onto nearby target
(a,srvdofunc=14,cltdofunc=22)
(clc1=radius of target searching; if radius=0, then it will not release a missile; if radius=1+, it will search for a nearby enemy, and if none are within radius, then it will target the user)
(clc2=number of hits; only relevant if you are using missiles.txt: pclthitfunc=16,psrvhitfunc=12)


[Charged Bolt] Multiple zig-zagging missiles launched
(a,srvdofunc=17,cltdofunc=23)
(clc1=number of missiles)


[Inferno] Release 9 missiles in rapid succession
(srv:a,clt:a/b,srvstfunc=11,srvdofunc=19,cltstfunc=15,cltdofunc=24)
(clc1=delay until missiles come into existence)

[Inferno] Release many missiles, releasing more with higher slvl
(srv:a,clt:a/b,srvdofunc=19,cltstfunc=15,cltdofunc=24)
(clc1=delay until missiles come into existence)


[Frost Nova][Nova][Howl][DiabFire] Release 64 missiles around user with controllable velocity.
(a,srvdofunc=22,cltdofunc=25)
(clc1=missile velocity added to srvmissilea)
(cltcalc1=missile velocity added to cltmissilea)

[Shout][Battle Orders][Battle Commands][Battle Cry] Release 64 missiles around user. {not sure what the point of this is in comparison to other novas}
(a,srvdofunc=68,cltdofunc=25)


[Blaze][SpiderLay] Releases one missile per tile traveled. Also is an incredibly versatile aurastate, allowing you to control up to 11 different stats at once while duration is active as well as auraevents.
(srv:a,clt:a/b/c,srvdofunc=23; srva must have velocity=0 or it will not spawn; clta/b/c require blaze state to be produced)
(aurastate=state that must be active for missiles to be released; use blaze if you want clta/b/c to work properly)
(auralencalc=length of state)
(aurastat1-6 AND passivestat1-5 are active while the state is active; this is the only non-aura in the game that applies temporary passivestats; this is very fortunate since you might want to use an aurastat-applying missile to the produced missiles, this allows you to counteract stats gained/lost via aurastats with passivestats)
(auraevent1-3,auraeventfunc1-3 can also be enabled for the duration)
(NOTE: the cltside missiles released per tile traveled only function properly if the skill's ID is 511 or less. If the ID is higher, then the skill will instead use cltmissilea/b/c from ID=511. If you want more than one clone of this skill past ID=511 and also want them to have different cltmissiles, then you could leave cltmissilea/b/c blank in ID=511 and try to produce graphics via spawned monsters with srvmissiles, although synchronization may or may not work well depending on what you are using this skill with.)


[Fire Wall] Release two missiles at the target location that travel in opposite directions perpendicular to the user
(srv:a,clt:a,srvdofunc=24,cltdofunc=26)

[Fire Wall] Release two missiles at the target location that travel in opposite directions perpendicular to the user (a) and release one srvside missile at the target location that travels southward (b)
(srv:a,b,clt:a,srvdofunc=24,cltdofunc=26)
(note: monsters are always srv&cltside, so if you spawn an invisible monster that immediately dies, you can have it generate a graphical missile to somewhat make up for the lack of cltside on missileb)

[Fire Wall] Release one srvside missile at the target location that travels southward
(srv:b,srvdofunc=24)




[Chain Lightning] Releases a single missile
OR
Releases a missile that targets a nearby enemy after hitting an enemy
(a,srvdofunc=26,cltdofunc=27)
(clc1=number of hits; only relevant if you are using missiles.txt: pclthitfunc=16,psrvhitfunc=12)
(aurarangecalc=search radius for nearby enemy after hitting a target)

[Blizzard][Meteor] Release a stationary missile at target location
OR
Release a missile at target location that travels southward srvside and toward you cltside
(a,srvdofunc=28,cltdofunc=28)

[DeathMaul] Releases a single srvside missile at the target location that travels south; releases two cltside missiles, (a) one that travels towards the user and (b) one that travels outward from the target location
(srv:a,clt:a&b,srvdofunc=136,cltdofunc=76)

[Phoenix Strike] Release a stationary missile at target location
OR
Release a missile at target location that travels southward srvside and toward you cltside
(a,srvdofunc=40,cltdofunc=14)


[Thunder Storm] User releases stationary missiles periodically. The missilea has troubles producing submissiles/hitsubmissiles, although moltenboulderemerge works great. Notably, if you use Thunder Storm as a chance to cast that isn't in the original ID, then it will only trigger when you satisfy the event (e.g. if you set up a thunder storm derivative that is cast via striking, then it will only release bolts if it triggers the skill again on striking, unless you cast the skill itself, then it will both cast bolts periodically as per expectation as well as when you trigger the event; it also doesn't re-apply the state each time via ctc, it will only trigger the missile release; basically, this is worthless for ctc).
(a,srvdofunc=29,cltprgfunc1=84)
(aurastate=state that must be active for missiles to be released)
(auralencalc=length of state)
(periodic=1,perdelay=frames between releases)
(note: missiles must be stationary or they deal no damage)
(note: has srvstfunc=13, but it does not seem to be necessary)


[Chilling Armor] User releases a missile when hit by a missile
(a,srvdofunc=18/23/or any other srvdofunc that applies a state)
(aurastate=state that must be active for missiles to be released)
(auralencalc=duration of aurastate)
(aurastat1-5,passivestat1-5 are only active when state is active)
(auraevent1=hitbymissile)
(auraeventfunc1=1)
(auraevent2-3,auraeventfunc2-3 can also be enabled for the duration)

[Amplify Damage] Target releases a missile when hit by a missile
(a,srvdofunc=30/or any other srvdofunc that applies a state to a target, but auras don't seem to work)
(auratargetstate=state that must be active for missiles to be released)
(auralencalc=duration of aurastate)
(aurastat1-5,passivestat1-5 are only active when state is active)
(auraevent1=hitbymissile)
(auraeventfunc1=1)
(auraevent2-3,auraeventfunc2-3 can also be enabled for the duration)


[Corpse Explosion][NihlathakCorpseExplosion][mon death sentry] Consume a corpse srvside&cltside, deal physical/elemental explosion damage and release cltside missiles that travel randomly north, east, south or west
(clt:a&b&c,srvdofunc=55,cltstfunc=21,cltdofunc=23)
(aurarangecalc=radius of explosion)
(searchenemynear=1,selectproc=1,targetcorpse=1)
(clc1=minimum /players1 HP dealt as damage)
(clc2=maximum /players1 HP dealt as damage)
(clc3=percent of physical damage to convert to etype; varies from 0-100%)
(etype=the elemental damage conversion type of the explosion; also applies elen)
(note: to make the corpse disappear, need to also use srvstfunc=17)


[Poison Explosion] Consume a corpse srvside, releasing 8 velocity-locked srvside missiles in a circle around the corpse (clta&c target the player, cltb is synchronous with srva)
(srv:a,clt:a/b/c,srvdofunc=63,cltstfunc=21,cltdofunc=33)
(searchenemynear=1,selectproc=1,targetcorpse=1)
(note: the produced missiles srva/cltb have a very low, locked velocity that is independent of missiles.txt vel column; setting maxvel and accel in missiles.txt allows you to override this locked velocity)
(note: to make the corpse disappear, need to also use srvstfunc=17)

[Sacrifice] Produces randomized cltmissilea.
(clt:a,cltdofunc=34)
(cltcalc1=randomly selects a missile starting from srvmissilea, with 0 and 1 producing srvmissilea only, 2 producing srvmissilea OR the ID after it, 3 producing srvmissilea OR the ID after it OR the ID after that)

[Blessed Hammer] Releases a spiralling missile that does ~2.5 increasingly large revolutions around the player then stops, starting from the upper left; after stopping, the missile and produced submissiles become cltside only
(a,srvdofunc=73,cltdofunc=35)
(par1=percent of damagepercent that applies only to magic damage added to srvmissilea, including magic damage from the skill/missile as well as the user's magic damage if using srcdam; state that gives the damagepercent must be concentration)

[Fist of the Heavens] Releases a srvside missile from a target that travels south and a cltside missile from a target that targets the user
(a,srvdofunc=80,cltdofunc=36)

[Fist of the Heavens] Releases clc4 srvside missiles from a target that travels south and a cltside missile at every selected target within a defined radius; srvside and cltside missiles are desynced. The delay missile itself is very unique in that it hits a specific target only after a defined duration (the missile's range) passes.
(a,srvdofunc=80,cltdofunc=36)
(aurafilter=determines which targets the submissiles can collide with)
(aurarangecalc=determines the radius that targets will be selected within)
(clc4=the number of srvside bolts to release)
(missiles.txt: hitsubmissile1,pclthitfunc=26,psrvhitfunc=22)
(note: for some reason, using the same missile as holy bolt will not allow them to heal, even though holy bolt healing is controlled by missiles.txt; you can however use shout missiles which apply states, which can be set to heal)


[Double Throw] Throws an additional instance of your throwing weapon
(srvdofunc=74,cltdofunc=42)
(srvmissile=,cltmissile=; both should be blank, otherwise the inputted missile will replace the throwing weapon's missile, which will not have clc1 damage appended to it)
(clc1=percent damage applied to both instances of your throwing weapon; will not apply if you use a srvmissile)
(toht,levtohit,tohitcalc: unlike arrow skills which pretend to apply attack rating, this will actually append it, applying to both instances of the thrown weapon; just as with damage, replacing one of the instances with any missile will cause it to not gain the attack rating bonus)


[Grim Ward] Consume a corpse to produce a srvmissile that travels directly down and a cltmissile that travels towards the user. Notably, this is the only skill to make full use of srvmissilea/b/c. Will also always produce cltside corpse gibs.
(srvstfunc=75,cltstfunc=41)
(srvmissilea/b/c=,cltmissilea/b/c=; missile selected depends on the size of the corpse, as determined in monstats2.txt by the columns "small" and "large", with small=0/large=0 producing missilea, small=1 producing missileb, large=1 producing missilec; small=1/large=1 results in missilec)
(NOTE: in vanilla, this skill uses srvstfunc=33 and cltstfunc=26 but they don't seem to do anything)

[Quick Strike] Should be deprecated. All it seems to do is break Blood Raven, so that instead of firing raven2 srvside and cltside, she fires raven1 srvside and raven2 cltside. Only fires srvmissilea if you are wielding a bow or crossbow. Decreases quiver quantity. Will only shoot srvmissilea if you select a target. Made even more awkward by the lack of cltside functions.
(srvstfunc=50,srvdofunc=92)
(srvmissilea)

[Firestorm] Release one missile that travels straight, and additional missiles that travel in a zigzaglike pattern
(a,srvdofunc=117,cltdofunc=67)
(clc1=# of missiles to release; 1 releases a single, straight moving missile; any higher number releases #-1 missiles that travel in the zigzaglike pattern that appear in an increasingly large, straight row)

[Rabies] Melee attack applies state to target, making them constantly release missiles at nearby targets
(srv:a,srvstfunc=57,srvdofunc=121)
(auratargetstate=duration of spreading and missile release)
(ELen=duration of state and missile release)
(missiles.txt: psrvdofunc=30, param1=frequency of submissile1 release, param2=radius?, submissile1=missile to release)
(note: missile release damage is based on the user's current damage from the skill, while the duration is based on the ELen of the skill when cast)

[Rabies] Melee attack applies state to target, making them constantly release missiles at nearby targets and spread the state to nearby targets
(srv:a,srvstfunc=57,srvdofunc=121)
(auratargetstate=duration of spreading and missile release)
(ELen=duration of state and missile release)
(missiles.txt: psrvdofunc=30, param1=frequency of submissile1 release, param2=radius?, submissile1=missile with psrvdofunc=any,psrvhitfunc=53)
(note: missile release damage is based on the user's current damage from the skill, while the duration is based on the ELen of the skill when cast)

[Rabies] Melee attack applies state to target, making the target release a missile to the south based on your skill level that is owned by the target (meaning it will damage the user instead of the target)
(srv:a,srvstfunc=57,srvdofunc=121)
(auratargetstate=state that is applied)
(ELen=duration of state; cannot release another missile until the state expires)
(note: missile release damage is based on the user's current damage from the skill, while the duration is based on the ELen of the skill when cast)


[Twister][Tornado] Release multiple missiles with semi-random movement
(a,srvdofunc=118,cltdofunc=68)
(clc1=number of missiles to release)

[Volcano] Creates a srvside missile that travels south from a target location, and two different cltside missiles at the location that target the user
(srv:a,clt:a&b,srvstfunc=123,cltprgfunc1=91)

[GargoyleTrap] Releases a missile only if you cast on an enemy; cannot release missile above or below the user, if it is attempted in this direction then it will choose the nearest possible angle to shoot from; only shoots in ~16 possible directions
(a,srvstfunc=93,cltstfunc=51)

[UnholyBolt][ShamanFire] Releases a missile based on your ID. This works somewhat for players (ama=0, sor=1, nec=2, pal=3, bar=4, dru=0, ass=1). So for example, the amazon and druid will release srvmissilea, the sorceress and assassin will release the missile after srvmissilea, the necromancer will release the missile after that, and so on. This func is responsible for two bugs in vanilla, both likely in part due to the lack of a synchronized cltside function:
(1) Unraveler5 gets SanctuaryCenter instead of another unholybolt, resulting in no damage dealt
(2) Fallen Shamans use shafire1 for cltside, but shafire1-5 for srvside, which have progressively increased speeds, and thus progressively increasing desyncs
(srv:a,srvdofunc=85)

[Imp Fire Missile] Releases a single srvmissilea depending on your ID. See the above function for an explanation. This is different in that it supposedly gets a calc.
(srv:a,srvdofunc=132)
(calc1=range adder; from my testing, this does nothing)

[PrimePoisonNova] Releases one controlled-velocity very slow moving circle of 8 missiles and a second controlled-velocity moderate speed controllable shape of 0-8 missiles. Note that this func overrides missiles in a weird way: param1 of the missile is the "slow drift speed" and param2 of the missile is the "fast drift speed", which allows you to give different velocities to each of the two novas.
(a,cltstfunc=99,cltdofunc=55)
(clc1={subloops? not sure what this does})
(clc2=second controllable circle controller; 0-1=nothing, 2=8 missiles in an octagon, 3=5 missiles in a pentagon, 4=4 missiles in a square, 5=3 missiles in a triangle, 6=3 missiles in a scalene triangle, 7=3 missiles in an acute triangle, 8=2 missiles in a line one going to the northeast and the other to the southwest, 9=2 missiles, one always goes to the north and the other to the southwest, 10-14=2 missiles, one always goes to the southwest and the other is increasingly angled away from the north and closer to the southwest, 15+=1 missile, always goes to the southwest)
(missiles.txt: param1=slow drift speed; param2=fast drift speed)
(note: although vel doesn't do anything, you can change accel and maxvel in missiles.txt to make the missiles move faster)

[DiabWall] Releases multiple semi-zigzagging missiles; sometimes some of the missiles move completely straight depending on angle and number of missiles
(a,srvdofunc=102,cltdofunc=58)
(clc1=number of missiles)


[ArcaneTower] Releases 64 missiles in a circle but only if you select an enemy; missiles look like they are falling from a height for a distance, then resume their normal travel; produced submissiles are not heightened
(a,srvdofunc=106,cltdofunc=61)

[Claws of Thunder] Release 64 missiles in a circle from the selected enemy target
(a,srvdofunc=36,cltdofunc=10)


[DesertTurret] Releases multiple missiles in a straight row, with your aim directing only the middle-most missiles creating a bulging effect
(a,srvdofunc=105,cltdofunc=60)
(clc1=number of missiles)


[Baal Cold Missiles] Releases a single missile that generates two submissiles every frame, which travel perpendicular to the missile
(a,srvdofunc=139,cltdofunc=81)
(missiles.txt: pcltdofunc=52,psrvdofunc=31,submissile1/cltsubmissile1=released in an arrow formation)

[Wake of Destruction Sentry] {Appears to behave exactly the same as Baal Cold Missiles} {???}
(a,srvdofunc=125,cltdofunc=70)
(missiles.txt: pcltdofunc=52,psrvdofunc=31,submissile1/cltsubmissile1=released in an arrow formation)

[Vine Attack] Releases multiple zig-zagging srvmissiles at the target location in a circle; and (clta) one straight cltmissile that is always released from the user to the right of the aim and can only move in 9 directions, (cltb) multiple zig-zagging cltmissiles that are released at the target location in a circle
(srv:a,clt:a&b&c&d,srvdofunc=130,cltstfunc=49)
(cltcalc1=number of cltside missiles to spawn; should set cltcalc1=clc1 so that they are synchronized)
(cltcalc2={delay? doesn't seem to do anything}
(cltcalc3={min dist between missiles? doesn't seem to do anything})
(clc1=number of srvside missiles to spawn)
(clc4={unknown, doesn't seem to do anything})
(note: the srvmissilea and cltmissileb are slightly out of sync, with cltb traveling ahead of srva)

[RogueMissile][HireableMissile][MissileSkill1] Releases a single missile only if you are equipping a bow or crossbow; releases nothing if you are not using a bow/crossbow. You must select a target when firing, or the missile will be cltside only.
(a,srvdofunc=110,cltdofunc=66)

[mon inferno sentry][Horror Arctic Blast][FetishInferno][Baal Inferno][MegaDemonInferno] Releases a single srvside missile and two cltsidemissiles which are randomly chosen between cltsidemissilea/b, with one of the cltsidemissiles being randomly staggered
(srv:a,clt:a/b,srvstfunc=53,srvdofunc=95,cltdofunc=54)
(anim=SQ, seqnum=6, seqinput=10)
(clc1=overrides the range of the missile regardless of what missiles.txt says)
(clc2=fire length; determines the frames that a monster will use the skill for; number of missiles produced is = 1+(firelength-10)/density ; one missile is produced at the start from frames 0-10, and following that missiles are produced every firelength/density frames)
(clc3=density; modulates the number of missiles produced)
(note: skill level also increases missile range)

[Imp Inferno] Releases a single srvmissile and two cltsidemissiles which are randomly chosen between cltsidemissilea/b; allows for complete clc control over missile range
(srv:a,clt:a/b,srvdofunc=126,cltdofunc=71; has srvstfunc=59 by default, but this makes it unusable for players)
(clc1=len; duration of channeling for a monster{?}{need exact formula})
(clc2=range override; ignores missiles.txt)
(note: skill level increases missile range and there is an additional added range at base level, but you can remove this offset by adding -19-24/lvl to clc2) {need to confirm that this is accurate up to a very high value}

[DoomKnightMissile] Monster releases a randomized missile within a defined missile ID range determined by Monstats2.txt S3v column
(a,srvdofunc=148,cltdofunc=94)
(see: https://d2mods.info/forum/viewtopic.php?t=66433)

[NecromageMissile] Monster releases a randomized missile within a defined missile ID range determined by Monstats2.txt S4v column
(a,srvdofunc=149,cltdofunc=95)
(see: https://d2mods.info/forum/viewtopic.php?t=66433)

[DiabLight] Release a missile that appears farther the higher the skill level
(a,srvdofunc=152,cltstfunc=40,cltdofunc=56)
(NOTE: the vanilla skill has srvstfunc=53, which is only necessary for Diablo; if Diablo does not have a skill with srvstfunc=53 in Sk1, then he will get stuck in the sequence and repeatedly cast that skill indefinitely)

[AndrialSpray] Release a desycned srvside and cltside missile; srvside missile is always spawned at the top left, top right, bottom left or bottom right part of the user; srvside missile is always slightly off to the left of the cltside missile. If used propertly (e.g. by a monster with a monseq), then it will release missiles in a spread during the animation, kind of like a Multiple Shot where you are shooting each arrow in each direction yourself.
(a,srvdofunc=88,cltdofunc=48)
(anim=SQ,seqnum=10,seqinput=10)


[Shock Field] Releases multiple missiles to a location in a tight cone that come into existence when they either collide with something or hit their max range; the range is defined by the location the user selects and completely ignores missiles.txt
(a,srvdofunc=43,cltdofunc=5)
(prgcalc1=number of missiles)
(note: due to the way range functions with this skill, it can have very unusual interactions with complex missiles like frozen orb, allowing the number of bolts released to be determined by the distance the player selects)
(note: the submissile placement tends to be all over the place, although mostly in a circle that gathers around the edge of the screen, if you use a missile like frozenorb)


[Blade Fury] Channel to release a missile every prgcalc1+1 frames
(a,srvstfunc=26,srvdofunc=48,cltstfunc=8,cltdofunc=6)
(prgcalc1=frames between each missile release)
(anim=SQ,seqnum=23,seqinput=12)
(note: you can remove srvdofunc=48 and the only difference will be that the first missile doesn't exist srvside)


[Claws of Thunder] Release 64/prgcalc1 zigzagging srvmissiles in a circle at the target location or enemy; release prgcalc1/64 zigzagging cltmissiles in a circle but only if you select an enemy
(a,srvdofunc=37,cltdofunc=11)
(prgcalc1=64/# missiles)


[Fists of Fire][Blades of Ice] Releases an explosion with a controlled radius at the target location; also releases cltmissiles within that radius of an equal density
(clt:a,srvdofunc=38,cltdofunc=9)
(prgcalc1=radius of explosion and cltmissile release)


[Fists of Fire][Blades of Ice] Releases a missile within a controlled radius at the target location; clt and srv spawn locations are not synchronized; clt targets the player; srv travels south of the spawn location at a slight angle
(a,srvdofunc=39,cltdofunc=9)
(prgcalc1=radius of missile release)


[Phoenix Strike] Releases a 64/prgcalc1 srvmissiles that do repeated figure-8s/serpentine movement with changing direction at the target location or enemy; does the same for cltmissiles, but only if you select an enemy target
(a,srvdofunc=143,cltdofunc=83)
(prgcalc1=64/# missiles)


[Phoenix Strike] Releases prgcalc1 missiles at the target location that move away from the location in a semi-random straight direction; clt and srv are completely out of sync
OR
Release prgcalc1 missiles at the target location that do circular loops and occasionally dive in toward the target location
(a,srvdofunc=41,cltdofunc=15)
(prgcalc1=number of missiles to release)
(missiles.txt: pcltdofunc=58,psrvdofunc=35; required if you want it to do loops)


[Hurricane]Releases 6, evenly spaced streams of cltmissile generation at a constant distance around the player; cltmissiles are generated on random z-heights
(clt:a&b&c,srvdofunc=any that can apply aurastate)
(aurastate=any state that has the proper settings)
(states.txt: active=1,setfunc=7,remfunc=4,cltactivefunc=90,srvactivefunc=145)
(cltcalc1=the number of cltmissiles to spawn per stream per frame)
(cltcalc2=the maximum z-height of the spawned cltmissiles)
(srvdofunc=124,resultflags=1; required to deal explosion damage)
(par3=explosion radius)
(par4=frames that must pass for an explosion to be released)

[Armageddon][Diablogeddon] Srvside missiles are released randomly within radius, traveling southward and trajectories that are slightly angled; cltside missiles are released randomly within radius at a heightened z-level that returns to ground after a bit, traveling in straight, semi-random directions away from the player
(srv:a,clt:a&b,srvdofunc=124,cltdofunc=92)
(aurarangecalc=radius to create missiles within; no missiles are released if set to 0)
(cltcalc1=frames it takes for the cltmissile to hit ground level)
(cltcalc2=z-velocity at which cltmissile falls to ground level)
(cltcalc3=y-velocity at which cltmissile falls from the right of the screen)
(par4=frames that must pass for a missile to be spawned; can be set to 0 which may or may not be the same as 1)

[] produce cltside missiles at the location, increasing with radius, that target the player
(clt:a,cltdofunc=30)
(aurarangecalc=radius missiles are spawned within)

[] release a cltside missile from the player at the start of the animation
(clt:c,cltstfunc=18)

[] release a random-ID cltside missile; missile is released either behind yourself, or 45 degrees to the left or right of behind yourself
(clt:a,cltdofunc=34)
(cltcalc1=#; add the number to the missile ID of cltmissilea and it will randomly select a missile ID between cltmissilea and cltmissilea+#)

[] releases randomly placed cltside missiles around the player that target the player via a state
(clt:a)
(aurarangecalc=radius that missiles will appear within)
(aurastate/auratargetstate/passivestate=missiles are only released while active)
(auralencalc=duration of aurastate/auratargetstate)
(states.txt: cltactivefunc=86)

[] Release a single cltside missile on first use, then release many on subsequent uses; only allows release in 9 directions and continues to release in a given direction if the user has used in that direction recently
(a,cltdofunc=49,cltprgfunc=93)
(anim=SQ, seqnum=6, seqinput=10)

[Dragon Tail] Release a single cltsidemissile that targets the player and a kick explosion if you are within melee range. Does not release srvmissilea.
(clt:a,srvstfunc=27,srvdofunc=50,cltstfunc=9,cltdofunc=7)
(aurarangecalc=radius of explosion)
(clc1=percent kick damage)

[Raise Skeleton] Release a single cltsidemissile from a corpse that targets the player
(clt:a,cltstfunc=20,cltdofunc=31)
(searchenemynear=1,selectproc=2,targetcorpse=1)

[Mind Blast] Releases cltmissiles at the target location, with radius (but not number) of cltmissiles being controlled
(clt:a,cltdofunc=8)
(aurarangecalc=radius cltmissiles are spawned within)

[corpsecycler][vinecycler] Consumes a corpse and releases srvmissilea southward, as well as cltmissilea/b toward nearby targets {Doesn't seem to function if used by player, even if the player selects a corpse with it}
(srv:a,clt:a,b;srvstfunc=63,cltstfunc=49,cltprgfunc1=93)

[Vine Attack] Spawns multiple srvmissilea and cltmissileb, varying based on calc1, at a target location. The missiles travel in a vein-like pattern. Cltmissilea is released southward from the user. Cltmissilec is only produced if used by a pet, constantly producing the missile as it moves. Cltmissiled is only produced if used by a pet, producing the missile when it is neutral.
(srv:a,clt:a,b,c,d;srvdofunc=130,cltstfunc=49)
(calc1=# missiles; how many missiles to release at the target location)
(calc4=frames to apply aura to target; likely defunct, originally this skill probably applied spidergoo, which applies an aurastate, but it is not set up like that in vanilla)

[N/A] An unused srvdofunc. When used on untargeted ground, it releases srvmissilea normally. When used on a target (like a monster), it releases srvmissilea southward from the target. {Not sure if it has a cltdofunc.} If no cltdofunc exists for it, then it will be rather awkward to make use of.
(srv:a,srvdofunc=151)

[quick strike] {Unknown purpose, does not seem to work with players. Doesn't seem to do anything special either.} Releases srvmissilea and a cltside fire arrow.
(a,srvstfunc=50,srvdofunc=92)

---

[DOFUNC MISSILES]

[monblizcenter] Releases submissile1 and cltsubmissile1 & cltsubmissile2 within a radius every time the frequency elapses.
(pcltdofunc=10, psrvdofunc=8)
(param1&cltparam1=base radius; radius that submissiles are released within)
(param2&cltparam2=base freq; how many frames must elapse for another submissile to release)
(param3&cltparam3=level divisor; {unknown}, seems to do almost nothing, lower values can increase frequency slightly)

[blizzardcenter] Missile subreleases submissile1 and cltsubmissile1/cltsubmissile2; subrelease is controlled by skills.txt
(srv:sub1,clt:sub1/2,pcltdofunc=13,psrvdofunc=10)
(clc1=radius over which submissiles are spawned)
(clc2=frames that must pass for another submissile to spawn)

[bat lightning bolt] Constantly releases a downward-traveling submissile1 as it moves. Not sure if there is a cltfunc for this.
(psrvdofunc=9)
(submissile1=)

[erruption center] Missile subreleases submissile1 and cltsubmissile1/cltsubmissile2; subrelease is controlled by skills.txt
(srv:sub1,clt:sub1/2,pcltdofunc=48,psrvdofunc=25)
(clc1=radius over which submissiles are spawned)
(clc2=frames that must pass for another submissile to spawn)

[volcano] Missile subreleases submissile1/cltsubmissile1; radius and rate of fire is controlled by skills.txt. The submissiles are given a randomized point within the radius to move toward, and their velocity is changed such that no matter how far it is, it will always run out of range when it reaches the randomized point (and if the point is the same as the missile, then it won't move at all, remaining stationary until its range elapses). This is the only missile function in the game that has randomized missile release from a single point; additionally, it is unique in that the randomized missiles can move (in all other cases, the missiles are set to be stationary since they will always move directly downwards: see Blizzard and Fissure).
(sub1,pcltdofunc=50,psrvdofunc=28)
(aurarangecalc=radius of submissile release)
(clc4=frames that must pass for another submissile to be released)

[tornado] Missile releases explosions; radius, target selectivity and rate is controlled by skills.txt (or can be controlled by missiles.txt param1/2 if desired, with param1=frequency and param2=radius)
(psrvdofunc=27)
(aurafilter=selects targets to be hit by explosion)
(aurarangecalc=radius of explosions released)
(clc4=frames that must pass for another explosion to be released)

[blade shield attachment] Missile must be present for Blade Shield to function; only required missile column is that it has pcltdofunc=57. Note that if you use cltsubmissile1, then it attaches a missile to you that spawns circling (ala Blessed Hammers) cltsubmissile1. These cltsubmissile1 missiles are released until the range expires. Looks cool, but it is unfortunately cltside-only.
(missiles.txt: pcltdofunc=57)
(srvstfunc=28,srvdofunc=54)
(srvmissilea=missile with pcltdofunc=57)
(aurafilter=determines the targets for blade shield to attack)
(aurastate=state required for blade shield to attack)
(auralencalc=duration of state)
(periodic=1;perdelay=frames that must pass for another attack)

[grimwardmediumstart][grimwardsmallstart][grimwardlargestart] {}

[grimwardmedium][grimwardsmall][grimwardlarge] A missile that casts a skill periodically, making it act kind of like a pet or a pet with an aura. If the missile moves, the skill use will still apply from its original position. Does not seem to be able to deal direct damage as a missile (i.e. if it collides with an enemy and has damage values, nothing will happen).
(psrvdofunc=14)
(param1=repeat frame; determines how often the skill func is used)
(param2=skill func; defines the srvdofunc used by the grimward)
(skills.txt: clc1=duration of missile)

[grimwardscare] {}

[moltenboulder] Missile subreleases submissile1 and cltsubmissile1-3; missile numbers depends on the distance traveled (meaning velocity, acceleration and range all scale the number) as well as the direction you aim, with straight up or down reducing the missile count most significantly
(srv:sub1,clt:sub1-3,pcltdofunc=47,psrvdofunc=6)

[vines][plague vines] Missile that subreleases another submissile1/cltsubmissile1 each time param1/cltparam1 frames elapse; submissile1 is released southward; cltsubmissile1 only exists if its velocity=0
(sub1,pcltdofunc=49,psrvdofunc=26)

[blade creeper] Makes the user automatically hit nearby targets. The missile seems to automatically travel with the user, unless you travel through a waypoint or portal.
(pcltdofunc=43,psrvdofunc=20,psrvhitfunc=37)
(size=; determines the radius to hit monsters within)
(srcdam=,mindam/maxdam,etype,emin/emax,elen; these are all applied to each hit)

[blade creeper][catapultchargedball on][catapult spike ball on][catapult cold ball on][catapult plague ball on][catapult meteor ball on] Makes a missile appear to travel with the user, fairly useful as far as cltside functions go.
(pcltdofunc=43)

[brdeathcontrol] Produces cltsubmissile1 randomly around the user.
(pcltdofunc=21)
(cltparam1=radius; {not really sure what it does, but it definitely does something}, crashes if the value is too large)
(cltsubmissile1=; only seems to work if the cltsubmissile1 has pcltdofunc=1)

[brdeathlightningbolt] Only seems to randomly move around if produced as cltsubmissile1 from a missile with pcltdofunc=21.
(pcltdofunc=22)
(cltparam1=retarget frame; how many frames must elapse for it to randomly change direction)
(cltsubmissile1=)

[denofevillight] Produces a missile that exists indefinitely cltside, so long as you do not return to Town.
(pcltdofunc=23)

[towermist] Produces a missile that releases cltsubmissile1 all around itself.
(pcltdofunc=25)
(cltparam1=dest radius; controls the range cltsubmissile1 will travel)
(cltparam2=init radius; controls the distance from the missile that cltsubmissile1 will be spawned from)
(cltparam3=frequency; number of frames that must pass for another cltsubmissile1 to be released)
(cltsubmissile1=)

[mephistodeathcontrol]
(pcltdofunc=26)
(cltparam1=firewall frequency; how many frames must pass for another cltsubmissile1 to be released)
(cltparam2=rock frequency; how many frames must pass for another cltsubmissile2 to be released)
(cltparam3=radius; seems to control the total range of cltsubmissile1, causes a crash if the value is too high)
(cltsubmissile1=controlled by cltparam1 and cltparam3)
(cltsubmissile2=controlled by cltparam2; lobbed out in the Z-direction and collides with the ground; how high it goes is probably controlled by the cltsubmissile2's range)

[mephistofirewallmaker][andyfirewallmaker] Only seems to work if spawned as a cltsubmissile of a different missile (not thoroughly tested).
(pcltdofunc=27)
(cltparam1=how many frames must pass for cltsubmissile1 to randomly change directions)
(cltsubmissile1=)

[mephistodonotdraw] Spawns 4 cltsubmissile1. They will be spawned in a similar way as Teeth or Multiple Shot, but they can only be released in 8 equally spaced directions and the cltsubmissiles themselves will have randomized apparent directions despite all moving in the same direction.
(pcltdofunc=28)
(cltparam1=activation frame; the frame at which the four cltsubmissile1 will be released; if it exceeds the range, then it doesn't happen)
(cltsubmissile1=)

[horadricstaff] Hardcoded. Allows ID=338 to produce the Horadric Staff graphics.
(pcltdofunc=31)

[towerchestspawner] Releases cltsubmissile1 in random directions (not synchronized with the gold dropping outside of the delay which can easily be controlled by other means, hence why I've separated it from psrvhitfunc=33).
(pcltdofunc=30)
(cltparam1=start delay; cltsubmissile1 only starts being produced after this time runs out, in frames)
(cltparam2=spawn interval divisor; spawns slower the higher the number is)
(cltparam3=radius; {doesn't seem to do anything})
(cltsubmissile1=)

[cairnstones] Spawns a portal to a level and creates a bunch of missiles randomly within the defined radius over the range of the missile.
(pcltdofunc=24,psrvdofunc=17,psrvhitfunc=32)
(param1/cltparam1=fade frames; {???; seems as if it skips the number of frames entered})
(param2/cltparam2=lightning delay; how many frames must elapse for another submissile1/cltsubmissile1 to be released)
(param3/cltparam3=radius to randomly produce submissile1 within; srv and clt does not seem to be synchronized)
(param4=destination level; chooses a level from levels.txt and creates a portal to it; crashes if the portal leads to a level from a different act)
(param5=portal delay; number of frames that must elapse for the portal to spawn)
(cltsubmissile1/submissile1=missiles to spawn within param3 radius every param2 frames)

[durieldeathcontrol] Produces screen shaking, and the missile durieldeathrock. {Also produces some kind of explosion, don't care enough to check which one it is.} Modifying the range makes it produce the missiles for longer, although the screen shaking will only occur towards the end of the range.
(pcltdofunc=36)

[diablo appears] Shakes the screen for a fixed duration towards the end of the range. Also causes the "Not even death can save you from me" line to play.
(pcltdofunc=37)

[izual control] Rapidly spews out izual mist loop and izual mist fade. Also allows you to control when it starts and stops spewing out izual lightning and izual lightning trail.
(pcltdofunc=42)
(param1=lightning start; determines the frame in which it starts spewing izual lightning)
(param2=lightning stop; determines the frame in which it stops spewing izual lightning)

[distraction] An extremely useful and unique missile function. Functions like Blaze, but does not depend on a skill nor a state. Creates some kind of missile that follows you around (it's invisible), producing submissile1 as you move. There does not appear to be a limit to the number of these you can have following you at once. Only seems to disable itself if town=0 and you go to town. {The cltside graphics do not seem to function at all.}
(pcltdofunc=44,psrvdofunc=21)

[distraction fog] Creates clthitsubmissile1, which seem to spawn distributed along west/east/north/south, but also spaced apart if on a given direction.
(pcltdofunc=45)
(cltparam1=spawn rate; determines how many frames must pass for another clthitsubmissile1 to spawn, seems to have a global timer instead of being relative to the initial missile appearance)
(cltparam2=number; determines how many clthitsubmissile1 are produced per spawn)
(cltparam3=radius; {???})

[anya center] Shakes the screen. Hardcoded to only produce a few specific ID missiles.
(pcltdofunc=54)

[world stone chip 1][world stone chip 2][world stone chip 3][world stone chip 4] {Doesn't seem to do anything special, probably only functions right when produced in the Worldstone Chamber}
(pcltdofunc=59)

[bonewallmaker] See The Guide to Almost All Non-Missile Skill Functions under Bone Wall.

[tigerfury] Cltside produces a trail of clthitsubmissile1. Srvside does not seem to do anything {???}
(pcltdofunc=53, psrvdofunc=32)

[ancient death center] Produces ancient death cloud around itself.
(pcltdofunc=55)

[baalfx spirit 1][baalfx spirit 2][baalfx spirit 3][baalfx spirit 4][baalfx spirit 5] {probably specially called by baalfx control} {???}
(pcltdofunc=65)

[nehlithakcontrol] Controls the whirlwind/fissure thing that Nihlithak produces on death.
(pcltdofunc=62)

[nehlithakswoosh][nehlithakdebris1][nehlithakdebris2][nehlithakdebris3][nehlithakdebris4] {???}
(pcltdofunc=63)

[baal taunt control] The only missile in the entire game that creates all submissiles, randomly selecting between submissilea/b/c. Also has a built-in delay before it starts firing, as well as allowing you to control the frequency of submissilea/b/c production. Note that if param2/3/4=0, then that submissile and all following submissiles will not be selected. Also automatically explodes submissiles to release their hitsubmissiles: even Frozen Orb will immediately spawn as an ice bolt nova, despite usually only expiring by range.
(pcltdofunc=56, psrvdofunc=34)
(param1,cltparam1=initial delay; how many frames must pass before a submissile is released)
(param2,cltparam4=missile 1 delay; how many frames must pass per submissile release)
(param3,cltparam4=missile 2 delay; how many frames must pass per submissile release)
(param4,cltparam4=missile 3 delay; how many frames must pass per submissile release)

[royalstrikechaosice] If used without srvdofunc=41, then it releases a missile straight south. With srvdofunc=41, it produces a defined number of missiles which can have definable, changing paths.
(pcltdofunc=58, psrvdofunc=35)
(param1/cltparam1=repath freq; how many frames must pass before the missile changes paths)

[baal cold maker][wake of destruction maker] Missile subreleases 2x submissile1/cltsubmissile1 as it travels; the number of missiles released is based on the total distance travelled, so if you make the missile faster or shoot it at the proper angles, then it will produce more missiles. If used with srvdofunc=139,cltdofunc=8 then it will form an arrow-like stream instead of a compact stream.
(pcltdofunc=52, psrvdofunc=31)

[rabiesplague] {doesn't seem to do anything when not used by rabies}
(psrvdofunc=30)

[hurricaneswoosh][hurricanecart][hurricanerock][hurricanesack][hurricanetree][hurricanevase] {Seems worthless unless used with Hurricane.}
(pcltdofunc=60)

[firestormmaker] Releases submissile1 and clthitsubmissile1/2/3 as it travels. Not that interesting unless used by Firestorm.
(pcltdofunc=6,psrvdofunc=23)


[recycler delay] A missile that is more like a skill than a missile. Lets you rejuvenate a defined % of max life after a delay.
(psrvdofunc=29)
(param1=active frame; determines when the life rejuvenation applies)
(skills.txt: calc1=life steal; determines the % of max life gained)

[recycler delay][vine recycler delay] The cltside part of the recycler delays. Makes the user invisible (except for their shadow) and releases missiles.
(pcltdofunc=51)
(cltparam1=launch vines frame; determine when cltsubmissile1 is released)
(cltparam2=active frame; determine when cltsubmissile2 is released)
(cltparam3=extra vines; determines how many cltsubmissile1 should be released)
(cltparam4=vine radius; determines the radius in which cltsubmissile1 will spawn)
(cltsubmissile1=missile is released after cltparam1 elapses)
(cltsubmissile2=missile is released after cltparam2 elapses)

[vine recycler delay] A function that is more like a skill than a missile. Lets you rejuvenate a defined % of max mana after a delay.
(srvdofunc=33)
(param1=active frame; determines when the mana rejuvenation applies)
(skills.txt: calc1=mana steal; determines the % of max mana gained)

[ProcessMissileDelayed]
(pcltdofunc=67, psrvdofunc=37)
(param1=frames until submissile1 release)
(param2=frames until submissile2 release)
(param3=frames until submissile3 release)
(cltparam1=frames until cltsubmissile1 release)
(cltparam2=frames until cltsubmissile2 release)
(cltparam3=frames until cltsubmissile3 release)
(submissile1,submissile2,submissile3=submissiles are released after respective param# delays)
(cltsubmissile1,cltsubmissile2,cltsubmissile3=cltsubmissiles are released after respective cltparam# delays)

---

[HITFUNC MISSILES]

[cairnstones] {Unknown purpose}
(psrvhitfunc=32)

[orbmist] Spews cltsubmissiles all over the place with configurable radii and frequency.
(pcltdofunc=25,psrvhitfunc=35 {unknown what psrvhitfunc=35 does; might be what triggers the countess chest to open})
(cltparam1=dest radius; {???})
(cltparam2=init radius; determines how far from center cltsubmissile1 can be released)
(cltparam3=frequency; controls how many frames must pass before another cltsubmissile1 is produced)
(cltsubmissile1=released in a distinct pattern)

[hellmeteordown] Produces a cltside-only fire patch after the missile expires; the fire patch has randomized animspeeds, which gives it variable duration. Strangely, it does not actually use clthitsubmissile1/2/3. Chitpar1/2/3 also appear to be useless.
(pclthitfunc=36)
(chitpar1=radius; {???})
(chitpar2=variable duration; {???})
(chitpar3=density; {???})

[immolationarrow] Missile subreleases hitsubmissile1 and clthitsubmissile1-3 in a radius and an explosion; radius of hitsubmissiles and explosion are controlled by skills.txt
(srv:hit1,clt:hit1&2&3&4,pclthitfunc=12,psrvhitfunc=9,resultflags=5)
(skills.txt: clc1=radius hitsubmissiles are spawned within)
(skills.txt: clc2=radius of explosion)

[lightningfury] Missile subreleases hitsubmissile1 and clthitsubmissile1; subrelease is controlled by skills.txt
(hit1,pclthitfunc=25,psrvhitfunc=21)
(aurafilter=determines targets of released missiles)
(aurarangecalc=determines range to search for targets)
(clc1=number of bolts to release)

[moltenboulder] Missile releases 18 hitsubmissile1 and clthitsubmissile1-3 within a defined, unchangeable radius; also releases explosion damage radius controlled by skills.txt; missile also always pierces size 1 and 2 units and always explodes on collision with size 3 units and units that are immune to knockback. It can deal weapon damage over its explosion radius (which won't apply any attack/striking/hit effects), which is highly useful.
(srvhit=1,clthit=1&2&3,pclthitfunc=52,psrvhitfunc=47,resultflags=5)
(skills.txt: aurarangecalc=radius of explosion damage)

[explodingjavalin][ice javalin] Explodes within a defined radius, dealing srcdam+dmg+elemdmg within the radius. Seems like a less weird, more generally useful moltenboulder. Highly useful if you want to add Melee Splash to your mod without using nextdelay (which I recommend, since nextdelay should be disused as often as possible).
(psrvhitfunc=44)
(s.HitPar1=damage radius; only functions if resultflags=5)
(skills.txt: aurarangecalc=radius of explosion)

[fireball][glacialspike] Missile deals damage with a radius explosion instead of by collision with a specific target; explosion radius is controlled by skills.txt.
(pclthitfunc=14,psrvhitfunc=13,resultflags=5)
(s.Hitpar1=radius of explosion; if set to 0 then skills.txt aurarangecalc is used instead)
(s.Hitpar2=freeze length; if set to 0 then skills.txt auralencalc is used instead)
(skills.txt: aurarangecalc=radius of explosion)
(skills.txt: auralencalc=freezing duration)

[catapult spike in air] Spawns hitsubmissile1 and clthitsubmissile1 after expiring. {Not sure if this has any unique behaviors, it doesn't seem to behave differently when used with catapult spike ball}
(pclthitfunc=44, psrvhitfunc=36)
(hitsubmissile1 & clthitsubmissile1=released after the missile expires)

[catapult cold ball] Releases a bunch of catapult cold explosion missiles, seems hardcoded.
(pclthitfunc=48)

[catapult cold explosion] Leaps in a random direction, produces the melting ice cube graphics after expiring.
(pclthitfunc=31)

[catapult meteor ball] Produces clthitsubmissile2 in a pattern like Meteor fire and flings molten boulder rock chunks. Seems like a fancier Meteor pclthitfunc.
(pclthitfunc=50)
(clthitsubmissile1={does not seem to do anything})
(clthitsubmissile2=produced in the same pattern as Meteor)

[vines trail] {}
(pclthitfunc=54)
(clthitsubmissile1=Released after missile expires)

[plague vines trail] Makes it so a missile stops dealing damage prematurely.
(psrvhitfunc=50)
(s.HitPar1=hit delay; makes it so the missile can only deal damage if hitpar1+range>=range left on missile, i.e. if you have 200 hitpar1 and 200 range on your missile, then it will be able to hit for the first frame only)

[healingbolt] {???}
(pclthitfunc=40)

[death mauler trail] {Doesn't seem to function unless used with the usual skill function}
(pclthitfunc=44)
(param1=spacing;)
(param2=draw delay;)

[catapultchargedball] A very confusing missile, although still somewhat useful. The supposed missile count is not anywhere close to the actual missiles released: it uses some annoying non-linear function. Has an interesting pathing for its hitsubmissiles, which follow a vein-like pattern. Strangely, the cltside missile seems to reference hitsubmissile1 instead of clthitsubmissile1.
(pclthitfunc=46,psrvhitfunc=38)
(s/cHitPar1=charged bolts; not accurate, see below)
(s/cHitPar2=charged bolts per level; not accurate, see below; I recommend ALWAYS setting this to 0 since if the value climbs to high it will crash)
(hitsubmissile1=missile to release, both srvside and cltside; appears to be perfectly synchronized)

Code: Select all

supposed charged bolt count=actual charged bolt count
1=1
2-3=10
4-5=12
6-7=14
8-9=16
10=10
11-12=18
13-14=20
15-16=22
17-18=24
19=19
20-21=26
22-23=28
24-25=30
26=34
27=32
28=28
29-30=34
31-32=36
33-34=38
35-36=40
37=37
38-39=42
40=44
41+=crash
[baal taunt lightning control] Releases hitsubmissile1 and clthitsubmissile1 in a random direction.
(pclthitfunc=62, psrvhitfunc=58)
(s.HitPar1=range; {???}, according to VV this determines the radius of the random area selection, but I haven't thought of a good way to test it)
(cHitPar1=range; {???})

[baal taunt poison control] Releases multiple hitsubmissile1 and clthitsubmissile1 in a kind of double-layered nova. The inner nova is "slow drift" and the outer nova is "fast drift". Seems to only be able to produce 9, 10, 11, 12, 13, 16 or 23 missiles. Modifies its hitsubmissiles by applying their params as velocity modifiers: param1 is slow drift and param2 is fast drift (if these are set to 0, then the hitsubmissiles will not move).
(pclthitfunc=63, psrvhitfunc=59)
(s.HitPar1=increment; 1=23 missiles, 2=16 missiles, 3=13 missiles, 4=12 missiles, 5=11 missiles, 8=10 missiles, 256=9 missiles)
(cHitPar1=increment; see above)

[baal inferno] A missile that can drain the target's mana.
(psrvhitfunc=55)
(s.HitPar1=mana drain %; this works like crushing blow, so if the target has 100 mana and the missile has 50% mana drain, then it will reduce them to 50/25/12.5/etc mana)

[armageddoncontrol][diablogeddoncontrol] Has a controllable explosion radius and produces hitsubmissile1.
(psrvhitfunc=56)
(s.HitPar1=damage radius; radius of explosion)

[armageddonrock][diablogeddonrock] Releases clthitsubmissile1 and clthitsubmissile2.
(pclthitfunc=55)

[taintedsunflash] {No known purpose; probably does something special but only when triggered by the quest} {???}
(pclthitfunc=38)

[durieldeathrock] Produces durieldeathsmoke and three durieldeathdebris in the target direction. When spawned by durieldeathcontrol, the durieldeathdebris seem to spew around randomly.
(pclthitfunc=41)

[bladefury1][bladefury2][bladefury3] Releases 1-8 arrows (seems to only release arrows, ID=0) in cardinal directions.
(pclthitfunc=64, psrvhitfunc=52)
(s.HitPar1=increment; see code)
(cHitPar1=increment; see code)
(hitsubmissile1=; must have a valid entry, but regardless of what you enter it will release ID=0, arrow)
(clthitsubmissile1=; must have a valid entry, but regardless of what you enter it will release ID=0, arrow)

Code: Select all

hitpar1=# arrows
0-1=8 arrows, in the cardinal directions
2=4 arrows: NW, NE, SE, SW
3=3 arrows: W, NE, SE
4=2 arrows: NW, SE
5=2 arrows: N, SE
6=2 arrows: NE, SE
7=2 arrows: E, SE
8=1 arrow: SE
[overseercontrol] Crashes the game. {Probably only works with Shenk}
(pclthitfunc=61)

[baalcorpseexplodeexpl] Produces clthitsubmissile1 {no idea why this exists} {???}
(pclthitfunc=44)

[fistoftheheavensdelay] Very unique in that it follows an enemy, only hitting them when the delay elapses, and never hitting anything else. Calc1 and calc2 do not do anything, the healing is deprecated. Annoyingly, calc4 determines the srvside submissiles, but does nothing about the cltside submissiles.
(pclthitfunc=26, pcltdofunc=22)
(s.Hitpar1=range; uses the skill's aurarangecalc if set to 0)
(s.Hitpar2=# bolts; references calc4 if set to 0)
(cHitpar1=range; uses the skill's aurarangecalc if set to 0)
(cHitpar2=; doesn't seem to do anything, always seems to produce one missile per nearby monster and targets all monsters within range regardless of their type)
(Range=the amount of frames it takes for the missile hit the target)
(aurafilter=determines what the missile will release hitsubmissiles at; does not influence the cltside)
(calc4=number of srvside bolts to release)

[catapult spike ball] Creates a missile which sends hitsubmissiles to the cursor without needing skill functions. Also has calculation controlled hitsubmissile count.
(pclthitfunc=47,psrvhitfunc=40)
(hitsubmissile1=missiles released towards the cursor, which explode upon reaching the location; note that this hitsubmissile1 will not explode if it has too little range/velocity relative to the catapult spike ball, it seems that it can get purged before it explodes)
(clthitsubmissile1=clt missiles released towards the curosr, which explode upon reaching the location)
(clthitsubmissile2=released when the missile expires, spawning like explosionmissile)
(skills.txt: calc4=number of hitsubmissile1 to release)

[meteorcenter] Missile subreleases hitsubmissile1 and simultaneously subreleases clthitsubmissile1-4; also subreleases an explosion which is controlled by skills.txt
(srv:hit1,clt:hit1&2&3&4,pclthitfunc=18,psrvhitfunc=14,resultflags=5)
(skills.txt: auralencalc=radius of explosion)

[holybolt][fistoftheheavensbolt] Missile can specify between undead/demon/beast, releasing clthitsubmissile1 only if it hits the undead. Note that if collidekill=0, then the srvmissile will still die on the first collision, whereas the cltmissile will still exist, resulting in a serious desync. This is not a problem if you use pierce=1, but then you have to rely on the item_pierce stat.
(clt:hit1,pclthitfunc=9,psrvhitfunc=7; hitpar1=collides with allies and applies healing; hitpar2=enemies it can collide with and apply damage)
(clc1=minimum amount of healing to allies)
(clc2=maximum amount of healing to allies)
(note: clthitpar2 always only targets undead, so it may be desirable to try out other pclthitfuncs)

[spidergoolay] Releases hitsubmissile1 southward upon expiring. {Doesn't seem to do anything special} {???}
(psrvhitfunc=15)
(hitsubmissile1=released southward upon missile expiration)

[howl] Missile applies fear to the target but only if there is an auratargetstate in skills.txt; regardless of the state, it will only apply the fear state
(psrvhitfunc=17)
(auratargetstate=any state)
(param2=plev+slev+n; n=param2; fear will only be applied if playerlevel+howllevel+param2>monster level)
(param3=distance to retreat; seems to be deprecated)
(param4=distance per level; seems to be deprecated)
(param5=time to retreat; number of frames that target will have the fear state, at level 1; state seems to last forever if set to 0)
(param6=time per level; number of additional fear state frames per level past level 1; state seems to last forever if set to 0)


[spidergoo] Missile applies skills.txt auratargetstate and aurastats1-6, but the aurastats only seem to be applied if you apply the state twice in a row. State duration is based on calc4. Aurafilter does not seem to restrict its application. Seems to hit only enemies, unless collidefriend=1, then it will apply to both allies and enemies. Note that any calculations used for the aurastats will reference the TARGET'S values and not the user's; the only exception is for references to the skill that produces the missile itself.
(psrvhitfunc=16,collidefriend=)
(skills.txt: auratargetstate,aurastat1-6)
(skills.txt: calc4=length of auratargetstate)

[shout][battleorders][battlecommand] Missile applies skills.txt auratargetstate to allies of the user. If collidefriend is not set to 1, then it doesn't seem to do anything. Unlike the battlecry and fingermagespider missile, this one references the USER'S stats and skill levels.
(psrvHitfunc=18,param2=increased velocity per level,collidefriend=1)
(auratargetstate=applied state to target)
(auralencalc=length of state)
(aurastat1-6=stats applied during the state)

[fingermagespider] Missile applies skills.txt auratargetstate and aurastats1-6, but the aurastats only seem to be applied if you apply the state twice in a row. Note that any calculations used for the aurastats will reference the TARGET'S values and not the user's; the only exception is for references to the skill that produces the missile itself.
(psrvhitfunc=19)
(skills.txt: auratargetstate=applied state to target)
(skills.txt: auralencalc=length of state)
(skills.txt: aurastat1-6=stats applied during the state; only seem to apply on the second application of the state)

[battlecry] Missile applies skills.txt auratargetstate and aurastats1-6 to those selected via aurafilter; always ignores allies. Note that any calculations used for the aurastats will reference the TARGET'S values and not the user's; the only exception is for references to the skill that produces the missile itself. Always pierces regardless of collidekill. Cannot deal damage.
(psrvHitfunc=21)
(skills.txt: aurafilter=controls target selection)
(skills.txt: auratargetstate=applied state to target)
(skills.txt: auralencalc=length of state)
(skills.txt: aurastat1-6=stats applied during the state)

[rabiescontagion] {doesn't seem to do anything when not used by rabies}
(psrvhitfunc=53)

[andycontrol0]
(pcltdofunc=29)
(cltparam1=firewall frequency; how many frames must pass for an instance of cltsubmissile2 to be produced)
(cltparam2=screen shake seconds; the number of seconds the screen will shake for starting after a seemingly pre-determined point in the missile's range; will continue shaking even after the missile runs out of range)
(cltsubmissile1=; rapidly produced over the range, and move towards the player)
(cltsubmissile2=controlled by cltparam1)
(cltsubmissile3=; randomly spawns missiles in a distinctive pattern that starts outwards then goes inwards; seems to automatically collide unless the cltsubmissile3 uses pclthitfunc=19)

[icebreaksmall][icebreakmedium][icebreaklarge] Hardcoded. Allows ID=272/273/274 to produce the animation of IceBreakSmallMelt/IceBreakMediumMelt/IceBreakLargeMelt after running out of range.
(pclthitfunc=31)

[radamentdeath] Creates the graphical effects of Radament's death. Produces ID=348 (radamenthandofgod) for the graphics.
(pcltdofunc=32,psrvdofunc=19)
[radamenthandofgod] Creates the graphical effects of Radament's death. Produces numerous ID=349 (radamentholybolt) for the graphics. Does not seem to function unless created by a missile with pcltdofunc=32,psrvdofunc=19.
(pclthitfunc=37)

[queendeathcenter] Creates the graphical effects of the Maggot Queen's death. Produces ID=354 (queendeathglob) for the graphics.
(pcltdofunc=35)
[queendeathglob] Creates the graphical effects of the Maggot Queen's death. Randomly produces both ID=355 (queendeathsplat1) and ID=356 (queendeathsplat2) for the graphics.
(pclthitfunc=39)

[towerchestspawner] Spawns the gold from the Countess's chest (presumably only gold; maybe it references a specific treasureclass that can be modified but probably not). Amount of gold in each pile scales with area level, but doesn't seem to adjust with gold find.
(psrvhitfunc=33)
(param1=start delay; gold only starts being produced after this time runs out, in frames)
(param2=spawn interval divisor; spawns slower the higher the number is)
(param3=radius; the radius that gold will randomly drop within)

[nihlithak1] A missile that produces clthitsubmissile1 and clthitsubmissile2, allow a z-offset for clthitsubmissile2.
(pclthitfunc=60)
(cHitPar1=zoffset of missile 2; controls the z-offset of clthitsubmissile2)

[mephistodonotdraw] An incredibly unique cltside missile: it makes the user disappear, (the shadow remains if a player uses it; for monsters they entirely disappear), after the range runs out. This seems to last until you restart the game, even beyond death, even if you transform.
(pclthitfunc=34)
(range=how many frames must pass until the user is disappeared)

[] Missile that spawns a single, specific monster after expiring.
(psrvhitfunc=6)
(s.HitPar1=monstats hcIdx; chooses the monster to spawn)
(s.HitPar2={animmode?}; any value seems to work as long as it isn't blank)

[Imp Spawn Monsters] Missile that spawns a monster after expiring, based on available monsters for the area in levels.txt. Rarity of the monster seems to have no affect on the results, and from monstats.txt: the monster will also spawn with partymin to partymax minion1/minion2; monster will not spawn if isSpawn=0.
(psrvhitfunc=39)

[baal spawn monsters] Spawns a monster and clthitsubmissile1. When used by the player, seems to only create a lonely Skeleton (monstats.txt ID=0).
(pclthitfunc=57, psrvhitfunc=54)
(chitpar1=radius; radius of clthitsubmissile1)
(chitpar2=density; density of clthitsubmissile1)

[moltenboulderemerge] Missile that subreleases hitsubmissile1 in the same direction it is moving once and clthitsubmissile1 up to 5 times either in front or behind the missile, applying a bouncing effect to each subreleased clthitsubmissile1
(hit1,pclthitfunc=53,psrvhitfunc=48)
(cHitPar1=bounces {need to describe these chitpars still})
(cHitPar2=damping)
(chitPar3=lob)
(note: If you want it to spawn a single missile, minimize the range and set it to alwaysexplode=1; if you want it to spawn the maximum missiles, then use a piercing function like frozen orb's dofunc and make it collide with everything)

[pantherpotorange] {???}
(psrvhitfunc=24)

[pantherpotgreen] Releases 8 instances of hitsubmissile1 and {unknown} instances of clthitsubmissile1 on collision.
(param1=poison length; {doesn't seem to do anything})
(pclthitfunc=28,psrvhitfunc=25)

[healing vortex] A missile that heals anything it collides with.
(psrvhitfunc=43)
(mindam/maxdam=amount to heal)

[volcano debris 2] A missile that releases hitsubmissile1 to 3 and clthitsubmissile1 and 2.
(pclthitfunc=55,psrvhitfunc=51)
(hitsubmissile1=)
(hitsubmissile2=)
(hitsubmissile3=)
(clthitsubmissile1=)
(clthitsubmissile2=)

[] An unused missile function "HitMissileSkill" (thanks VV!). It triggers a defined srvdofunc. So you could, for example, produce a missile that triggers Amplify Damage. Very useful.
(psrvhitfunc=23)
(s.HitPar1=srvdofunc to apply)

[explodingarrow] Produces all hitsubmissiles. Unknown if there is a clthitfunc that can produce all clthitsubmissiles.
(psrvhitfunc=4)
(hitsubmissile1=)
(hitsubmissile2=)
(hitsubmissile3=)
(hitsubmissile4=)

[] An unused missile function "HitDoNova" (thanks VV!). It releases a number of hitsubmissile1/clthitsubmissile1. Seems like an inferior frozenorb nova.
(pclthitfunc=4,psrvhitfunc=5)
(s.hitpar1=64/x hitsubmissile1 to release in the nova)
(chitpar1=64/x clthitsubmissile1 to release in the nova)
(hitsubmissile1,clthitsubmissile1=# depends on hitpar1)

[] An unused missile function "HitCreateMissileNoDmg" (thanks VV!). It releases hitsubmissile1, hitsubmissile2, hitsubmissile3 and hitsubmissile4 simultaneously. As the name states, it does not seem to do direct damage. Does not seem to have a related cltside missile, so it might be awkward to use.
(psrvhitfunc=11)
(s.hitpar1=if <1, it produces one of each missile; if >1, it produces two of each missile)
(hitsubmissile1=)
(hitsubmissile2=)
(hitsubmissile3=)
(hitsubmissile4=)

[] An unused missile function "RadialStunDamage" (thanks VV!). Supposedly stuns, but it keeps causing crashes instead. Probably should not be used. {???}
(psrvhitfunc=30)
(s.hitpar1={???}; maybe the stun radius)
(s.hitpar2={???}; maybe the stun length)

---

[UNKNOWN/MIXED MISSILES]

[hfcontrol] {Produces a static-animation missile?} {???}
(pcltdofunc=38)

[hffragment1] Produces hffragment2 after expiring.
(pcltdofunc=39,pclthitfunc=42)

[hffragment2] Produces hffragment3 after expiring.
(pcltdofunc=39,pclthitfunc=43)

[hffragment3] Does not move.
(pcltdofunc=40)

[hfspirit1] {???}
(pcltdofunc=41)

[worldstone shake] {Doesn't seem to do anything, probably only functions in the Worldstone Chamber} {???}
(pcltdofunc=66, pclthitfunc=61)

[baalfx control] Spawns Tyrael.
(pcltdofunc=64, psrvdofunc=36, psrvhitfunc=57)

---

[OTHER WAYS OF GENERATING MISSILES]

In weapons.txt (as well as armor.txt and misc.txt, if you should add in the column), there is the "missiletype" column. This determines what missile is released when equipped and thrown by Throw, Left Hand Throw and Double Throw.

In monstats.txt, there are the columns "MissA1", "MissA2", "MissS1", "MissS2", "MissS3", "MissS4", "MissC" and "MissSQ". See https://d2mods.info/forum/kb/viewarticle?a=360 for more information.

In monseq.txt, you can use event=2 or 4 to make a monster launch a missile or skill which produces a missile. See https://d2mods.info/forum/kb/viewarticle?a=395.



---
Last edited by Cypress on Thu Nov 18, 2021 5:28 pm, edited 49 times in total.

User avatar
k0r3l1k
Moderator
Angel
Posts: 631
Joined: Sun Sep 09, 2007 3:11 am
Location: Arizona, Prescott
United States of America

Re: The Guide to Almost All Missile Functions

Post by k0r3l1k » Sat Apr 03, 2021 4:21 am

Very impressive compilation.


Big props friend.
Image

qwertyue
Posts: 11
Joined: Sun Jan 31, 2021 5:41 am

Re: The Guide to Almost All Missile Functions

Post by qwertyue » Wed Jul 27, 2022 4:12 am

Do you have any missile records about frozen orb?

I found that the frozen orb nova produced by the collision between the frozen orb and the monster seems to be only animation without damage?

thereaverofdarkness
Posts: 28
Joined: Tue Mar 15, 2022 8:13 am

Re: The Guide to Almost All Missile Functions

Post by thereaverofdarkness » Wed Jul 27, 2022 4:36 pm

I need to figure out what makes poison explosion and plague javelin so different; their missiles are virtually identical, yet plague javelin creates a MUCH larger effect!

Post Reply

Return to “General Mod Making”