It’s hard to give advice about how code should be structured, since there’s many ways of accomplishing the same things, but you’re doing the right thing by thinking about scalability before you get too deep to change it.
You could try separating eacg trigger condition into their own functions, so that if an OnAttack gets triggered it will only check and loop through OnAttack abilities.
Something like:
OnAttack.connect( CheckOnAttack )
OnDamaged.connect( CheckOnDamaged )
func CheckOnAttack( ATTACK_TYPE ):
match ATTACK_TYPE:
....
func CheckOnDamaged( DAMAGE_TYPE ):
match DAMAGE_TYPE:
....
Well, I have freckles all over the place, so my pattern was chosen already.
Because if you have a Kroger’s card you’re going to want to shop there more often to get the free stuff. You’re not paranoid, it is a psychological tactic to get you to spend more money. Casinos do similar things.
The Index is the best all-rounder imo.
It’s easy if you can follow directions, hard if you don’t have directions, impossible if you don’t have directions and don’t know what you’re doing; archinstall is effortless.