buy card appears to account for permanent resource upgrades

This commit is contained in:
2022-08-17 11:44:45 -05:00
parent e922a73fa1
commit 3cdc1a78c8

View File

@@ -45,48 +45,65 @@ export const buyCard = (state: AppState, setState: setStateType, card: CardData)
const { newPlayers, roundIncrement } = turnOrderUtil(prev, currentPlayer); const { newPlayers, roundIncrement } = turnOrderUtil(prev, currentPlayer);
const idx = newPlayers.indexOf(currentPlayer); const idx = newPlayers.indexOf(currentPlayer);
// assign pointers
const newResourcePool = prev.gameboard.tradingResources; const newResourcePool = prev.gameboard.tradingResources;
const cardCost = card.resourceCost; const cardCost = card.resourceCost;
const updatedPlayer = newPlayers[idx]; const updatedPlayer = newPlayers[idx];
const totalBuyingPower = getTotalBuyingPower(updatedPlayer);
let availableGold = updatedPlayer.inventory['gold'] || 0; 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; const typedKey = key as keyof ResourceCost;
if (key === 'gold') continue; if (key === 'gold') continue;
if (cardCost[typedKey] === 0) continue; if (cardCost[typedKey] === 0) continue;
let tempPlayerInventory = updatedPlayer.inventory[typedKey] || 0; // derived pointers for sections of state
let tempResourcePool = newResourcePool[typedKey] || 0; let inventoryPointer = updatedPlayer.inventory[typedKey] || 0;
let resourcePoolPointer = newResourcePool[typedKey] || 0;
let cardCostPointer = cardCost[typedKey] || 0; let cardCostPointer = cardCost[typedKey] || 0;
let heldCardPointer = updatedPlayer.cards[key as keyof PlayerCards].length || 0;
let goldToReturn = 0; let goldToReturn = 0;
while (cardCostPointer > tempPlayerInventory && availableGold > 0) { // reduce required cost by number of permanent resources
availableGold--; while (heldCardPointer > 0) {
goldToReturn++; heldCardPointer--;
tempPlayerInventory++;
}
while (goldToReturn) {
goldToReturn--;
cardCostPointer--; 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) { while (cardCostPointer > 0) {
cardCostPointer--; cardCostPointer--;
tempPlayerInventory--; inventoryPointer--;
tempResourcePool++; resourcePoolPointer++;
} }
newResourcePool[typedKey] = tempResourcePool; // reassign to higher scope variables
updatedPlayer.inventory[typedKey] = tempPlayerInventory; newResourcePool[typedKey] = resourcePoolPointer;
updatedPlayer.inventory[typedKey] = inventoryPointer;
updatedPlayer.inventory['gold'] = availableGold; 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; let reservedCardCheck = false;
// checks if current card was bought from reserved cards, removing it if so // checks if current card was bought from reserved cards, removing it if so