diff --git a/src/App.tsx b/src/App.tsx index d5325d2..f586ed3 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -25,7 +25,7 @@ function App() { }, deck: CardDeck, }, - round: 0, + round: 1, players: new Array, }) @@ -34,9 +34,7 @@ function App() {

SPLENDOR

- {/* @ts-ignore */} } /> - {/* @ts-ignore */} } /> diff --git a/src/components/Gameboard/Gameboard.tsx b/src/components/Gameboard/Gameboard.tsx index 9d1a7db..88078f2 100644 --- a/src/components/Gameboard/Gameboard.tsx +++ b/src/components/Gameboard/Gameboard.tsx @@ -24,6 +24,7 @@ export default function Gameboard({ state, setState }: StateProps) { } else { setView(
+ Round: {state.round} diff --git a/src/components/Player/Player.tsx b/src/components/Player/Player.tsx index ddcce20..26e168e 100644 --- a/src/components/Player/Player.tsx +++ b/src/components/Player/Player.tsx @@ -1,26 +1,38 @@ import { AppState, PlayerData, ResourceCost, StateProps } from "../../util/types" import { v4 } from "uuid"; +import { useEffect, useState } from "react"; +import { TurnOrderUtil } from "../../util/TurnOrderUtil"; interface PlayerProps extends StateProps { player: PlayerData } export default function Player({ player, state, setState }: PlayerProps) { + const [dynamic, setDynamic] = useState(); + + useEffect(() => { + setDynamic(state.players.find((element: PlayerData) => element.id === player.id)); + }, [state]); + const getChips = (resource: string) => { + if (!dynamic?.turnActive) return; + setState((prev: AppState) => { + const { newPlayers, roundIncrement } = TurnOrderUtil(prev, dynamic); + return { ...prev, + round: (roundIncrement ? prev.round + 1 : prev.round), gameboard: { ...prev.gameboard, tradingResources: { ...prev.gameboard.tradingResources, [resource as keyof ResourceCost]: prev.gameboard.tradingResources[resource as keyof ResourceCost] -= 1 } - } + }, + players: newPlayers } }) - - console.log(state); } return ( @@ -31,6 +43,7 @@ export default function Player({ player, state, setState }: PlayerProps) {

Is {player.starter || "not"} round starter

{/* Dynamic data from state */} +

{dynamic?.turnActive ? "My turn!" : "..."}

diff --git a/src/util/GameConstructor.tsx b/src/util/GameConstructor.tsx index 23d1961..2946eb3 100644 --- a/src/util/GameConstructor.tsx +++ b/src/util/GameConstructor.tsx @@ -1,6 +1,6 @@ -import { useContext, useEffect, useState } from "react" +import { useEffect, useState } from "react" import { useNavigate } from "react-router-dom" -import { Context } from "../context/Context"; +import { v4 } from "uuid"; import { CardData, NobleData, PlayerData, StateProps } from "./types"; interface InputState { @@ -19,6 +19,7 @@ export default function GameConstructor({ state, setState }: StateProps) { const navigate = useNavigate(); const [starter, setStarter] = useState(-1); + const [error, setError] = useState('init'); const [input, setInput] = useState({ playerOne: { name: '', @@ -38,14 +39,30 @@ export default function GameConstructor({ state, setState }: StateProps) { }, }) - const newGame = () => { - if (!input.playerOne.name || !input.playerTwo.name) return; - if (input.playerFour.name && !input.playerThree.name) return; + useEffect(() => { + if (!input.playerOne.name || !input.playerTwo.name) { + setError("Please provide the minimum number of players."); + } else if (input.playerFour.name && !input.playerThree.name) { + setError("Your player input data is invalid. Please input players sequential turn order."); + } else if (error !== 'init' && starter === -1) { + setError("Please indicate a player to start."); + } else { + setError(''); + } + }, [input, starter]) + const newGame = () => { + if (error) return; + + let i = 0; const newPlayers = Object.values(input).map((val: {name: string, starter: boolean}): PlayerData => { + i++; + return { name: val.name, + id: i, starter: val.starter, + turnActive: val.starter, points: 0, nobles: new Array, cards: new Array, @@ -151,7 +168,8 @@ export default function GameConstructor({ state, setState }: StateProps) {
- +

{error !== 'init' && error}

+ ) } \ No newline at end of file diff --git a/src/util/TurnOrderUtil.ts b/src/util/TurnOrderUtil.ts new file mode 100644 index 0000000..d28439f --- /dev/null +++ b/src/util/TurnOrderUtil.ts @@ -0,0 +1,22 @@ +import { AppState, PlayerData } from "./types"; + +export const TurnOrderUtil = (prev: AppState, dynamic: PlayerData) => { + let roundIncrement = false; + const newPlayers = prev.players; + + for (let each of newPlayers) { + if (each.id === dynamic.id) { + each.turnActive = false; + } else if (each.id === dynamic.id + 1) { + each.turnActive = true; + } else if (dynamic.id + 1 > newPlayers.length) { + each.turnActive = false; + newPlayers[0].turnActive = true; + roundIncrement = true; + } else { + each.turnActive = false; + } + } + + return { newPlayers, roundIncrement }; +} \ No newline at end of file diff --git a/src/util/types.d.ts b/src/util/types.d.ts index 7fa4f83..bd11f8e 100644 --- a/src/util/types.d.ts +++ b/src/util/types.d.ts @@ -30,6 +30,7 @@ export interface GameInformation { export interface PlayerData { name: string, + id: number, starter: boolean, turnActive?: boolean, points: number,