Hey LordZardeck,
I have a few suggestions, but the one I would recommend would be the “Ability Object” approach, which would replace the current array of ability structs with an array of Ability Object reference.
You would basically have a base AbilityObjectBase class that includes a bunch of common functionality, such as the Owning Card, Owning Player, Event Trigger Ability Etc that every ability would use. You can then derive all abilities from this class, and setup the ability triggers to Construct the Ability Object, set the necessary data and call the Trigger ability event which you could then have run any/all the effects you want to have.
This could also be done through blueprints or C++, and require some but not to many changes to the framework.
Happy to provide some more details if this sounds like a good solution!