public override Settlement List(MarketPlace marketPlace) { Ensure.That(marketPlace).IsNotNull(); Ensure.That(marketPlace.StarCluster.Equals(Item.Location.GetStarCluster())); var settlement = new Settlement(); foreach (var sellOrder in marketPlace.SellOrders.For(Item).OrderBy(x => x.PricePerUnit)) { if (OutOfRange(sellOrder) || sellOrder.OutOfRange(this)) continue; if (sellOrder.PricePerUnit > PricePerUnit) continue; if (sellOrder.BlockSize > Quantity) continue; if (BuyFrom(sellOrder, settlement)) return marketPlace.Settle(settlement); } marketPlace.Add(this); return marketPlace.Settle(settlement); }
public static SettlementState Save(Settlement settlement) { return new SettlementState { ObjectId = settlement.Id, Name = settlement.Name, Item = settlement.Item.Save(), Owner = settlement.Item.Owner.ToObjectReference(), Location = settlement.Item.Location.ToObjectReference(), TimeToSettlement = settlement.Timer, SpendByOwner = settlement._spendByOwner.ToDictionary(k => k.Key.ToObjectReference(), v => v.Value), }; }
public static ObjectBuilder<Settlement> Build(SettlementState state) { var settlement = new Settlement { Id = state.ObjectId, Name = state.Name, Timer = state.TimeToSettlement, }; var builder = new ObjectBuilder<Settlement>(settlement); builder .Dependent(state.Item) .Build(item => Item.Builder.Build(item)) .Resolve((resolver, target, item) => item.Location = resolver.Get<ILocation>(state.Location)) .Resolve((resolver, target, item) => item.Owner = resolver.Get<Corporation>(state.Owner)) .Resolve((resolver, target, item) => target._item = item); builder .Resolve((resolver, target) => SpendByOwner(resolver, target, state.SpendByOwner)); return builder; }
private bool BuyFrom(SellOrder sellOrder, Settlement settlement) { uint commonBlockSize; if (!GetBlockSize(sellOrder, out commonBlockSize)) return Quantity == 0; var targetQuantity = Math.Min(Quantity, sellOrder.Quantity); var numberOfBlocks = targetQuantity/commonBlockSize; var buyQuantity = numberOfBlocks*commonBlockSize; var item = new Item(sellOrder.Item, buyQuantity, Owner); settlement.Add(sellOrder, buyQuantity * sellOrder.PricePerUnit, item); sellOrder.Item.Quantity -= buyQuantity; if (sellOrder.Item.Quantity == 0) { sellOrder.Remove(); } Item.Quantity -= buyQuantity; return Quantity == 0; }
public Settlement Settle(Settlement settlement) { if (settlement.Success) { settlement.Timer = SettlementDelay; Settlements.Add(settlement); } return settlement; }
private static void SpendByOwner(IIdResolver resolver, Settlement settlement, Dictionary<ObjectReference, long> spendByOwner) { settlement._spendByOwner = spendByOwner.ToDictionary(spend => resolver.Get<Corporation>(spend.Key), spend => spend.Value); }