public void Accept(IPlayer player) { if (player == null) throw new ArgumentNullException(nameof(player)); if (player == Owner) throw new ArgumentException("Can't accept a trade if owner == player"); if (!player.HasResources(Request)) throw new InvalidOperationException("Player should have the requested resources"); if (!Owner.HasResources(Offer)) throw new InvalidOperationException("Owner doesn't have the required resources (anymore)!"); lock (tradeLock) { if (State != TradeState.Open) throw new InvalidOperationException("Trade can no longer be accepted, because it's no longer open!"); IRawMaterial[] requested = player.TakeResources(Request); IRawMaterial[] offered = Owner.TakeResources(Offer); Owner.AddResources(requested); player.AddResources(offered); State = TradeState.Processed; } logger.Info($"Trade accepted From {Owner.Name} To {player.Name}. Offer {string.Join(", ", Offer)}, Request {string.Join(", ", Request)}"); }
// 25 Development Cards (14 Knight/Soldier Cards, 6 Progress Cards, 5 Victory Point Cards) //ore, wool and grain public void BuyDevelopmentCard(IPlayer player, ITurn turn) { if (player == null) throw new ArgumentNullException(nameof(player)); if (turn == null) throw new ArgumentNullException(nameof(turn)); if (!player.HasResources(DEVELOPMENTCARD_COST)) throw new InvalidOperationException("Player does not have the resources to buy a Development Card"); player.TakeResources(DEVELOPMENTCARD_COST); player.AddCard(new DevelopmentCard(deck.Pop(), turn)); }
public void BuyResource(MaterialType request, MaterialType offer, IPlayer player) { if (request == offer) throw new ArgumentException("Can't request same material as you are offering"); if (!VALID_RESOURCES.Contains(request)) throw new ArgumentException($"Request ({request}) is not a valid material!"); //GetInvestment also validates player != null, and offer is valid resource MaterialType[] investment = GetInvestmentCost(offer, player); if (!player.HasResources(investment)) throw new InvalidOperationException("Player does not have the resources to buy"); player.TakeResources(investment); player.AddResources(new RawMaterial(request)); logger.Info($"{player.Name} bought {request} for {offer}({investment.Count()})"); }
public Trade(MaterialType[] offer, MaterialType[] request, IPlayer owner) { if (offer == null) throw new ArgumentNullException(nameof(offer)); if (request == null) throw new ArgumentNullException(nameof(request)); if (owner == null) throw new ArgumentNullException(nameof(owner)); if (!offer.Any() && !request.Any()) throw new ArgumentException("You can't create a trade without at least an offer or a request"); if (offer.Any(m => INVALID_MATERIALS.Contains(m)) || request.Any(m => INVALID_MATERIALS.Contains(m))) throw new ArgumentException($"Can't create a trade with invalid material resources ({string.Join(", ", INVALID_MATERIALS)})"); if (!owner.HasResources(offer)) throw new InvalidOperationException("Can't offer materials if you don't have them"); Id = Guid.NewGuid(); Offer = offer; Request = request; Owner = owner; State = TradeState.Open; }