void;
};
-export const GameBoard = ({ gridItems, setGridItems }: GameStateActions) => {
+export const GameBoard = ({
+ gridItems,
+ setGridItems,
+ ...playerDataProps
+}: GameStateActions & PlayerDataProps) => {
const { query } = useRouter();
const { activeCard, activeId, ...dragProps } = useHandleDrag({
@@ -33,7 +37,11 @@ export const GameBoard = ({ gridItems, setGridItems }: GameStateActions) => {
return (
-
+
{(isReversed
? gridItems.slice(0, 20).reverse()
: gridItems.slice(0, 20)
diff --git a/src/pages/game.tsx b/src/pages/game.tsx
index e6693ba..5325db0 100644
--- a/src/pages/game.tsx
+++ b/src/pages/game.tsx
@@ -1,24 +1,30 @@
import { LoadDeck } from "@/components/molecules/LoadDeck";
import { GameBoard } from "@/components/organisms/GameBoard";
import { GRIDS } from "@/components/organisms/GameBoard/constants";
-import { GameCard, GameState, PlayersState } from "@/types/card";
+import { GameCard, GameState, PlayerData, PlayersState } from "@/types/card";
import { useRouter } from "next/router";
import { useMemo, useState } from "react";
const initGameState: GameCard[][] = Array.from({ length: 36 }, () => []);
+const initGameData: PlayerData = {
+ earth: 0,
+ wind: 0,
+ fire: 0,
+ water: 0,
+ life: 20,
+};
export default function GamePage() {
const { query } = useRouter();
const name = (query?.name as string | undefined) ?? "p1";
- // const [gridItems, setGridItems] = useState(initGameState);
const [players, setPlayers] = useState({
- p1: initGameState,
- p2: initGameState,
- GLOBAL: initGameState,
+ p1: { state: initGameState, data: initGameData },
+ p2: { state: initGameState, data: initGameData },
+ GLOBAL: { state: initGameState, data: initGameData },
});
- function setPlayer(playerName: keyof typeof players) {
+ function setPlayerState(playerName: keyof typeof players) {
return (state: GameState) => {
const newState = [...state]; // make a copy of state
const GLOBAL = newState.slice(0, GRIDS.AURA_12 + 1); // GLOBAL takes game grid
@@ -26,36 +32,58 @@ export default function GamePage() {
const newGlobal = [...GLOBAL, ...GLOBAL_EMPTY];
setPlayers((prev) => ({
...prev,
- GLOBAL: newGlobal,
- [playerName]: state,
+ GLOBAL: { state: newGlobal, data: initGameData },
+ [playerName]: { state, data: prev[playerName].data },
+ }));
+ };
+ }
+
+ function setPlayerData(playerName: keyof typeof players) {
+ return (data: PlayersState["GLOBAL"]["data"]) => {
+ setPlayers((prev) => ({
+ ...prev,
+ [playerName]: { state: prev[playerName].state, data },
}));
};
}
const state = useMemo(() => {
return [
- ...players.GLOBAL.slice(0, GRIDS.HAND),
- ...players[name as keyof typeof players].slice(GRIDS.HAND),
+ ...players.GLOBAL.state.slice(0, GRIDS.HAND),
+ ...players[name as keyof typeof players].state.slice(GRIDS.HAND),
];
}, [players, name]);
- if (needsDeck(players["p1"]))
+ if (needsDeck(players["p1"].state))
return (
Load deck for player 1
-
+
);
- if (needsDeck(players["p2"]))
+ if (needsDeck(players["p2"].state))
return (
Load deck for player 2
-
+
);
- return ;
+ return (
+
+ );
}
function needsDeck(state: GameState) {
diff --git a/src/styles/globals.css b/src/styles/globals.css
index e27a23b..acc752e 100644
--- a/src/styles/globals.css
+++ b/src/styles/globals.css
@@ -1 +1,21 @@
@layer reset, base, tokens, recipes, utilities;
+
+/* custom scrollbar */
+::-webkit-scrollbar {
+ width: 20px;
+}
+
+::-webkit-scrollbar-track {
+ background-color: transparent;
+}
+
+::-webkit-scrollbar-thumb {
+ background-color: #d6dee1;
+ border-radius: 20px;
+ border: 6px solid transparent;
+ background-clip: content-box;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background-color: #a8bbbf;
+}
diff --git a/src/types/card.ts b/src/types/card.ts
index e10ffcb..df9ffec 100644
--- a/src/types/card.ts
+++ b/src/types/card.ts
@@ -49,4 +49,17 @@ export type GridItem = GameCard[];
* */
export type GameState = GridItem[];
-export type PlayersState = Record & { GLOBAL: GameState };
+export type PlayerData = {
+ earth: number;
+ wind: number;
+ fire: number;
+ water: number;
+ life: number;
+};
+type PState = { state: GameState; data: PlayerData };
+export type PlayersState = Record & { GLOBAL: PState };
+
+export type PlayerDataProps = {
+ players?: PlayersState;
+ setMyData(data: PlayersState["GLOBAL"]["data"]): void;
+};