Пример #1
0
        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);
        }
Пример #2
0
 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),
     };
 }
Пример #3
0
            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;
            }
Пример #4
0
        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;
        }
Пример #5
0
        public Settlement Settle(Settlement settlement)
        {
            if (settlement.Success)
            {
                settlement.Timer = SettlementDelay;
                Settlements.Add(settlement);
            }

            return settlement;
        }
Пример #6
0
 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);
 }