From d69336027a733e5765ce29d05cfb1a1c0f2d0387 Mon Sep 17 00:00:00 2001 From: Daniel McCrystal Date: Wed, 27 Aug 2025 23:00:01 -0400 Subject: [PATCH] holding cards, kinda --- packages/client/src/components/Card.tsx | 8 ++++--- packages/client/src/components/FannedHand.tsx | 24 ++++++++++++------- packages/client/src/components/Game.tsx | 17 +++++++++---- packages/client/src/components/Table.tsx | 2 +- packages/client/src/components/toolbox.tsx | 5 ++++ packages/server/src/api.ts | 7 +++--- 6 files changed, 43 insertions(+), 20 deletions(-) diff --git a/packages/client/src/components/Card.tsx b/packages/client/src/components/Card.tsx index e1ab0c5..5df8859 100644 --- a/packages/client/src/components/Card.tsx +++ b/packages/client/src/components/Card.tsx @@ -1,7 +1,7 @@ import { Component, Suspense } from "solid-js"; import type { Card } from "@games/shared/cards"; -import { Clickable, Stylable } from "./toolbox"; +import { Clickable, Sizable, Stylable } from "./toolbox"; const cardToSvgFilename = (card: Card) => { if (card.kind == "joker") { @@ -25,7 +25,8 @@ export default ((props) => { draggable={false} class={props.class} style={props.style} - width="100px" + width={props.width ?? "100px"} + height={props.height} src={ props.face == "down" ? "/views/back.svg" @@ -43,5 +44,6 @@ export default ((props) => { | { card?: Card; face: "down" } ) & Stylable & - Clickable + Clickable & + Sizable >; diff --git a/packages/client/src/components/FannedHand.tsx b/packages/client/src/components/FannedHand.tsx index 70b787c..4398fff 100644 --- a/packages/client/src/components/FannedHand.tsx +++ b/packages/client/src/components/FannedHand.tsx @@ -4,18 +4,26 @@ import Card from "./Card"; export default (props: { handCount: number }) => { return ( -
- - {() => ( + + {(_, i) => { + const midOffset = i() + 0.5 - props.handCount / 2; + return ( - )} - -
+ ); + }} + ); }; diff --git a/packages/client/src/components/Game.tsx b/packages/client/src/components/Game.tsx index 987c765..dcdd87c 100644 --- a/packages/client/src/components/Game.tsx +++ b/packages/client/src/components/Game.tsx @@ -49,13 +49,22 @@ export default () => { Quit - {([playerKey, handCount]) => ( + {([playerKey, handCount], i) => ( { + const midOffset = + i() + + 0.5 - + Object.values(view().playerHandCounts).length / + 2; + + ref.style = `position: absolute; display: flex; justify-content: center; top: 65%; transform: translate(${Math.abs( + midOffset * 0 + )}px, 0px) rotate(${midOffset * 1}rad)`; + }} > -
- -
+
)}
diff --git a/packages/client/src/components/Table.tsx b/packages/client/src/components/Table.tsx index d2f7472..d107c7f 100644 --- a/packages/client/src/components/Table.tsx +++ b/packages/client/src/components/Table.tsx @@ -65,7 +65,7 @@ export default (props: { tableKey: string }) => { view, }} > -
+
p != me())}> {(player, i) => { const verticalOffset = () => { diff --git a/packages/client/src/components/toolbox.tsx b/packages/client/src/components/toolbox.tsx index ca2ae98..332e45b 100644 --- a/packages/client/src/components/toolbox.tsx +++ b/packages/client/src/components/toolbox.tsx @@ -14,3 +14,8 @@ export type Clickable = { > | undefined; }; + +export type Sizable = { + width?: string; + height?: string; +}; diff --git a/packages/server/src/api.ts b/packages/server/src/api.ts index d13c423..50b97df 100644 --- a/packages/server/src/api.ts +++ b/packages/server/src/api.ts @@ -10,7 +10,6 @@ import dayjs from "dayjs"; import db from "./db"; import { liveTable, WsOut, WsIn } from "./table"; import { Human } from "@prisma/client"; -import _ from "lodash"; import { combine } from "kefir"; const api = new Elysia({ prefix: "/api" }) @@ -89,9 +88,9 @@ const api = new Elysia({ prefix: "/api" }) send({ players }) ); - table.outputs.playersReady.onValue((readys) => - send({ playersReady: readys }) - ); + table.outputs.playersReady + .skipDuplicates() + .onValue((readys) => send({ playersReady: readys })); combine( [table.outputs.gameState],