Advanced Skillmaking: Intangibles and More

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
Moderator
Champion of the Light
Posts: 446
Joined: Fri Dec 01, 2017 2:08 am

Advanced Skillmaking: Intangibles and More

Post by Cypress » Tue Mar 23, 2021 10:04 pm

This is a guide on a few tricks which allow for more complex skillmaking. Mostly, it makes use of "intangibles", which are invisible monsters that carry out behaviors behind-the-scenes, allowing for skills to far exceed their normal limitations. With proper application, you can create absurdly complex skills that you might otherwise think would be hardcoded. Any feedback or questions would be appreciated.

Here's a video displaying some intangible-based skills I have created myself:

Some examples of skills that are possible with these systems:

(1) A skill which automatically consumes corpses around you, shattering them into ice and dealing cold damage for a duration.
(2) Multiple minion summoning, allowing Raven to produce a defined number of ravens per casting.
(3) Diverse minion summoning, allowing a single cast of Clay Golem to also produce a Fire Golem and Blood Golem.
(4) A complex thunderstorm skill which (a) carries out normal Thunderstorm function and (b) rapidly checks every nearby monster with a scaling chance to cast with increasing level, and if the chance succeeds on a given monster then it produces an additional bolt.
(5) Diverse skill activation, do all of the above example skills in a single skill.
(6) A pseudo-chance to cast attack skill, which can produce a variety of effects and events, with the chances being controlled via calculations which can reference other skills (i.e. an attack skill which has a 5+3*clvl% chance to produce an Ice Bolt, a 1+clvl% chance to produce a Blizzard and a 1+clvl/2% chance to produce a Frozen Horror pet).

[PRODUCING AN INTANGIBLE: PET]
[PRODUCING AN INTANGIBLE: MONSTER]
[CREATING MONSTERS VIA MISSILES]
[CASTING SKILLS VIA MISSILES]
[CASTING SKILLS VIA MISSILES: SPECIFICITY/TARGETING]
[CASTING SKILLS VIA MISSILES: SPECIFICITY/PURGING]
[RANDOM CHANCE SKILL ACTIVATION]

---

[PRODUCING AN INTANGIBLE: PET]

In skills.txt:
(1) Make a skill with one of these untargetable pet-producing srvdofuncs: 44 (underneath yourself), 45 (at the target location) or 114 (at the target location)
(2) Attach the pet to a monster in monstats.txt via the "summon" column
(3) See the following section:

[PRODUCING AN INTANGIBLE: MONSTER]

In monstats.txt:
(1) Set "MonSound" to nothing, so that it does not make sounds
(2) Set "petIgnore" to 1. It will no longer be targeted by your own pets
(3) Set "threat" to 0. It will no longer be targeted by monsters

In monstats2.txt:
(1) Set "SizeX" and "SizeY" to 0. This makes it immune to most missiles
(2) Set "HDv" to "S8v" to nil to ensure that no graphics appear. If you want to make use of Necromagemissile/Doomknightmissile, which use S4v/S3v to randomize missiles, then you can put in non-existent references instead.
(3) Set "noSel", "isSel" and "corpseSel" to 0. This mostly prevents it from being selected
(4) Set "noOvly" to 0. This will make it so graphical overlays do not appear on it


WHY?
This is an important starting point for many complex skills, which make use of invisible monsters and pets to carry out behaviors. By adjusting its AI, AIdelay and parameters, you can produce an intangible that consistently acts in a defined way.

---

[CREATING MONSTERS VIA MISSILES]

In missiles.txt:
(1) Set "pSrvHitFunc" to 6
(2) Set "s.HitPar1" to the ID of the monster you want to create
(3) Set "s.HitPar2" to NU (supposedly defines animmode of the created monster, but putting anything in seems to have the same result, including random gibberish)
(4) Manage the settings of the missile as desired, setting "Range"=1 will make it spawn the monster as soon as possible; you can also spawn this missile as a submissile to create multiple monsters per missile

WHY?
The most basic purpose is to create a monster. But more importantly, it allows a feedback loop between skills and monsters, which is described in CASTING SKILLS VIA MISSILES


---

[CASTING SKILLS VIA MISSILES]

For the skill(s) you want to cast via a missile; in skills.txt:
(1) Set "ItemEffect" to 1.
(2) Set "ItemTgtDo" to 1.
(3) Set other related columns as desired ("ItemCltEffect", "ItemTarget", "ItemCheckStart", "ItemCltCheckStart", "ItemCastSound" and "ItemCastOverlay"); these will determine how the skill is cast by

For the skill you want to make cast the above skill(s); in skills.txt:
(1) Set "srvmissile" (works with 99% of skills) or "srvmissilea" (works with some skills with the right function) or "srvmissileb" (works only with a few bow/crossbow functions) to a missile that creates a monster

In missiles.txt
(1) See CREATING MONSTERS VIA MISSILES

