public static void ValidateBid(GameActionValidator validator, PrivateAuctionRound round, PlayerState actingPlayerState, PrivateCompany selection, int bid) { var currentAuction = round.CurrentAuction; if (currentAuction != null) { validator.Validate(selection == currentAuction.Selection, $"Bid on '{selection}' is not legal - there is already an auction for '{currentAuction.Selection}' in progress."); validator.Validate(bid > currentAuction.HighBid, $"Bid of '{bid}' is not legal - the current high bid is '{currentAuction.HighBid}'."); } validator.ValidateMultipleOf(5, bid, $"Bid of '{bid}' is not legal - must be a multiple of 5."); validator.Validate(bid <= selection.Value, $"Bid of '{bid}' is not legal - overbidding is not permitted."); validator.Validate(round.SeedMoney >= selection.Value - bid, $"Bid of '{bid}' is not legal - not enough seed money."); validator.Validate(bid <= actingPlayerState.Money, $"Bid of '{bid}' is not legal - player '{actingPlayerState.Player}' has only {actingPlayerState.Money} cash available."); }
public static GameState MakeBid(GameState gameState, PrivateAuctionRound round, PlayerState biddingPlayerState, PrivateCompany selection, int bid) { if (round.CurrentAuction == null) { // No auction is in progress so start a new auction for the selected private round = round.StartAuction(biddingPlayerState.Player, selection, bid); } else { // Apply the new bid to the current auction var newAuction = round.CurrentAuction.MakeBid(selection, biddingPlayerState.Player, bid); round = round.Update(auction: newAuction, activePlayer: newAuction.GetNextPlayer()); } if (bid == selection.Value) { // Maximum bid was made, auction terminates return CompleteAuction(gameState, round); } return gameState.WithRound(round); }
public static void PlayerHasPrivate(GameState state, Player player, PrivateCompany company) { Assert.Contains(company, state.GetPlayerState(player).PrivateCompanies); }
public IGameAction PlayerBidsOnPrivate(Player player, PrivateCompany privateCompany, int bid) { LastAction = new PlayerPrivateBidAction(LastAction, player, privateCompany, bid); return LastAction; }
private PrivateAuctionRound StartAuction(Player biddingPlayer, PrivateCompany selection, int bid) { var auction = new Auction<PrivateCompany>(selection, biddingPlayer, bid, Players); return Update(auction: auction, activePlayer: Players.GetPlayerAfter(biddingPlayer), lastToAct: biddingPlayer); }
private BidChoice<PrivateCompany> GetLegalBid(PlayerState activePlayerState, PrivateCompany selection) { var currentBid = this.CurrentAuction?.HighBid ?? 0; var min = Math.Max(selection.Value - SeedMoney, currentBid + 5); var max = Math.Min(selection.Value, activePlayerState.GetMoneyRoundedDownToMultipleOf(5)); if (min > max) return null; return new BidChoice<PrivateCompany>(selection, min, max); }