68 lines
2.5 KiB
TypeScript
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
|
|
}
|
|
}
|
|
})
|
|
}
|