reserve card action defined

This commit is contained in:
2022-07-31 11:43:25 -05:00
parent 70f2bbe16f
commit fa297bc09c
7 changed files with 100 additions and 30 deletions

View File

@@ -28,7 +28,7 @@ export default function Card({ data, state, setState }: CardProps) {
} }
{ state.actions.reserveCard.active && { state.actions.reserveCard.active &&
<button <button
onClick={() => reserveCard(state)}> onClick={() => reserveCard(state, setState, data)}>
Reserve This Card Reserve This Card
</button> </button>
} }

View File

@@ -1,3 +1,4 @@
import cardTierToKey from "../../../util/cardTierToKey";
import { turnOrderUtil } from "../../../util/turnOrderUtil"; import { turnOrderUtil } from "../../../util/turnOrderUtil";
import { AppState, CardData, FullDeck, PlayerData, ResourceCost, setStateType } from "../../../util/types"; import { AppState, CardData, FullDeck, PlayerData, ResourceCost, setStateType } from "../../../util/types";
import { useCurrentPlayer } from "../../../util/useCurrentPlayer"; import { useCurrentPlayer } from "../../../util/useCurrentPlayer";
@@ -71,10 +72,7 @@ export const buyCard = (card: CardData, state: AppState, setState: setStateType)
let updatedPlayer: PlayerData = { let updatedPlayer: PlayerData = {
...currentPlayer, ...currentPlayer,
cards: [ cards: [...currentPlayer.cards, card],
...currentPlayer.cards,
card
],
inventory: newPlayerInventory inventory: newPlayerInventory
} }
@@ -86,26 +84,11 @@ export const buyCard = (card: CardData, state: AppState, setState: setStateType)
updatedPlayer.points = newScore; updatedPlayer.points = newScore;
const idx = newPlayers.findIndex((one: PlayerData) => one.id === currentPlayer?.id); const idx = newPlayers.findIndex((one: PlayerData) => one.id === currentPlayer?.id);
newPlayers[idx] = updatedPlayer; newPlayers[idx] = updatedPlayer;
let updatedRows = { ...prev.gameboard.cardRows } let updatedRows = prev.gameboard.cardRows;
if (card.tier) { if (card.tier) {
let tierKey; const tierKey = cardTierToKey(card.tier);
switch (card.tier) { updatedRows[tierKey] = prev.gameboard.cardRows[tierKey].filter((found: CardData) => found.resourceCost !== card.resourceCost);
case 1:
tierKey = "tierOne"
break;
case 2:
tierKey = "tierTwo"
break;
case 3:
tierKey = "tierThree"
break;
default:
break;
}
updatedRows[tierKey as keyof FullDeck] =
prev.gameboard.cardRows[tierKey as keyof FullDeck].filter((found: CardData) => found.resourceCost !== card.resourceCost);
} }
return { return {

View File

@@ -1,8 +1,19 @@
import { AppState, setStateType } from '../../../util/types'; import { AppState, PlayerData, setStateType } from '../../../util/types';
import { useCurrentPlayer } from '../../../util/useCurrentPlayer'; import { useCurrentPlayer } from '../../../util/useCurrentPlayer';
// @ts-ignore
import { turnOrderUtil } from '../../../util/turnOrderUtil'; import { turnOrderUtil } from '../../../util/turnOrderUtil';
import { initialActions } from "../../../util/stateSetters"; import { initialActions } from "../../../util/stateSetters";
export const hasMaxChips = (player: PlayerData | null): boolean => {
if (!player) return true;
let sum = 0;
for (let count of Object.values(player.inventory)) {
sum += count;
}
if (sum >= 10) return true;
return false;
}
export const validateChips = (state: AppState): boolean => { export const validateChips = (state: AppState): boolean => {
if (!state.actions.getChips.active || !state.actions.getChips.selection) return false; if (!state.actions.getChips.active || !state.actions.getChips.selection) return false;
const selection = state.actions.getChips.selection; const selection = state.actions.getChips.selection;

View File

@@ -1,7 +1,62 @@
import { AppState } from "../../../util/types"; import cardTierToKey from "../../../util/cardTierToKey";
import { turnOrderUtil } from "../../../util/turnOrderUtil";
import { AppState, CardData, FullDeck, PlayerData, setStateType } from "../../../util/types";
import { useCurrentPlayer } from "../../../util/useCurrentPlayer"; import { useCurrentPlayer } from "../../../util/useCurrentPlayer";
export const reserveCard = (state: AppState) => { export const goldAllowable = (player: PlayerData | null): boolean => {
if (!player) return false;
let chipCount = 0;
for (let quantity of Object.values(player.inventory)) {
chipCount += quantity;
}
if (chipCount >= 10) return false;
return true;
}
export const hasMaxReserved = (player: PlayerData | null): boolean => {
if (!player) return true;
if (player.reservedCards && player.reservedCards.length >= 3) return true;
return false;
}
export const reserveCard = (state: AppState, setState: setStateType, card: CardData) => {
const currentPlayer = useCurrentPlayer(state); const currentPlayer = useCurrentPlayer(state);
console.log(currentPlayer); if (!currentPlayer) return;
if (hasMaxReserved(currentPlayer)) return;
setState((prev: AppState) => {
const { newPlayers, roundIncrement } = turnOrderUtil(prev, currentPlayer);
const updatedPlayer = {
...currentPlayer,
reservedCards: currentPlayer.reservedCards ? [
...currentPlayer.reservedCards, card
] : [card],
inventory: goldAllowable(currentPlayer) ? {
...currentPlayer.inventory,
gold: currentPlayer.inventory.gold && currentPlayer.inventory.gold + 1
} : currentPlayer.inventory
}
const idx = newPlayers.indexOf(currentPlayer);
newPlayers[idx] = updatedPlayer;
const newCardRows = prev.gameboard.cardRows;
const targetTier: keyof FullDeck = cardTierToKey(card.tier);
let updatedRow = newCardRows[targetTier];
updatedRow = updatedRow.filter((each: CardData) => each.resourceCost !== card.resourceCost);
newCardRows[targetTier] = updatedRow;
return {
...prev,
round: (roundIncrement ? prev.round + 1 : prev.round),
players: newPlayers,
gameboard: {
...prev.gameboard,
cardRows: newCardRows
}
}
})
} }

View File

@@ -2,6 +2,8 @@ import { PlayerProps } from "../../util/propTypes";
import { CardData, PlayerData } from "../../util/types" import { CardData, PlayerData } from "../../util/types"
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { v4 } from "uuid"; import { v4 } from "uuid";
import { hasMaxReserved } from "./ActionMethods/reserveCardActions";
import { hasMaxChips } from "./ActionMethods/getChipsActions";
export default function Player({ player, state, setState, setActionState }: PlayerProps) { export default function Player({ player, state, setState, setActionState }: PlayerProps) {
const [dynamic, setDynamic] = useState<PlayerData>(); const [dynamic, setDynamic] = useState<PlayerData>();
@@ -12,6 +14,11 @@ export default function Player({ player, state, setState, setActionState }: Play
setDynamic(state.players.find((element: PlayerData) => element.id === player.id)) setDynamic(state.players.find((element: PlayerData) => element.id === player.id))
}, [state]); }, [state]);
// sets action label back to default on setstate (round change)
useEffect(() => {
setActionState(-1, dynamic);
}, [setState])
useEffect(() => { useEffect(() => {
setActionState(actionSelection, dynamic); setActionState(actionSelection, dynamic);
@@ -38,9 +45,9 @@ export default function Player({ player, state, setState, setActionState }: Play
<section className="turn-and-action-based"> <section className="turn-and-action-based">
<p>Score: {dynamic?.points}</p> <p>Score: {dynamic?.points}</p>
<p>{dynamic?.turnActive ? prompt : '...'}</p> <p>{dynamic?.turnActive ? prompt : '...'}</p>
<button onClick={() => setActionSelection(0)}>Get Chips</button> <button disabled={dynamic && hasMaxChips(dynamic)} onClick={() => setActionSelection(0)}>Get Chips</button>
<button onClick={() => setActionSelection(1)}>Buy Card</button> <button onClick={() => setActionSelection(1)}>Buy Card</button>
<button onClick={() => setActionSelection(2)}>Reserve Card</button> <button disabled={dynamic && hasMaxReserved(dynamic)} onClick={() => setActionSelection(2)}>Reserve Card</button>
</section> </section>
<section className="resources"> <section className="resources">

14
src/util/cardTierToKey.ts Normal file
View File

@@ -0,0 +1,14 @@
import { FullDeck } from "./types"
export default function cardTierToKey(tier: number): keyof FullDeck {
switch (tier) {
case 1:
return "tierOne"
case 2:
return "tierTwo"
case 3:
return "tierThree"
default:
throw new Error("Invalid input to cardTierToKey");
}
}

View File

@@ -77,7 +77,7 @@ export interface FullDeck {
export interface CardData { export interface CardData {
gemValue: GemValue | string gemValue: GemValue | string
tier?: number tier: number
points?: number points?: number
resourceCost: ResourceCost resourceCost: ResourceCost
} }