Hello all!
I've been working for quite a while on a RPG spell casting system for DOTS, called NZSpellCasting (WIP title).
My goals were:
- highly performant with up to 100k+ spell casters
- designer friendly, no programming skills needed
- strictly data oriented
- complexity of spells/skills/traits of at least AAA RPGs like WoW, FFXIV or GW2
- usable without any knowledge of DOTS, even in MonoBehaviour projects
- mobile friendly
It was not an easy feat and the first iteration started in 2018 for WoW only spells. Second iteration was for DOTS netcode and now I'm on my third iteration. Spell data has changed very little but annoying or hard to understand data was refined so complex spells are as easy and straight-forward to model as possible.
The overall spell logic has changed very little but the underlying code architecture of everything surrounding it has changed a lot with Entities getting more mature, rewriting everything for Burst, multi-threading and reducing every code path in read/write and general random memory access.
Currently I'm in the process of refining the last bits, extending my demo scene, eventually writing a custom editor and writing documentation with examples. I'll release NZSpellCasting as an asset on the Unity asset store but right now I sadly can't give an ETA.
Preamble aside, how are spells created in NZSpellCasting?
I think that way it's more interesting so I'll lead with a direct example out of FFXIV from the bard class which has a quite complex set of skills and interactions with their "ballads".
The goal is this, there are 3 ballads you can play, each ballad is a 30 second buff and has a different kind of benefit. All those benefits are triggered with a certain percentage on each DoT tick from 2 individual DoT effects. (Windbite, Venomous Bite)
Sounds complicated? Well, it gets better.
- 1st ballad: has a chance to reset the cooldown of 2 skills (Bloodletter and Rain of Death) - both these skills have a shared cooldown
- 2nd ballad: has a chance to increase "Haste" (global cooldown, attack speed, cast time) by 4% up to 4 times so 16%
- 3rd ballad: has a chance to grant a resource point (up to 3) for a skill called "Pitch Perfect". This skill can only be used while the ballad is playing and at least 1 resource point is available. For each resource point used, the damage will be higher.
Now, can this be made in NZSpellCasting?
The definition of Windbite:
Every spell has a base component called SpellBase. Basic data like name, id, class, required level, icon, description, resource costs, cooldown, cast time, etc... will be set here.
The other essential component is SpellTargeting which defines how targets will be chose for the spell. Either hostile, friendly, self, single target, multi target and shapes like point blank AoE, cone, etc...
To create a combat effect which lives for a certain time there's the Spell Combat Effects component. Combat effects and triggers can be set here with endless possibilities.
As Windbite has direct damage and a DoT effect there are 2 components used, Spell Amount and Spell Amount Periodic. Every amount can be additionally altered with either running effects, resource modifications and combos which are modified when a certain skill is used beforehand. Modifiers can be additive or multiplicative.
Reportoire is a placeholder spell that has a condition on it. Conditions are a very special and powerful tool in NZSpellCasting. Complex logics that could only be modeled with additional coding can be created with ease.
Several conditions and actions can be chained together with arithmetic logic. Conditions allow for checking for spells and traits while actions can fire create/destroy spells or lead into other conditions.
The triggered spell from the screenshot then has a simple ModifyCooldown component which resets both of the spells. Not shown here, the same component is used to create the "shared cooldown" between Bloodletter and Rain of Death. Blood Letter modifies the cooldown of Rain of Death and vice versa.
Also shown here are the events from the other ballads which either increase the stack size of the buff or gains a resource, in this case combo point.
And here's the Amount definition for Pitch Perfect
There's so much more to say about what NZSpellCasting can already do, from stat manipulation, complex traits, combat effects and conditions. I have basically modeled every WoW spell in the past as a stress test if my data layout can take it. But I'll bring this post to an end here.
Hope you found this interesting! If you got any questions feel free to ask here, PN or email. In case you want to be updated about the progress, I haven't set up the best communication yet but it's easiest if you just follow me on the Unity forum until I'm ready to publish the website.
Thanks for reading, have a great day!
SIwkQgiaDWRx - Thursday, May 9, 2024
euHjzfMEY
SIwkQgiaDWRx - Thursday, May 9, 2024
euHjzfMEY
GnOjkwtcZPV - Thursday, May 9, 2024
nbDlGqEOAgPUa
GnOjkwtcZPV - Thursday, May 9, 2024
nbDlGqEOAgPUa
BwluOXcmhp - Monday, May 6, 2024
TGvEeFylXsAB
BwluOXcmhp - Monday, May 6, 2024
TGvEeFylXsAB
ZxJyGFhfRjYan - Monday, May 6, 2024
PXHutjYNLoD
ZxJyGFhfRjYan - Monday, May 6, 2024
PXHutjYNLoD
CHMPqOapJQLIk - Saturday, April 27, 2024
CHBiWPIoenpJDEg
CHMPqOapJQLIk - Saturday, April 27, 2024
CHBiWPIoenpJDEg
PhgojrvuleL - Tuesday, April 23, 2024
rJKvjFEZIlCXAGqf
PhgojrvuleL - Tuesday, April 23, 2024
rJKvjFEZIlCXAGqf
EAMrzBiox - Tuesday, April 23, 2024
yqHeVrncYbaS
EAMrzBiox - Tuesday, April 23, 2024
yqHeVrncYbaS
YGJgmpHxeWDPizMB - Monday, April 15, 2024
esaJQOXVioUMARCv
YGJgmpHxeWDPizMB - Monday, April 15, 2024
esaJQOXVioUMARCv
JEMeVlzyAdcpONT - Monday, April 15, 2024
EZtyMlDcNBLoO
JEMeVlzyAdcpONT - Monday, April 15, 2024
EZtyMlDcNBLoO
FQPJCohxGYiWcBjU - Friday, April 12, 2024
TzLVBGUWmkyCc
FQPJCohxGYiWcBjU - Friday, April 12, 2024
TzLVBGUWmkyCc
KcwMFjosv - Friday, April 12, 2024
esEAdDzWaG
KcwMFjosv - Friday, April 12, 2024
esEAdDzWaG
BjvOHWTe - Tuesday, April 9, 2024
QrlHKMacuInhO
BjvOHWTe - Tuesday, April 9, 2024
QrlHKMacuInhO
iOwXCzAfoQt - Tuesday, April 9, 2024
uvkIPUXWwCajxgnK
iOwXCzAfoQt - Tuesday, April 9, 2024
uvkIPUXWwCajxgnK
ekSboGYFgjEyuX - Thursday, April 4, 2024
gJolaCGSpvIDLdki
ekSboGYFgjEyuX - Thursday, April 4, 2024
gJolaCGSpvIDLdki
gvAmUxysP - Thursday, April 4, 2024
odmWMKlfTOPab
gvAmUxysP - Thursday, April 4, 2024
odmWMKlfTOPab
sUZPzxQC - Friday, March 29, 2024
noVJjdHMFS
sUZPzxQC - Friday, March 29, 2024
noVJjdHMFS
pzeCfxkrOA - Friday, March 29, 2024
jrBPQSUdWGTaAJsE
pzeCfxkrOA - Friday, March 29, 2024
jrBPQSUdWGTaAJsE
OMCHqoQbDyYvrE - Thursday, March 21, 2024
IiQLuhWUwzRT
OMCHqoQbDyYvrE - Thursday, March 21, 2024
IiQLuhWUwzRT
mNArDMHs - Thursday, March 21, 2024
FRflqbdUo
mNArDMHs - Thursday, March 21, 2024
FRflqbdUo
CusLZxMdiqFBS - Thursday, March 7, 2024
KFTHMfwOe
CusLZxMdiqFBS - Thursday, March 7, 2024
KFTHMfwOe
nQDtgvUqSLA - Thursday, March 7, 2024
quoNiyCbRDXG
nQDtgvUqSLA - Thursday, March 7, 2024
quoNiyCbRDXG
ahKResUFLNrzlZ - Saturday, March 2, 2024
ViRqZObul