README
Magister Engine
Implement the primitives and core of magister in an independant way
- testapp/ has a TUI implementation of playing the engine
- studio/ has a Leptos app for designing cards
- the main directory contains the engine with consists of:
- a non-reactive publically mutable version of game state: the
BoardState - an opaque reactive version of game state: the
RunningGame
- a non-reactive publically mutable version of game state: the
Design Ideas
I will try Domain-Oriented Design, so I’m splitting things into the BoardState and RunningGame.
A BoardState is meant to be externally manipulable, so it relies on having public owned data.
Avoid strategies for deduplication, it should be really straight-forward to make w/e changes you want
that could be proper game actions from the BoardState.
A RunningGame should be optimized for running a game, and reducers and inferers work with this struct.
I’m keeping the idea for having reducers and inferers, but due to the difference in using DOD, we can change some signatures:
- a reducer is an
fn(&mut RunnningGame, act: Action) -> &mut RunningGame, it can now mutate a RunningGame, as RunningGame is no longer responsible for being serializable or externally manipulable in general. - an inferer is
fn(&RunningGame) -> Vec<Action>and should list all the possible actions that can be taken. - and we need something that can produce
BoardStatesfn(&RunningGame) -> BoardState, possibly memoized in case creating theBoardStateis expensive.