Files
splendor-clone/src/components/Player/ActionMethods/buyCardActions.ts
2022-08-05 19:53:20 -05:00

68 lines
2.5 KiB
TypeScript

import { turnOrderUtil } from "../../../util/turnOrderUtil";
import { AppState, CardData, ResourceCost, setStateType } from "../../../util/types";
import { useCurrentPlayer } from "../../../util/useCurrentPlayer";
import getTotalBuyingPower from "../../../util/getTotalBuyingPower";
export const tooExpensive = (card: CardData, state: AppState): boolean => {
const currentPlayer = useCurrentPlayer(state);
if (!currentPlayer) return true;
for (let [gemType, cost] of Object.entries(card.resourceCost)) {
let totalBuyingPower = getTotalBuyingPower(state);
for (let [heldResource, quantity] of Object.entries(totalBuyingPower)) {
if (gemType === heldResource && quantity < cost) {
return true;
}
}
}
return false;
}
export const buyCard = (state: AppState, setState: setStateType, card: CardData) => {
const currentPlayer = useCurrentPlayer(state);
if (!currentPlayer) return;
setState((prev) => {
const { newPlayers, roundIncrement } = turnOrderUtil(prev, currentPlayer);
const idx = newPlayers.indexOf(currentPlayer);
const updatedPlayer = newPlayers[idx];
const cardCost = card.resourceCost;
const newPlayerInventory = updatedPlayer.inventory;
const newResourcePool = prev.gameboard.tradingResources;
for (let key of Object.keys(cardCost)) {
const typedKey = key as keyof ResourceCost;
let adjustedCost = cardCost[typedKey];
let adjustedInventoryValue = newPlayerInventory[typedKey];
let adjustedResourcePoolValue = newResourcePool[typedKey];
if (!adjustedCost || !adjustedInventoryValue || !adjustedResourcePoolValue) continue;
while (adjustedCost > 0) {
adjustedCost--;
adjustedInventoryValue--;
adjustedResourcePoolValue++;
}
newPlayerInventory[typedKey] = adjustedInventoryValue;
newResourcePool[typedKey] = adjustedResourcePoolValue;
}
updatedPlayer.inventory = newPlayerInventory;
updatedPlayer.cards = [...updatedPlayer.cards, card];
newPlayers[idx] = updatedPlayer;
return {
...prev,
players: newPlayers,
round: (roundIncrement ? prev.round + 1 : prev.round),
gameboard: {
...prev.gameboard,
tradingResources: newResourcePool
}
}
})
}