export interface ClientMessage { uuid: string; target: string; method: string; args: { [key: string]: string }; } export interface LobbyEvents { newGame: (author: IUser, game: IGame) => void; updateGame: (game: IGame) => void; removeGame: (game: string) => void; } type TeamEvents = { team_addPlayer: { gameObject: string; data: string }; team_removePlayer: { gameObject: string; data: string }; }; type TE = { [T in keyof TeamEvents]: { event: T } & TeamEvents[T]; }; type ChildEvents = TE; export interface GameEvents { start: () => void; createTeam: (author: IUser, team: ITeam) => void; removeTeam: (team: ITeam) => void; createPlayer: (author: IUser, player: IPlayer) => void; removePlayer: (player: IPlayer, reason?: string) => void; childEvent: (event: ChildEvents[keyof ChildEvents]) => void; } export interface ICard extends IGameObject {} export interface IContainer extends IGameObject { cards: Array; } export interface IGameObject { readonly uuid: string; } export interface IUser extends IGameObject { readonly username: string; readonly image: string; } export interface IPlayer extends IGameObject { hand: IContainer; discard: IContainer; stack: IContainer; board: IContainer; user: IUser; } export interface ITeam extends IGameObject { players: IUser[]; } export interface IGame extends IGameObject { readonly teams: ITeam[]; readonly market: IContainer; readonly marketStack: IContainer; readonly fireGems: IContainer; readonly started: boolean; readonly owner: string; readonly rules: {}; }