Class structure for a "League of Legends" like game?

Hello there, I am in a bit of a rut with structuring my classes for a game I’m going to be working. Basically, on the client’s side a there’s a player which handles being hit by abilities, movement, etc. The player then is supposed to have unique code based off the “Champion” the player is playing as.

For example, if the player is playing as a champion I created named under the class name Zed I have special things to happen when the player is damaged (for example, Debug.Log(‘Blocked magic damage’) ). As well as custom code for an ability being press (for example, Debug.Log(‘Ability: Shadow Slash has been used’) ).

What would be a good project/class structure which would allow me to access and emit objects from the player within each Champion’s class (Which I would assume would extend some sort of base Champion class), as well as have events be called onPlayerDamage, etc. (this way I can handle the damage taken, etc. whenever the player gets damaged)?

tl;dr what’s a good project structure for a League-related game which has multiple champions?

Keep it simple. Have a Mover component that is responsible for talking to the NavMeshAgent (or whatever third party navigation solution you use). Have a Brain component that is responsible for deciding what the agent should be doing at any given moment. The PlayerBrain takes commands from your custom Input class, while an AIBrain decides based on whatever AI solution you decide (Behavior Trees, GOAP, Utility, plain old state machines, etc). Have a Damageable component that is responsible for receiving damage commands and applying them to the Health component. The Health component is responsible for tracking the health of the agent and communicating state changes to interested systems. Then your agents would likely have a rudimentary ItemInventory component that stores which items are carried, and a similar (but separate) AbilityInventory component whose responsibility is to track the types of abilities that are currently known.

Some of the above responsibilities could be further separated out from what I suggest, and maybe they should be. Some of them certainly seem like they could be combined into a single class, but I recommend against that. As long as each responsibility is kept separate, the structure will grow naturally on its own.

This is starting to play out perfectly in my head now, thank you! One question though, how would I be able to create multiple classes for each Champion and connect it to this player? In my head at the moment I imagine having each component which a champion’s features can effect include some sort of “OnEvent” system for example the Damage component would have an “OnBeforeDamage” which would do special things based off the champion (such as a parry)