In monstats.txt/monstats2.txt:
(1) See PRODUCING AN INTANGIBLE: MONSTER; you probably want the monster to be intangible so that the player doesn't see all the background nonsense that is required for this technique
(2) Attach the monster to monprops.txt

In monprops.txt:
(1) Give the monprop a 100% chance to cast the skill you want it to make YOU (or some other target) cast

[CASTING SKILLS VIA MISSILES: SPECIFICITY/TARGETING]

For the chance-to-cast to be cast from yourself, you must interact with the intangible. The most obvious way to do this is:

Chance to cast on Striking. The intangible will produce an invisible nova, guided arrow or some other such skill that will likely hit the player. Make sure the missile always hits, cannot be blocked and deals at least 1/128th weapon damage. Most importantly, in missiles.txt use "Collidetype"=1, which can only hit players. If you are in singleplayer, then only you will ever activate the intangible. Even on multiplayer, you can likely mess around with the skill such that it will always (or almost always) only be cast on the original player.


[CASTING SKILLS VIA MISSILES: SPECIFICITY/PURGING]

To prevent the monster from constantly acting, you will probably want to find a way to consistently get rid of it. There are a number of ways to do this, and the proper answer depends in each case. I will provide some examples:

(EXAMPLE 1) De-activation upon hit, Inverse Fist of the Heavens:
Create a Fist of the Heavens clone, but remove the graphics and sounds and make it cast upon itself. The intangible will hit the player, which will make the player cast a number of skills, as well as the Inverse Fist of the Heavens which will specifically target the intangible, killing it.

(EXAMPLE 2) Limited actions, FoulCrowNest AI:
Use the FoulCrowNest AI (or other similar AIs), which only carry out so many skill usages before self-destructing.

(EXAMPLE 3) Specific targeting, Cast on Death:
Make use of missiles which will be spawned in tandem, at the same location, with the intangible. You will need to make the intangible larger than size 0 to be hit by the missile, and you will need to filter such that the missile will only hit the monster. This will increase specificity, since only someone who targets at a specific place at a specific time will kill the intangible. This reduces the odds of other players accidentally or intentionally stealing the intangible's effect.


WHY?
This method allows you to connect skills.txt to missiles.txt to monstats.txt to skills.txt. Ultimately, you can create a loop that allows for complex skill function, with skills that create missiles that create monsters that target players which makes the player cast spells, and so on. Essentially, you can call as many srvdofuncs as desired with a single skill. In theory, you can make a single skill that can near-simultaneously cast hundreds of other skills.

LIMITATIONS:
(1) You can only have up to 1023 chance to cast skills. As far as I know, no one has hardcoded a higher limit. 1023 skills might sound like a lot, but some realistically complex skills can exceed 5 chance-to-casts, which will quickly push you up toward the limit. This issue can be somewhat alleviated by moving all non-player (unless you want to break staffmods/aura enchanted/cursed), non-CTC, non-hardcoded skills to ID=1024+.
(2) Filtering is far from perfect. If there are other players in the game, then there is a risk of the other players being hit by the intangible instead, making OTHER players cast skills that YOU activated.
(3) If a skill does not work with chance-to-cast, then it doesn't work with this method. Auras, Blade Shield, Thunderstorm, Passives, Armageddon, Hurricane will not work, although you can emulate their behaviors by creating pets that cast those skills directly. Sequenced and Attack skills will likely not work well, if at all.

---

[RANDOM CHANCE SKILL ACTIVATION]

There aren't very many apparent ways to make skills randomized, unless the skill has that as an outright feature of its srvdofunc, like Find Potion or Find Item. Here, I will describe ways you can implement randomization, and even to simulate some basic Chance to Cast behavior with skills.

In skills.txt:
(1) Make a skill with a calculation-controlled missile release: I recommend Teeth (srvdofunc=8)
(2) Set it up with CASTING SKILLS VIA MISSILES
(3) Make a second skill, also according to CASTING SKILLS VIA MISSILES which will activate the Teeth-clone via intangibles
(4) Make it so the calc1 of the Teeth-clone uses a rand() value dependent on skill levels, such that it emulates an actual chance to cast

Examples of usage:
(Super Find Potion) Make it so the random missile is an intangible which immediately attacks the player, killing itself, which then drops loot. So you could create a skill that uses a corpse, spawning a missile, which spawns an intangible, which hits the player then dies, which activates a randomized-teeth skill, which, if successful, will produce a second intangible, which will immediately hit the player and die, and drop defined loot.
(Chance to Cast on Attack, with skills) Make an attack, which spawns a missile, which spawns an intangible, which hits the player, which activates a bunch of different Teeth-clones upon the player, which each have a random chance of activating based on the player's skill levels. Even more specifically, a Basic Attack skill could have a 5% + 3*lvl% chance of producing a Fire Bolt, a 2+2*lvl% of producing a Fire Ball, a 1+lvl% of raising a nearby corpse as a Skeleton and a 5+3*lvl% to activate a Frenzy buff.

Post Reply

Return to “General Mod Making”