As the project gained AI opponents, save/load, replay, simultaneous turns, and online multiplayer, the main architectural problem was no longer where to place another class. It was deciding which part of the system actually owns the rules.
Local play, simulations, and the server already shared parts of the same logic, but separate orchestration paths and state representations still made semantic drift possible. A move could eventually behave differently locally and online. A replay could resolve a turn differently from the server. The client could try to reconstruct an animation from state that never contained the complete authoritative path.
The current refactor is built around one constraint:
Local play, AI, replay, simulations, and multiplayer must all end in the same deterministic game engine.
I recently published an
SOCIAL SHARE CARD GENERATOR