internal Card RequestPlayerTrashCardFromHandAndGainCard(
GameState gameState,
CardPredicate acceptableCardsToTrash,
CostConstraint costConstraint,
int cost,
CardRelativeCost cardRelativeCost,
bool isOptionalToTrash = false,
bool isOptionalToGain = false,
DeckPlacement defaultLocation = DeckPlacement.Discard)
{
Card trashedCard = this.RequestPlayerTrashCardFromHand(gameState, acceptableCardsToTrash, isOptionalToTrash);
if (trashedCard != null)
{
int cardCost = cardRelativeCost == CardRelativeCost.RelativeCost ? trashedCard.CurrentCoinCost(this) + cost :
cardRelativeCost == CardRelativeCost.AbsoluteCost ? cost : 0;
CardPredicate cardPredicate;
if (costConstraint == CostConstraint.Exactly)
{
cardPredicate = acceptableCard => acceptableCard.CurrentCoinCost(this) == cardCost;
}
else if (costConstraint == CostConstraint.UpTo)
{
cardPredicate = acceptableCard => acceptableCard.CurrentCoinCost(this) <= cardCost;
}
else
{
throw new Exception("Invalid operation");
}
return this.RequestPlayerGainCardFromSupply(
gameState,
cardPredicate,
"",
isOptionalToGain,
defaultLocation);
}
return null;
}