While I am sure that a smarter, or more senior, programmer could easily handle the conundrum of options in my Trait mechanic, it’s become pretty obvious that I can’t.
So, I’ve decided, in order to manage the menagerie of potential exceptions and conditions, I will funnel ALL State activities into a single queue that will then decide how the activity is to be handled, assign the appropriate actions to do so, and then pass those actions off to be applied to the subject.
Something like this. (example is not a complete solution)
Hopefully, this way it will enable me to better visualize how each potential interaction between the many options (which will only grow) will be best handled. While keeping them in a standard order of operation.
Does that Ring of Shielding you just activated apply a Trait that shares a group with your Spell Shield Class Trait? Ok, is either Trait exclusive? No? Ok, then both can be active. Go ahead and toggle the Ring of Shielding Trait ‘ON’ while the Spell Shield Trait is ‘ON’… Both Traits are now active, and both consuming charges as they are triggered by Damage.
This will now all happen in one place, rather than three or four, which themselves took place in three or four other places. (for ONE interaction)