diff --git a/src/App.tsx b/src/App.tsx index 0ab9afe..7b3ce25 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,11 +1,11 @@ import { BrowserRouter, Routes, Route } from 'react-router-dom' -import { initialState } from './util/stateSetters'; -import { useEffect, useState } from 'react' +import { initialState } from './hooks/stateSetters'; +import { useState } from 'react' import Gameboard from './components/Gameboard/Gameboard' import GameConstructor from './components/GameConstructor'; -import './App.css' import ResumeGame from './components/ResumeGame'; +import './App.css' function App() { const [state, setState] = useState(initialState); diff --git a/src/components/Card/Card.tsx b/src/components/Card/Card.tsx index 856a697..40cd713 100644 --- a/src/components/Card/Card.tsx +++ b/src/components/Card/Card.tsx @@ -1,7 +1,7 @@ import { v4 } from 'uuid'; import { CardProps } from '../../util/propTypes'; import { ResourceCost } from '../../util/types'; -import { useCurrentPlayer } from '../../util/useCurrentPlayer'; +import { useCurrentPlayer } from '../../hooks/useCurrentPlayer'; import { buyCardActions } from '../Player/ActionMethods'; import { hasMaxReserved, reserveCard } from '../Player/ActionMethods/reserveCardActions'; const { buyCard, tooExpensive } = buyCardActions; diff --git a/src/components/Gameboard/Gameboard.tsx b/src/components/Gameboard/Gameboard.tsx index d58fb3f..846bd59 100644 --- a/src/components/Gameboard/Gameboard.tsx +++ b/src/components/Gameboard/Gameboard.tsx @@ -6,7 +6,7 @@ import { StateProps } from '../../util/propTypes'; import { Link } from 'react-router-dom'; // components -import Nobles from './Nobles'; +import Nobles from '../Nobles/Nobles'; import initializeBoard, { setCardRows } from '../../util/initializeBoard'; import AvailableChips from '../Resources/AvailableChips'; import AllPlayers from '../Player/AllPlayers'; diff --git a/src/components/Gameboard/gameboard.test.ts b/src/components/Gameboard/gameboard.test.ts index 05a6b30..8dc2f53 100644 --- a/src/components/Gameboard/gameboard.test.ts +++ b/src/components/Gameboard/gameboard.test.ts @@ -1,6 +1,6 @@ import { expect, it, describe, vi } from 'vitest'; import initializeBoard from '../../util/initializeBoard'; -import { initialState } from '../../util/stateSetters'; +import { initialState } from '../../hooks/stateSetters'; import { AppState, setStateType } from '../../util/types'; describe('game config', () => { diff --git a/src/components/Gameboard/Nobles.css b/src/components/Nobles/Nobles.css similarity index 100% rename from src/components/Gameboard/Nobles.css rename to src/components/Nobles/Nobles.css diff --git a/src/components/Gameboard/Nobles.test.ts b/src/components/Nobles/Nobles.test.ts similarity index 100% rename from src/components/Gameboard/Nobles.test.ts rename to src/components/Nobles/Nobles.test.ts diff --git a/src/components/Gameboard/Nobles.tsx b/src/components/Nobles/Nobles.tsx similarity index 97% rename from src/components/Gameboard/Nobles.tsx rename to src/components/Nobles/Nobles.tsx index 488b743..1184e53 100644 --- a/src/components/Gameboard/Nobles.tsx +++ b/src/components/Nobles/Nobles.tsx @@ -1,7 +1,7 @@ import { v4 } from "uuid"; import { NobleData, ResourceCost } from "../../util/types"; import { StateProps } from "../../util/propTypes"; -import "./Nobles.css" +import "../Nobles/Nobles.css" export default function Nobles({ state }: StateProps) { if (!state.gameboard.nobles.length) { diff --git a/src/util/canPickUpNoble.ts b/src/components/Nobles/canPickUpNoble.ts similarity index 81% rename from src/util/canPickUpNoble.ts rename to src/components/Nobles/canPickUpNoble.ts index 2021bc4..0fe3d6e 100644 --- a/src/util/canPickUpNoble.ts +++ b/src/components/Nobles/canPickUpNoble.ts @@ -1,5 +1,5 @@ -import getTotalBuyingPower from "./getTotalBuyingPower"; -import { NobleData, PlayerData, ResourceCost } from "./types"; +import getTotalBuyingPower from "../../util/getTotalBuyingPower"; +import { NobleData, PlayerData, ResourceCost } from "../../util/types"; export const canPickUpNoble = (player: PlayerData, noble: NobleData) => { const totalBuyingPower = getTotalBuyingPower(player); diff --git a/src/components/Player/ActionMethods/buyCard.test.tsx b/src/components/Player/ActionMethods/buyCard.test.tsx index d838987..4d28fc0 100644 --- a/src/components/Player/ActionMethods/buyCard.test.tsx +++ b/src/components/Player/ActionMethods/buyCard.test.tsx @@ -1,7 +1,7 @@ import { expensiveCard, midGameCardOne, midGameCardTwo, midGameState, mockPlayerOne, mockPlayerTwo, mockState } from '../../../util/testUtils'; import { buyCard, tooExpensive } from './buyCardActions'; import getTotalBuyingPower from '../../../util/getTotalBuyingPower'; -import { useCurrentPlayer } from '../../../util/useCurrentPlayer'; +import { useCurrentPlayer } from '../../../hooks/useCurrentPlayer'; import { AppState, CardData, PlayerData, ResourceCost } from '../../../util/types'; import { test, expect, describe, vi, afterEach } from 'vitest'; import { renderHook } from "@testing-library/react"; diff --git a/src/components/Player/ActionMethods/buyCardActions.ts b/src/components/Player/ActionMethods/buyCardActions.ts index 4b4c480..a41e7e5 100644 --- a/src/components/Player/ActionMethods/buyCardActions.ts +++ b/src/components/Player/ActionMethods/buyCardActions.ts @@ -1,9 +1,10 @@ import { turnOrderUtil } from "../../../util/turnOrderUtil"; import { AppState, CardData, FullDeck, ResourceCost, setStateType } from "../../../util/types"; -import { useCurrentPlayer } from "../../../util/useCurrentPlayer"; +import { useCurrentPlayer } from "../../../hooks/useCurrentPlayer"; import getTotalBuyingPower from "../../../util/getTotalBuyingPower"; -import { initialActions, setStateGetNoble } from "../../../util/stateSetters"; -import { canPickUpNoble } from "../../../util/canPickUpNoble"; +import { initialActions, setStateGetNoble } from "../../../hooks/stateSetters"; +import { canPickUpNoble } from "../../Nobles/canPickUpNoble"; +import usePreviousPlayer from "../../../hooks/usePreviousPlayer"; export const tooExpensive = (card: CardData, state: AppState): boolean => { const currentPlayer = useCurrentPlayer(state); @@ -95,10 +96,13 @@ export const buyCard = (state: AppState, setState: setStateType, card: CardData) } }); - for (let each of state.gameboard.nobles) { - if (canPickUpNoble(currentPlayer, each)) { - console.log(`${currentPlayer.name} can pick up noble ${state.gameboard.nobles.indexOf(each)}`); - setState((prev) => setStateGetNoble(prev, each)); + // iterates through gameboard nobles to determine if any can be acquired + for (let noble of state.gameboard.nobles) { + const previousPlayer = usePreviousPlayer(state); + if (!previousPlayer) return; + + if (canPickUpNoble(previousPlayer, noble)) { + setState((prev) => setStateGetNoble(prev, noble, previousPlayer)); } } } diff --git a/src/components/Player/ActionMethods/getChips.test.ts b/src/components/Player/ActionMethods/getChips.test.ts index bbddf47..293e55e 100644 --- a/src/components/Player/ActionMethods/getChips.test.ts +++ b/src/components/Player/ActionMethods/getChips.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, test } from "vitest"; -import { initialActions } from "../../../util/stateSetters"; +import { initialActions } from "../../../hooks/stateSetters"; import { mockPlayerOne, mockState } from "../../../util/testUtils"; import { AppState, PlayerData } from "../../../util/types"; import { hasMaxChips, validateChips } from "./getChipsActions"; diff --git a/src/components/Player/ActionMethods/getChipsActions.ts b/src/components/Player/ActionMethods/getChipsActions.ts index c5ea69c..35d096f 100644 --- a/src/components/Player/ActionMethods/getChipsActions.ts +++ b/src/components/Player/ActionMethods/getChipsActions.ts @@ -1,8 +1,8 @@ import { AppState, PlayerData, setStateType } from '../../../util/types'; -import { useCurrentPlayer } from '../../../util/useCurrentPlayer'; +import { useCurrentPlayer } from '../../../hooks/useCurrentPlayer'; // @ts-ignore import { turnOrderUtil } from '../../../util/turnOrderUtil'; -import { initialActions } from "../../../util/stateSetters"; +import { initialActions } from "../../../hooks/stateSetters"; export const hasMaxChips = (player: PlayerData | null): boolean => { if (!player) return true; diff --git a/src/components/Player/ActionMethods/reserveCardActions.ts b/src/components/Player/ActionMethods/reserveCardActions.ts index b440d7e..b64249b 100644 --- a/src/components/Player/ActionMethods/reserveCardActions.ts +++ b/src/components/Player/ActionMethods/reserveCardActions.ts @@ -1,8 +1,8 @@ import cardTierToKey from "../../../util/cardTierToKey"; -import { initialActions } from "../../../util/stateSetters"; +import { initialActions } from "../../../hooks/stateSetters"; import { turnOrderUtil } from "../../../util/turnOrderUtil"; import { AppState, CardData, FullDeck, PlayerData, setStateType } from "../../../util/types"; -import { useCurrentPlayer } from "../../../util/useCurrentPlayer"; +import { useCurrentPlayer } from "../../../hooks/useCurrentPlayer"; export const goldAllowable = (player: PlayerData | null): boolean => { if (!player) return false; diff --git a/src/components/Player/Player.tsx b/src/components/Player/Player.tsx index 503c131..e884c67 100644 --- a/src/components/Player/Player.tsx +++ b/src/components/Player/Player.tsx @@ -1,4 +1,4 @@ -import { setStateAwaitAction, setStateBuyCard, setStateGetChips, setStateReserveCard } from "../../util/stateSetters"; +import { setStateAwaitAction, setStateBuyCard, setStateGetChips, setStateReserveCard } from "../../hooks/stateSetters"; import { useEffect, useState } from "react"; import { PlayerProps } from "../../util/propTypes"; import { CardData, PlayerData } from "../../util/types" @@ -88,9 +88,26 @@ export default function Player({ player, state, setState }: PlayerProps) {

Score: {dynamic && dynamic.points}

{dynamic?.turnActive ? "It's your turn!" : "..."}

- - - + + {/* Player actions */} + + + + + +
diff --git a/src/components/Resources/AvailableChips.tsx b/src/components/Resources/AvailableChips.tsx index 486a4f0..058f7a5 100644 --- a/src/components/Resources/AvailableChips.tsx +++ b/src/components/Resources/AvailableChips.tsx @@ -1,26 +1,24 @@ import { ResourceProps } from "../../util/propTypes"; import { ResourceCost } from "../../util/types"; -import { useEffect } from "react"; import { v4 } from "uuid"; import "./AvailableChips.css" -export default function AvailableChips({ state, setState, liftSelection }: ResourceProps) { - useEffect(() => { - return; - }, [state]) - +export default function AvailableChips({ state, liftSelection }: ResourceProps) { return (
{ - Object.keys(state.gameboard.tradingResources).map((key: string | keyof ResourceCost) => { + Object.keys(state.gameboard.tradingResources).map((key: string) => { + const typedKey = key as keyof ResourceCost; return (
) diff --git a/src/components/Resources/SelectionView.tsx b/src/components/Resources/SelectionView.tsx index 62e2f06..d6ad369 100644 --- a/src/components/Resources/SelectionView.tsx +++ b/src/components/Resources/SelectionView.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from "react"; import { StateProps } from "../../util/propTypes"; -import { useCurrentPlayer } from "../../util/useCurrentPlayer"; +import { useCurrentPlayer } from "../../hooks/useCurrentPlayer"; import { GetChipsHTML, ReserveCardHTML } from "./ViewHTML"; export default function SelectionView({ state, setState }: StateProps) { diff --git a/src/components/Resources/ViewHTML.tsx b/src/components/Resources/ViewHTML.tsx index bc29628..4c85f84 100644 --- a/src/components/Resources/ViewHTML.tsx +++ b/src/components/Resources/ViewHTML.tsx @@ -1,10 +1,10 @@ import { v4 } from "uuid"; import { useEffect, useState } from "react"; -import { setStateGetChips } from "../../util/stateSetters"; +import { setStateGetChips } from "../../hooks/stateSetters"; import { StateProps } from "../../util/propTypes"; import { ResourceCost } from "../../util/types"; import { getChipsActions } from "../Player/ActionMethods"; -import { useCurrentPlayer } from "../../util/useCurrentPlayer"; +import { useCurrentPlayer } from "../../hooks/useCurrentPlayer"; import { hasMaxChips } from "../Player/ActionMethods/getChipsActions"; const { getChips } = getChipsActions; diff --git a/src/util/stateSetters.ts b/src/hooks/stateSetters.ts similarity index 86% rename from src/util/stateSetters.ts rename to src/hooks/stateSetters.ts index bdd05ca..d2c5976 100644 --- a/src/util/stateSetters.ts +++ b/src/hooks/stateSetters.ts @@ -1,6 +1,5 @@ -import { AppState, CardData, NobleData, PlayerData, ResourceCost } from "./types"; +import { AppState, CardData, NobleData, PlayerData, ResourceCost } from "../util/types"; import CardDeck from '../data/cards.json'; -import { useCurrentPlayer } from "./useCurrentPlayer"; export const initialActions = { buyCard: { active: false }, @@ -79,17 +78,14 @@ export const setStateReserveCard = (prev: AppState) => { } } -export const setStateGetNoble = (prev: AppState, noble: NobleData) => { - const currentPlayer = useCurrentPlayer(prev); - if (!currentPlayer) return prev; - +export const setStateGetNoble = (prev: AppState, noble: NobleData, prevPlayer: PlayerData) => { const updatedPlayer = { - ...currentPlayer, - nobles: [...currentPlayer.nobles, noble], - points: currentPlayer.points + 3 + ...prevPlayer, + nobles: [...prevPlayer.nobles, noble], + points: prevPlayer.points + 3 } - const idx = prev.players.indexOf(currentPlayer); + const idx = prev.players.indexOf(prevPlayer); const newPlayers = prev.players; newPlayers[idx] = updatedPlayer; diff --git a/src/util/useCurrentPlayer.tsx b/src/hooks/useCurrentPlayer.tsx similarity index 89% rename from src/util/useCurrentPlayer.tsx rename to src/hooks/useCurrentPlayer.tsx index c0467c1..b4a3eca 100644 --- a/src/util/useCurrentPlayer.tsx +++ b/src/hooks/useCurrentPlayer.tsx @@ -1,4 +1,4 @@ -import { AppState, PlayerData } from "./types"; +import { AppState, PlayerData } from "../util/types"; export const useCurrentPlayer = (state: AppState): PlayerData | null => { /** diff --git a/src/hooks/usePreviousPlayer.tsx b/src/hooks/usePreviousPlayer.tsx new file mode 100644 index 0000000..474bafd --- /dev/null +++ b/src/hooks/usePreviousPlayer.tsx @@ -0,0 +1,12 @@ +import { AppState } from "../util/types"; +import { useCurrentPlayer } from "./useCurrentPlayer"; + +export default function usePreviousPlayer(state: AppState) { + const currentPlayer = useCurrentPlayer(state); + if (!currentPlayer) return; + + const numPlayers = state.players.length; + const targetID = currentPlayer.id; + const idx = ((targetID - 2) < 0) ? (numPlayers - 1) : (targetID - 2); + return state.players[idx]; +} \ No newline at end of file diff --git a/src/util/testUtils.ts b/src/util/testUtils.ts index dcdee0c..b6ab5ef 100644 --- a/src/util/testUtils.ts +++ b/src/util/testUtils.ts @@ -1,4 +1,4 @@ -import { initialState } from "./stateSetters" +import { initialState } from "../hooks/stateSetters" import { AppState, CardData, NobleData, PlayerData } from "./types" // mock data for early game diff --git a/src/util/util.test.ts b/src/util/util.test.ts index 8a3cc5a..2cd403e 100644 --- a/src/util/util.test.ts +++ b/src/util/util.test.ts @@ -2,7 +2,7 @@ import { describe, expect, test } from "vitest" import cardTierToKey from "./cardTierToKey"; import { mockPlayerOne, mockState } from "./testUtils"; import { turnOrderUtil } from "./turnOrderUtil"; -import { useCurrentPlayer } from "./useCurrentPlayer"; +import { useCurrentPlayer } from "../hooks/useCurrentPlayer"; describe('app utilities', () => { test('useCurrentPlayer', () => {