private void DoCleanupPhase(PlayerState currentPlayer) { currentPlayer.EnterPhase(PlayPhase.Cleanup); if (currentPlayer.ownsCardThatHasSpecializedCleanupAtStartOfCleanup) { currentPlayer.cardsInPlayAtBeginningOfCleanupPhase.CopyFrom(currentPlayer.cardsPlayed); foreach (Card cardInPlay in currentPlayer.cardsInPlayAtBeginningOfCleanupPhase) { this.cardContextStack.PushCardContext(currentPlayer, cardInPlay, CardContextReason.CardBeingCleanedUp); cardInPlay.DoSpecializedCleanupAtStartOfCleanup(currentPlayer, this); this.cardContextStack.Pop(); } currentPlayer.cardsInPlayAtBeginningOfCleanupPhase.Clear(); } currentPlayer.CleanupCardsToDiscard(this); }
private void DoBuyPhase(PlayerState currentPlayer) { currentPlayer.EnterPhase(PlayPhase.Buy); while (currentPlayer.turnCounters.AvailableBuys > 0) { Card cardType = currentPlayer.actions.GetCardFromSupplyToBuy(this, CardAvailableForPurchaseForCurrentPlayer); if (cardType == null) { return; } if (!CardAvailableForPurchaseForCurrentPlayer(cardType)) { throw new Exception("Tried to buy card that didn't meet criteria"); } if (!this.CanGainCardFromSupply(cardType) && !cardType.isEvent) { return; } currentPlayer.turnCounters.RemoveCoins(cardType.CurrentCoinCost(currentPlayer)); currentPlayer.turnCounters.RemovePotions(cardType.potionCost); currentPlayer.turnCounters.RemoveBuy(); if (cardType.isEvent) { this.cardContextStack.PushCardContext(currentPlayer, cardType, CardContextReason.EventBeingResolved); cardType.DoSpecializedAction(currentPlayer, this); this.cardContextStack.Pop(); } else { Card boughtCard = this.PlayerGainCardFromSupply(cardType, currentPlayer, DeckPlacement.Discard, GainReason.Buy); if (boughtCard == null) { throw new Exception("CanGainCardFromSupply said we could buy a card when we couldn't"); } int embargoCount = this.pileEmbargoTokenCount[boughtCard]; for (int i = 0; i < embargoCount; ++i) { currentPlayer.GainCardFromSupply(Cards.Curse, this); } } } }
internal void DoPlayTreasures(PlayerState currentPlayer) { currentPlayer.EnterPhase(PlayPhase.PlayTreasure); while (true) { Card cardPlayed = DoPlayOneTreasure(currentPlayer); if (cardPlayed == null) { break; } } }
private void DoActionPhase(PlayerState currentPlayer) { currentPlayer.EnterPhase(PlayPhase.Action); while (currentPlayer.AvailableActions > 0) { currentPlayer.turnCounters.RemoveAction(); if (!currentPlayer.RequestPlayerPlayActionFromHand(this, Delegates.IsActionCardPredicate, isOptional: true)) { break; } } }
public void PlayTurn(PlayerState currentPlayer) { System.Threading.Interlocked.Increment(ref turnTotalCount); currentPlayer.numberOfTurnsPlayed += 1; IPlayerAction currentPlayerAction = currentPlayer.actions; this.gameLog.BeginTurn(currentPlayer); this.gameLog.PushScope(); currentPlayer.InitializeTurn(); ReturnCardsToHandAtStartOfTurn(currentPlayer); DoActionsQueuedFromPreviousTurn(currentPlayer); DoDurationActionsFromPreviousTurn(currentPlayer); DoActionPhase(currentPlayer); DoPlayTreasures(currentPlayer); currentPlayer.RequestPlayerSpendCoinTokensBeforeBuyPhase(this); DoBuyPhase(currentPlayer); DoCleanupPhase(currentPlayer); int cardCountForNextTurn = this.doesCurrentPlayerNeedOutpostTurn ? 3 : 5; currentPlayer.EnterPhase(PlayPhase.DrawCards); currentPlayer.DrawUntilCountInHand(cardCountForNextTurn, this); currentPlayer.EnterPhase(PlayPhase.NotMyTurn); this.gameLog.PopScope(); this.gameLog.EndTurn(currentPlayer); // turn counters need to be 0 such that if this player ends up looking at the state while not it's turn // e.g. as reaction or attack, it can make correct choices on current state such as AvailableCoin. currentPlayer.InitializeTurn(); }