proper turn order handling, round change logic
This commit is contained in:
@@ -25,7 +25,7 @@ function App() {
|
|||||||
},
|
},
|
||||||
deck: CardDeck,
|
deck: CardDeck,
|
||||||
},
|
},
|
||||||
round: 0,
|
round: 1,
|
||||||
players: new Array<PlayerData>,
|
players: new Array<PlayerData>,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -34,9 +34,7 @@ function App() {
|
|||||||
<h1>SPLENDOR</h1>
|
<h1>SPLENDOR</h1>
|
||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
<Routes>
|
<Routes>
|
||||||
{/* @ts-ignore */}
|
|
||||||
<Route path="/" element={<GameConstructor state={state} setState={setState} />} />
|
<Route path="/" element={<GameConstructor state={state} setState={setState} />} />
|
||||||
{/* @ts-ignore */}
|
|
||||||
<Route path="/game" element={<Gameboard state={state} setState={setState} />} />
|
<Route path="/game" element={<Gameboard state={state} setState={setState} />} />
|
||||||
</Routes>
|
</Routes>
|
||||||
</BrowserRouter>
|
</BrowserRouter>
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ export default function Gameboard({ state, setState }: StateProps) {
|
|||||||
} else {
|
} else {
|
||||||
setView(
|
setView(
|
||||||
<div className="gameboard-rows">
|
<div className="gameboard-rows">
|
||||||
|
<strong>Round: {state.round}</strong>
|
||||||
<Nobles state={state} setState={setState} />
|
<Nobles state={state} setState={setState} />
|
||||||
<CardRow tier={3} cards={state.gameboard.cardRows.tierThree} />
|
<CardRow tier={3} cards={state.gameboard.cardRows.tierThree} />
|
||||||
<CardRow tier={2} cards={state.gameboard.cardRows.tierTwo} />
|
<CardRow tier={2} cards={state.gameboard.cardRows.tierTwo} />
|
||||||
|
|||||||
@@ -1,26 +1,38 @@
|
|||||||
import { AppState, PlayerData, ResourceCost, StateProps } from "../../util/types"
|
import { AppState, PlayerData, ResourceCost, StateProps } from "../../util/types"
|
||||||
import { v4 } from "uuid";
|
import { v4 } from "uuid";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import { TurnOrderUtil } from "../../util/TurnOrderUtil";
|
||||||
|
|
||||||
interface PlayerProps extends StateProps {
|
interface PlayerProps extends StateProps {
|
||||||
player: PlayerData
|
player: PlayerData
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function Player({ player, state, setState }: PlayerProps) {
|
export default function Player({ player, state, setState }: PlayerProps) {
|
||||||
|
const [dynamic, setDynamic] = useState<PlayerData>();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setDynamic(state.players.find((element: PlayerData) => element.id === player.id));
|
||||||
|
}, [state]);
|
||||||
|
|
||||||
const getChips = (resource: string) => {
|
const getChips = (resource: string) => {
|
||||||
|
if (!dynamic?.turnActive) return;
|
||||||
|
|
||||||
setState((prev: AppState) => {
|
setState((prev: AppState) => {
|
||||||
|
const { newPlayers, roundIncrement } = TurnOrderUtil(prev, dynamic);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...prev,
|
...prev,
|
||||||
|
round: (roundIncrement ? prev.round + 1 : prev.round),
|
||||||
gameboard: {
|
gameboard: {
|
||||||
...prev.gameboard,
|
...prev.gameboard,
|
||||||
tradingResources: {
|
tradingResources: {
|
||||||
...prev.gameboard.tradingResources,
|
...prev.gameboard.tradingResources,
|
||||||
[resource as keyof ResourceCost]: prev.gameboard.tradingResources[resource as keyof ResourceCost] -= 1
|
[resource as keyof ResourceCost]: prev.gameboard.tradingResources[resource as keyof ResourceCost] -= 1
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
players: newPlayers
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
console.log(state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -31,6 +43,7 @@ export default function Player({ player, state, setState }: PlayerProps) {
|
|||||||
<p>Is {player.starter || "not"} round starter</p>
|
<p>Is {player.starter || "not"} round starter</p>
|
||||||
|
|
||||||
{/* Dynamic data from state */}
|
{/* Dynamic data from state */}
|
||||||
|
<p>{dynamic?.turnActive ? "My turn!" : "..."}</p>
|
||||||
<button onClick={() => getChips('ruby')}>Get Chips</button>
|
<button onClick={() => getChips('ruby')}>Get Chips</button>
|
||||||
<div className="player-cards"></div>
|
<div className="player-cards"></div>
|
||||||
<div className="player-resources"></div>
|
<div className="player-resources"></div>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { useContext, useEffect, useState } from "react"
|
import { useEffect, useState } from "react"
|
||||||
import { useNavigate } from "react-router-dom"
|
import { useNavigate } from "react-router-dom"
|
||||||
import { Context } from "../context/Context";
|
import { v4 } from "uuid";
|
||||||
import { CardData, NobleData, PlayerData, StateProps } from "./types";
|
import { CardData, NobleData, PlayerData, StateProps } from "./types";
|
||||||
|
|
||||||
interface InputState {
|
interface InputState {
|
||||||
@@ -19,6 +19,7 @@ export default function GameConstructor({ state, setState }: StateProps) {
|
|||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const [starter, setStarter] = useState(-1);
|
const [starter, setStarter] = useState(-1);
|
||||||
|
const [error, setError] = useState('init');
|
||||||
const [input, setInput] = useState<InputState>({
|
const [input, setInput] = useState<InputState>({
|
||||||
playerOne: {
|
playerOne: {
|
||||||
name: '',
|
name: '',
|
||||||
@@ -38,14 +39,30 @@ export default function GameConstructor({ state, setState }: StateProps) {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const newGame = () => {
|
useEffect(() => {
|
||||||
if (!input.playerOne.name || !input.playerTwo.name) return;
|
if (!input.playerOne.name || !input.playerTwo.name) {
|
||||||
if (input.playerFour.name && !input.playerThree.name) return;
|
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 => {
|
const newPlayers = Object.values(input).map((val: {name: string, starter: boolean}): PlayerData => {
|
||||||
|
i++;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
name: val.name,
|
name: val.name,
|
||||||
|
id: i,
|
||||||
starter: val.starter,
|
starter: val.starter,
|
||||||
|
turnActive: val.starter,
|
||||||
points: 0,
|
points: 0,
|
||||||
nobles: new Array<NobleData>,
|
nobles: new Array<NobleData>,
|
||||||
cards: new Array<CardData>,
|
cards: new Array<CardData>,
|
||||||
@@ -151,7 +168,8 @@ export default function GameConstructor({ state, setState }: StateProps) {
|
|||||||
</input>
|
</input>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button disabled={!input.playerOne.name || !input.playerTwo.name} onClick={newGame}>Start Game</button>
|
<p>{error !== 'init' && error}</p>
|
||||||
|
<button disabled={error.length > 0} onClick={newGame}>Start Game</button>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
22
src/util/TurnOrderUtil.ts
Normal file
22
src/util/TurnOrderUtil.ts
Normal file
@@ -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 };
|
||||||
|
}
|
||||||
1
src/util/types.d.ts
vendored
1
src/util/types.d.ts
vendored
@@ -30,6 +30,7 @@ export interface GameInformation {
|
|||||||
|
|
||||||
export interface PlayerData {
|
export interface PlayerData {
|
||||||
name: string,
|
name: string,
|
||||||
|
id: number,
|
||||||
starter: boolean,
|
starter: boolean,
|
||||||
turnActive?: boolean,
|
turnActive?: boolean,
|
||||||
points: number,
|
points: number,
|
||||||
|
|||||||
Reference in New Issue
Block a user