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 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