In an exercise of futility I'm trying to abstract and generalize a framework where to build any turn/rule based system. I've had a head start but after decompiling HearthStone I'm second-guessing that it may have higher complexity than I expected, at least for abstraction. So, I would like a peer review of the approach I am taking.
For the premises:
No UI or IO bindings to maintain decoupling and testability. You should be able to unitest a full game.
Entity-Component-System, better memory packing, data-oriented, deterministic.
Centralized pushdown automaton for state control.
At the heart of the architecture is the interface/trait IPhaseSystem. It has a single method, pushSystem(), which returns an array of IPhaseSystems.
From that interface plus an entity processing system we compose an abstract AbsGameSystem class, which requires a process() method. ECS systems already give the possibility to override pre and post methods, but is not mandatory.
There is an interface IVictory with a single isVictory() method.
Initialization of the world requires a single AbsGameSystem and an IVictory.
My game world in every event-driven step processes the system atop of the pushdown automaton, and then proceeds to push all states returned by pushSystem().
In my mind, from this simple setup and a communication pattern for UI/IO calls, like an Event Bus would be, should suffice to express any kind of board game akin to Catan, Magic: The Gathering, Dominion or Stratego.