In my game I want characters to be able to cast spells which deal a certain amount of damage of a certain type to other characters in the game.
I also want abilities that negate an amount of damage of a certain type to be equipped to a character.
I don't want to have to program a huge wall of damage resistances that usually is 0 for every single character in the game (plus I want abilities that can also double damage or transform it), I want the triggered ability to be able to modify other abilities. so I thought of placing the spell objects themselves on the stack so that other abilities can edit them. but here's the problem. each ability has different names, numbers and types of variables. how do I access every ability that deals fire damage without programming a case in the ability modifier class for every single ability that deals a certain amount of damage of a certain type. do I have to write a long list of ability attributes in the super class, most of which I won't use? if I do then its just as bad as having to write a huge list of variables that modify abilities on each character. I want to program a game without having to write long lists of attributes on classes that don't get used 99% of the time. Is this even possible?
e.g. I want a passive ability that doubles the amount of fire damage you deal.
I DON'T want to do this: Spell.target.fireDamageMultiplier = 2; because then I will have tons of similar attributes on every single entity
I CAN'T do this: Spell.damage *= 2; because not every ability has a damage attribute
I DON'T want to do this: Firebolt.damage *= 2; because then I have to write a special case for every ability that has a damage attribute
I thought of having different classes of abilities than my ability can inherit from but I heard not to do this and c# doesn't have multiple inheritance anyway. I also read to favor composition of inheritance but then again I have the problem of having a long list of variables(or spell type references) for each spell most of which I won't use. so this still hasn't solved my problem of writing messy code that gets out of control the more abilities I add.
So how do I edit abilities without writing a special case for every single ability?