buy card appears to account for permanent resource upgrades
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user