buzzbuzz20xx Don't overdesign in advance. Although it's good to start with some organizational ideas, it's very hard to anticipate the architecture requirements. Especially if you're at the same time prototyping the game mechanics as well. Be ready to refactor a lot. Add abstractions gradually when the need arises organically as the project grows. Be very conservative with introducing new classes to the system. First make it work then make it neatly designed (if you really must).
Ditto for introducing new functions. Don't instantly wrap code into "reusable" functions just because it looks like you might reuse it in the future. Wait for the real need to appear. Don't be dogmatic about eliminating all repetition (the famous DRY principle). Sometimes it's not worth the effort.
Dividing code into too many functions will make it harder to follow. Even if calls are perfectly hierarchically organized, it can still feel spaghetted. It's similar to a problem of deeply nested ifs, only worse because you need to jump through files. Often the code will be much more self explanatory if you just flatten everything out into one long sequence, with various aspects of the task grouped into commented sections. Fewer calls may be better for performance as well.
Class inheritance is a double edged sword. Keep it to a bare minimum. Ideally, avoid it completely if you can.
300 lines of code is not much. Develop a tolerance to larger source files. Use editor's folding and search capabilities to navigate with more ease.
Think a lot about names. Make them short but expressive. Names are much more important than it seems at first.
Don't use generic OO buzzwords or pattern names in names of your classes and objects, just for the sake of appearing "smart" or "organized". Avoid abstract names like the plague e.g. SomethingSomethingDispatcherComponent.
A BattleManager is really just a Battle. Unless you have multiple battles going on at the same time. It that case it's simply a War
Games typically have short lifespans. They are not libraries that require decades long maintenance. However they require good performance. Conclusion: Prioritize performance over insistence on clever design. Half a second delay is nothing for a website. It is a suicide though for a game.
Offload as much legwork as possible to engine's native code. GDScript is slow but it has many helper classes that you can delegate work to. Often times that means adapting your data architecture to what the engine is expecting, abandoning your neat preconceived organization. Ditto for delegating work to threads.
Don't watch too many Uncle Bob videos. Watch some by OO heretics like Casey Muratori as well, to get exposed to alternatives to crude OO dogmas.