Lack of Source in calls and Projectile Scripting - 08/10/17 07:04 PM
The following is a list of issues I have run into during my time working on a balance overhaul for the game. A lot of these are what I would consider immensly important, and should all be very simple to fix as these mechanics already exist in the game in some form.
The following pertains to the below calls.
Let me start with the bottom 4. Projectiles spawned through these calls will not hit anyone unless they have an explode radius, which makes doing single target effects incredibly difficult. I've tried a number of things to try to work around this included making the spell exclusively only hit self to no avail.
So after talking with Ameranth on how he solved this in his DOS:1 mod Epic Encounters, he pointed me to ExplodeAt. The idea behind this is that, assumably, the Explode Radius is a sphere, so we just move the sphere below the world so only the tip hits the intended target. It has a few issues, but in theory this should work most of the time.
After playing with ExplodeAt for the past 2 days, I cannot get it to give me consistent results. It will work fine on one piece of land, not work at all on another, and hit everything around it on yet a different section. The problem is, all 3 of these sections are on the same elevation of land.
There are also times where I will not offset the explosion at all, and it just fails to hit anything despite the animation being squarely on the intended recipient.
So, moving on to
These are two other calls with the potential to deal damage, but both have major issues that make them unusable.
ApplyDamage does not have a source. This means that I cannot control where this damage comes from for means of determining damage bonuses like through int, str, pyro, or even crit. I can re-create the damage formula (all skills derive from the same base damage table even, making this not that bad!), but the moment someone changes the scaling of the game via a data.txt mod, this method breaks because there is no way to base my values off that scale factor so I am left with either underpowered or overpowered skills in the game.
CharacterApplyStatus has the same issue, no source. Status Application can apply damage and even crit (just to be clear, Status APPLICATION can crit. Periodic Damage does not), and we can hide the icon so it makes it a perfect candidate for scripting single target damage. But lack of a source argument also makes this worthless as it won't scale with crit, int, pyro, etc. Additionally, if this had an owner it would give us an easy way to tie our statuses into Torturer (check for it and reapply at +1 turn). As it stands, there is no way to do this without disassociating the status from the caster. This one is especially weird because the corresponding event, CharacterStatusApplied, has a source! : (
While I'm here, I have other shortcomings I want to bring up.
I feel like the hope was that the Skill Editor would be sufficient, and for the most part it's awesome. What led me down this rabbit hole was simply that Periodic Damage isn't capable of critical hits. Then as I got deeper, I realized other things were not possible, like DoTs that had effects evolve as they ticked down, DoTs that have explode radius on tick, abilities reliant on the size of a surface.
With the way Divinity Original Sin 2 does it's scaling and damage calculations, we really need Source to be an argument in any call relating to Damage, Status, Healing, or Skill use. It's been very inconsistent so I was hoping this thread would help bring the major offenders I have run into to light.
If anyone has ideas to work around some of these, please let me know.
The following pertains to the below calls.
- ExplodeAt
- ShootLocalProjectile
- ShootLocalProjectileAt
- ShootWorldProjectile
- ShootWorldProjectileAt
Let me start with the bottom 4. Projectiles spawned through these calls will not hit anyone unless they have an explode radius, which makes doing single target effects incredibly difficult. I've tried a number of things to try to work around this included making the spell exclusively only hit self to no avail.
So after talking with Ameranth on how he solved this in his DOS:1 mod Epic Encounters, he pointed me to ExplodeAt. The idea behind this is that, assumably, the Explode Radius is a sphere, so we just move the sphere below the world so only the tip hits the intended target. It has a few issues, but in theory this should work most of the time.
After playing with ExplodeAt for the past 2 days, I cannot get it to give me consistent results. It will work fine on one piece of land, not work at all on another, and hit everything around it on yet a different section. The problem is, all 3 of these sections are on the same elevation of land.
There are also times where I will not offset the explosion at all, and it just fails to hit anything despite the animation being squarely on the intended recipient.
So, moving on to
- ApplyDamage
- CharacterApplyStatus
These are two other calls with the potential to deal damage, but both have major issues that make them unusable.
ApplyDamage does not have a source. This means that I cannot control where this damage comes from for means of determining damage bonuses like through int, str, pyro, or even crit. I can re-create the damage formula (all skills derive from the same base damage table even, making this not that bad!), but the moment someone changes the scaling of the game via a data.txt mod, this method breaks because there is no way to base my values off that scale factor so I am left with either underpowered or overpowered skills in the game.
CharacterApplyStatus has the same issue, no source. Status Application can apply damage and even crit (just to be clear, Status APPLICATION can crit. Periodic Damage does not), and we can hide the icon so it makes it a perfect candidate for scripting single target damage. But lack of a source argument also makes this worthless as it won't scale with crit, int, pyro, etc. Additionally, if this had an owner it would give us an easy way to tie our statuses into Torturer (check for it and reapply at +1 turn). As it stands, there is no way to do this without disassociating the status from the caster. This one is especially weird because the corresponding event, CharacterStatusApplied, has a source! : (
While I'm here, I have other shortcomings I want to bring up.
- We cannot query the remaining turns on a status. (This can be worked around though).
- We cannot query the size of a surface or cloud.
- There is no RecievedHealing event.
- RecievedDamage doesn't have a source but RecievedStatus does. (Interesting Note: Being hit itself applies a status effect called Hit. You could theoretically combine this with RecievedDamage to figure out who hit for what)
- CharacterUseSkill would be amazing if it didn't require the Character to actually use the skill.
- CharacterRecievedDamage really needs a Source, a string representation of what skill did the damage if applicable, and the amount of damage dealt.
I feel like the hope was that the Skill Editor would be sufficient, and for the most part it's awesome. What led me down this rabbit hole was simply that Periodic Damage isn't capable of critical hits. Then as I got deeper, I realized other things were not possible, like DoTs that had effects evolve as they ticked down, DoTs that have explode radius on tick, abilities reliant on the size of a surface.
With the way Divinity Original Sin 2 does it's scaling and damage calculations, we really need Source to be an argument in any call relating to Damage, Status, Healing, or Skill use. It's been very inconsistent so I was hoping this thread would help bring the major offenders I have run into to light.
If anyone has ideas to work around some of these, please let me know.