From 0cd59cdb2379db2c407ca9adb37229bc5d8c06d9 Mon Sep 17 00:00:00 2001 From: legonzaur Date: Sun, 26 May 2024 15:21:54 +0200 Subject: [PATCH] initial commit --- client/containers.ts | 47 +++++++++++++++++++++ client/index.ts | 58 ++++++++++++++++++++++++++ generic/containers.ts | 55 +++++++++++++++++++++++++ generic/index.ts | 95 +++++++++++++++++++++++++++++++++++++++++++ server/containers.ts | 48 ++++++++++++++++++++++ server/index.ts | 65 +++++++++++++++++++++++++++++ 6 files changed, 368 insertions(+) create mode 100644 client/containers.ts create mode 100644 client/index.ts create mode 100644 generic/containers.ts create mode 100644 generic/index.ts create mode 100644 server/containers.ts create mode 100644 server/index.ts diff --git a/client/containers.ts b/client/containers.ts new file mode 100644 index 0000000..d93931b --- /dev/null +++ b/client/containers.ts @@ -0,0 +1,47 @@ +import { ContainerVisibility, IContainer, IFireGemsStack, IInteractibleContainer, IMarket, IMarketStack, IPlayableContainer, IPlayerBoard, IPlayerDiscard, IPlayerHand, IPlayerStack } from "../generic/containers.js" +import { IGameObject, ICard, IPlayer, IGame } from "../generic/index.js" + +export interface ICContainer extends IContainer { + onCardsAppend: (cards: Array) => void + onDraw: (cards: Array) => void + onRemoveCards: (cards: Array) => void + onShuffle: () => void +} + +export interface ICInteractibleContainer extends IInteractibleContainer { + onSacrifice: (card: ICard) => void +} + +export interface ICPlayableContainer extends IPlayableContainer { + onDiscard: (card: ICard) => void +} + +export interface ICMarketStack extends IMarketStack { + +} + +export interface ICMarket extends IMarket { + onBuy: (card: ICard) => void + onBuyInHand: (card: ICard) => void + onBuyInStack: (card: ICard) => void +} + +export interface ICFireGemsStack extends IFireGemsStack { + +} + +export interface ICPlayerStack extends IPlayerStack { + +} + +export interface ICPlayerDiscard extends IPlayerDiscard { + onPutOnStack: (card: ICard) => void +} + +export interface ICPlayerHand extends IPlayerHand { + onPutAllOnBoard: () => void +} + +export interface ICPlayerBoard extends IPlayerBoard { + onStunChampion: (card: ICard) => void +} \ No newline at end of file diff --git a/client/index.ts b/client/index.ts new file mode 100644 index 0000000..3e32358 --- /dev/null +++ b/client/index.ts @@ -0,0 +1,58 @@ +import { IFireGemsStack, IMarket, IMarketStack, IPlayerBoard, IPlayerDiscard, IPlayerHand } from "../generic/containers.js" +import { ICard, IEffect, IGame, IGameObject, ILobby, IPlayer, ITeam, ITurn, IUser } from "../generic/index.js" +import { ISLobby } from "../server/index.js" + +export interface ICEffect extends IEffect { + +} + +export interface ICCard extends ICard { + +} + +export interface ICTurn extends ITurn { + onCardLock: (card: ICard) => void +} + +export interface ICPlayer extends IPlayer { + onReadyStateChange: (ready: boolean) => void +} + +export interface ICTeam extends ITeam { + damage: (amount: number) => void + join: () => void + + onTakeDamage: (amount: number) => void + onPlayerAdd: (player: IPlayer) => void + onPlayerRemove: (player: IPlayer) => void + onStartTurn: () => void + onEndTurn: () => void + onDie: () => void +} + +export interface ICGame extends IGame { + join: () => void + kick: (player: IPlayer) => void + leave: () => void + start: () => void + + request_join: () => void + request_kick: (player: ICPlayer) => void + request_leave: () => void + request_start: () => void + request_changeRules: () => void + request_gameEnd: () => void + + onRulesChange: () => void + onAddTeam: (team: ITeam) => void + onRemoveTeam: (team: ITeam) => void + onGameStart: () => void + onGameEnd: () => void +} + +export interface ICUser extends IUser { + +} +export interface ICLobby extends ILobby { + request_createGame: () => Promise> +} \ No newline at end of file diff --git a/generic/containers.ts b/generic/containers.ts new file mode 100644 index 0000000..c4e1926 --- /dev/null +++ b/generic/containers.ts @@ -0,0 +1,55 @@ +import { ICard, IGame, IGameObject, IPlayer } from "./index.js" + +export enum ContainerVisibility { + NONE = "none", + ONLY_LAST = "only_last", + ALL = "all", + PROTECTED = "protected" +} + +export interface IContainer extends IGameObject { + owner: T + readonly visibility: ContainerVisibility +} + +export interface IInteractibleContainer extends IContainer { + readonly visibility: ContainerVisibility.ALL | ContainerVisibility.PROTECTED + request_sacrifice: (card: ICard) => void +} + +export interface IPlayableContainer extends IInteractibleContainer { + request_discard: (card: ICard) => void +} + +export interface IMarketStack extends IContainer { + readonly visibility: ContainerVisibility.NONE +} + +export interface IMarket extends IContainer { + readonly visibility: ContainerVisibility.ALL + request_buy: (card: ICard) => void + request_buyInHand: (card: ICard) => void + request_buyInStack: (card: ICard) => void +} + +export interface IFireGemsStack extends IMarket { + +} + +export interface IPlayerStack extends IContainer { + readonly visibility: ContainerVisibility.NONE +} + +export interface IPlayerDiscard extends IInteractibleContainer { + readonly visibility: ContainerVisibility.ALL + request_putOnStack: (card: ICard) => void +} + +export interface IPlayerHand extends IPlayableContainer { + readonly visibility: ContainerVisibility.PROTECTED +} + +export interface IPlayerBoard extends IPlayableContainer { + readonly visibility: ContainerVisibility.ALL + request_stunChampion: (card: ICard) => void +} \ No newline at end of file diff --git a/generic/index.ts b/generic/index.ts new file mode 100644 index 0000000..ef76d3b --- /dev/null +++ b/generic/index.ts @@ -0,0 +1,95 @@ +import { WebSocket } from "ws" +import { IFireGemsStack, IMarket, IMarketStack, IPlayerBoard, IPlayerDiscard, IPlayerHand } from "./containers.js" + +export const ClientQueryType = { + ACTION: "action", + SUBSCRIBE: "subscribe", + UNSUBSCRIBE: "unsubscribe", +} as const + +export const ServerQueryType = { + CREATE: "create", + ERROR: "error", + ADD: "add", + REMOVE: "remove", +} as const + +export type ClientMessageType = typeof ClientQueryType[keyof typeof ClientQueryType] +export type ServerMessageType = typeof ServerQueryType[keyof typeof ServerQueryType] + +export interface ClientMessage { + uuid: string + type: ClientMessageType + target: string + method: string + args: { [key: string]: string } +} + +export interface ServerMessage { + type: ServerMessageType + answer_to?: ClientMessage["uuid"] + args: { [key: string]: any } +} + + +export interface IGameObject { + uuid: string +} + +export interface IEffect extends IGameObject { + request_use: () => void +} + +export interface ICard extends IGameObject { + +} + +export interface ITurn extends IGameObject { + readonly effectsAvailables: Array + readonly cardsLocked: Set + discardMarkers: number + fuckUMarkers: number + damageReserve: number + goldReserve: number + currentDiscardEffect: IEffect + request_lockCard: (card: ICard) => void +} + +export interface IPlayer extends IGameObject { + readonly board: IPlayerBoard + readonly hand: IPlayerHand + readonly discard: IPlayerDiscard + ready: boolean + username: string + user: IUser + request_setReady: (value: boolean) => void +} + +export interface ITeam extends IGameObject { + readonly players: Set + color: string + health: number + + request_damage: (amount: number) => void + request_join: (player: IPlayer) => void +} + +export interface IGame extends IGameObject { + readonly marketStack: IMarketStack + readonly market: IMarket + readonly fireGems: IFireGemsStack + readonly owner: IPlayer + currentTurn?: ITeam + started: boolean + changeRules: () => void + end: () => void +} + +export interface IUser extends IGameObject { + +} + +export interface ILobby extends IGameObject { + + removeGame: () => void +} \ No newline at end of file diff --git a/server/containers.ts b/server/containers.ts new file mode 100644 index 0000000..6e9ef92 --- /dev/null +++ b/server/containers.ts @@ -0,0 +1,48 @@ +import { ContainerVisibility, IContainer, IFireGemsStack, IInteractibleContainer, IMarket, IMarketStack, IPlayableContainer, IPlayerBoard, IPlayerDiscard, IPlayerHand, IPlayerStack } from "../generic/containers.js" +import { IGameObject, ICard, IPlayer, IGame } from "../generic/index.js" +import { ISCard } from "./index.js" + +export interface ISContainer extends IContainer { + appendCards: (cards: Array) => void + draw: (amount: number) => Array + removeCards: (cards: Array) => void + shuffle: () => void +} + +export interface ISInteractibleContainer extends IInteractibleContainer { + sacrifice: (card: ISCard) => void +} + +export interface ISPlayableContainer extends IPlayableContainer { + discard: (card: ISCard) => void +} + +export interface ISMarketStack extends IMarketStack { + +} + +export interface ISMarket extends IMarket { + buy: (card: ISCard) => void + buyInHand: (card: ISCard) => void + buyInStack: (card: ISCard) => void +} + +export interface ISFireGemsStack extends IFireGemsStack { + +} + +export interface ISPlayerStack extends IPlayerStack { + +} + +export interface ISPlayerDiscard extends IPlayerDiscard { + putOnStack: (card: ISCard) => void +} + +export interface ISPlayerHand extends IPlayerHand { + putAllOnBoard: () => void +} + +export interface ISPlayerBoard extends IPlayerBoard { + stunChampion: (card: ISCard) => void +} \ No newline at end of file diff --git a/server/index.ts b/server/index.ts new file mode 100644 index 0000000..c051d59 --- /dev/null +++ b/server/index.ts @@ -0,0 +1,65 @@ +import { ICard, IEffect, IGame, ILobby, IPlayer, ITeam, ITurn, IUser, ServerMessage } from "../generic/index.js" +import { WebSocket } from "ws" + +export interface ISClientProvider { + socket: WebSocket + send: (message: ServerMessage) => void +} +export interface ISQuery { + provider: ISClientProvider + accept: (message: ServerMessage) => void + cancel: (message: ServerMessage) => void + error: (message: string) => void +} + +export interface ISEffect extends IEffect { + use: () => void +} + +export interface ISCard extends ICard { + +} + +export interface ISTurn extends ITurn { + lockCard: (card: ICard) => void +} + +export interface ISPlayer extends IPlayer { + setReady: (ready: boolean) => void +} + +export interface ISTeam extends ITeam { + + damage: (amount: number) => void + addPlayer: (player: IPlayer) => void + removePlayer: (player: IPlayer) => void + startTurn: () => void + endTurn: () => void + die: () => void +} + +export interface ISGame extends IGame { + addTeam: (team: ISTeam) => void + removeTeam: (team: ISTeam) => void + start: () => void + + request_join: (query: ISQuery) => void + request_kick: (query: ISQuery) => void + request_leave: (query: ISQuery) => void + request_start: (query: ISQuery) => void + request_changeRules: (query: ISQuery) => void + request_gameEnd: (query: ISQuery) => void + +} + +export interface ISUser extends IUser { + +} + +export interface ISLobby extends ILobby { + createGame: () => void + request_createGame: (query: ISQuery) => void + request_login: (query: ISQuery) => void + + subscribe: (query: ISQuery) => any +} \ No newline at end of file