enum GameEventType { move, engine, player, load, result, lock, step, flip, } abstract class GameEvent { GameEventType type; T? data; GameEvent(this.type, [this.data]); @override String toString() => '$type $data'; static GameEventType? eventType(Type t) { switch (t) { case GameMoveEvent: return GameEventType.move; case GameEngineEvent: return GameEventType.engine; case GamePlayerEvent: return GameEventType.player; case GameLoadEvent: return GameEventType.load; case GameResultEvent: return GameEventType.result; case GameLockEvent: return GameEventType.lock; case GameStepEvent: return GameEventType.step; case GameFlipEvent: return GameEventType.flip; } return null; } } class GameMoveEvent extends GameEvent { GameMoveEvent(String move) : super(GameEventType.move, move); } class GameEngineEvent extends GameEvent { GameEngineEvent(String move) : super(GameEventType.engine, move); } class GamePlayerEvent extends GameEvent { GamePlayerEvent(int hand) : super(GameEventType.player, hand); } class GameLoadEvent extends GameEvent { GameLoadEvent(int state) : super(GameEventType.load, state); } class GameResultEvent extends GameEvent { GameResultEvent(String move) : super(GameEventType.result, move); } class GameLockEvent extends GameEvent { GameLockEvent(bool isLock) : super(GameEventType.lock, isLock); } class GameStepEvent extends GameEvent { GameStepEvent(String step) : super(GameEventType.step, step); } class GameFlipEvent extends GameEvent { GameFlipEvent(bool isFlip) : super(GameEventType.flip, isFlip); }