From 3cdc1a78c8de68ba3cf813745ab5e1b2d188527f Mon Sep 17 00:00:00 2001 From: Mikayla Dobson Date: Wed, 17 Aug 2022 11:44:45 -0500 Subject: [PATCH] buy card appears to account for permanent resource upgrades --- .../Player/ActionMethods/buyCardActions.ts | 57 ++++++++++++------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/src/components/Player/ActionMethods/buyCardActions.ts b/src/components/Player/ActionMethods/buyCardActions.ts index 2d9dc6c..f0dca32 100644 --- a/src/components/Player/ActionMethods/buyCardActions.ts +++ b/src/components/Player/ActionMethods/buyCardActions.ts @@ -45,48 +45,65 @@ export const buyCard = (state: AppState, setState: setStateType, card: CardData) const { newPlayers, roundIncrement } = turnOrderUtil(prev, currentPlayer); const idx = newPlayers.indexOf(currentPlayer); + // assign pointers const newResourcePool = prev.gameboard.tradingResources; const cardCost = card.resourceCost; const updatedPlayer = newPlayers[idx]; - const totalBuyingPower = getTotalBuyingPower(updatedPlayer); - let availableGold = updatedPlayer.inventory['gold'] || 0; - for (let key of Object.keys(totalBuyingPower)) { + // iterate and perform purchase logic + for (let key of Object.keys(updatedPlayer.inventory)) { const typedKey = key as keyof ResourceCost; if (key === 'gold') continue; if (cardCost[typedKey] === 0) continue; - let tempPlayerInventory = updatedPlayer.inventory[typedKey] || 0; - let tempResourcePool = newResourcePool[typedKey] || 0; + // derived pointers for sections of state + let inventoryPointer = updatedPlayer.inventory[typedKey] || 0; + let resourcePoolPointer = newResourcePool[typedKey] || 0; let cardCostPointer = cardCost[typedKey] || 0; + let heldCardPointer = updatedPlayer.cards[key as keyof PlayerCards].length || 0; let goldToReturn = 0; - while (cardCostPointer > tempPlayerInventory && availableGold > 0) { - availableGold--; - goldToReturn++; - tempPlayerInventory++; - } - - while (goldToReturn) { - goldToReturn--; + // reduce required cost by number of permanent resources + while (heldCardPointer > 0) { + heldCardPointer--; cardCostPointer--; - tempPlayerInventory--; - newResourcePool['gold'] && newResourcePool['gold']++; } + // use available gold to account for difference between cardCost and inventory + while (cardCostPointer > inventoryPointer) { + if (availableGold > 0) { + availableGold--; + cardCostPointer--; + goldToReturn++; + } + } + + // redistribute gold back into resource pool + while (goldToReturn > 0) { + updatedPlayer.inventory['gold'] && updatedPlayer.inventory['gold']--; + newResourcePool['gold'] && newResourcePool['gold']++; + goldToReturn--; + } + + // complete remaining details of transaction while (cardCostPointer > 0) { cardCostPointer--; - tempPlayerInventory--; - tempResourcePool++; + inventoryPointer--; + resourcePoolPointer++; } - newResourcePool[typedKey] = tempResourcePool; - updatedPlayer.inventory[typedKey] = tempPlayerInventory; + // reassign to higher scope variables + newResourcePool[typedKey] = resourcePoolPointer; + updatedPlayer.inventory[typedKey] = inventoryPointer; updatedPlayer.inventory['gold'] = availableGold; } - updatedPlayer.cards = { ...updatedPlayer.cards, [card.gemValue]: [...updatedPlayer.cards[card.gemValue as keyof PlayerCards], card] } + // update player's held cards + updatedPlayer.cards = { + ...updatedPlayer.cards, + [card.gemValue]: [...updatedPlayer.cards[card.gemValue as keyof PlayerCards], card] + } let reservedCardCheck = false; // checks if current card was bought from reserved cards, removing it if so