Ejemplo n.º 1
0
        public ConcurrentBag <Trade> CalculateTrades(TradingPost post)
        {
            var newTrades = new ConcurrentBag <Trade>();

            var s = new System.Diagnostics.Stopwatch();

            s.Start();

            var mods = GetModifierCombinations(Modifiers);

            var cmMod = new Modifier(-1, "Commerce Mastery", 0, 0, 0,
                                     CmRank.Bonus, CmRank.Bonus, CmRank.Bonus, CmRank.Bonus, new List <int>(), new List <int>());

            foreach (var m in mods)
            {
                m.Add(cmMod);
            }

            mods.Add(new List <Modifier> {
                cmMod
            });

            Parallel.ForEach(Transports.Where(t => t.Enabled), t =>
            {
                var allowedMods = mods.Where(combination =>
                                             !combination.Any(m =>
                                                              m.TransportationBlacklist.Contains(t.Id))
                                             );

                Parallel.ForEach(allowedMods, m =>
                {
                    var baseLoad = new Load(t.Slots + m.Sum(i => i.ExtraSlots),
                                            t.Weight + m.Sum(i => i.ExtraWeight));

                    var loads = new ConcurrentBag <Load>();
                    GetLoads(loads, post, baseLoad, Ducats);

                    foreach (var load in loads)
                    {
                        foreach (var dst in Posts.Where(p => p != post))
                        {
                            newTrades.Add(new Trade(t, Route(post.Waypoint, dst.Waypoint), load, post, dst, m));
                        }
                    }
                });
            });

            s.Stop();

            System.Diagnostics.Debug.WriteLine("Calculated {0} possible trades ({1} items, {2} destinations, {3} means of transport, {4} modifier combinations) in {5}", newTrades.Count,
                                               post.Items.Count(i => i.Status == ItemStatus.Available), Posts.Count - 1, Transports.Count(t => t.Enabled), mods.Count, s.Elapsed);

            return(newTrades);
        }
Ejemplo n.º 2
0
        private void GetLoads(ConcurrentBag <Load> loads, TradingPost post, Load currentLoad, long currentDucts)
        {
            if (currentLoad.RemainingSlots == 0)
            {
                return;
            }

            var candidates = post.Items.Where(i => i.Status == ItemStatus.Available && !currentLoad.Slots.ContainsKey(i)).ToList();

            Parallel.ForEach(candidates, i => FillLoadWithItem(loads, post, currentLoad, currentDucts, i));
        }
Ejemplo n.º 3
0
        private int AddItemToLoad(ConcurrentBag <Load> loads, TradingPost post, Load currentLoad, long currentDucats, Item item, int requested)
        {
            var loadCopy = currentLoad.Copy();

            var added = loadCopy.AddItem(item, Math.Min(item.Stock, requested));

            if (added != 0)
            {
                loads.Add(loadCopy);

                GetLoads(loads, post, loadCopy, currentDucats - item.Price * added);
            }

            return(added);
        }
Ejemplo n.º 4
0
        private void FillLoadWithItem(ConcurrentBag <Load> loads, TradingPost post, Load currentLoad, long currentDucats, Item item)
        {
            var canAdd = (int)(currentDucats / item.Price);

            var added = AddItemToLoad(loads, post, currentLoad, currentDucats, item, canAdd);

            var excess = added % item.QuantityPerSlot;

            if (added < item.QuantityPerSlot || excess == 0)
            {
                return;
            }

            AddItemToLoad(loads, post, currentLoad, currentDucats, item, added - excess);
        }
Ejemplo n.º 5
0
 public Profit(TradingPost destination, int profit)
 {
     Destination = destination;
     Amount = profit;
 }
Ejemplo n.º 6
0
        private void GetLoads(ConcurrentBag<Load> loads, TradingPost post, Load currentLoad, long currentDucts)
        {
            if (currentLoad.RemainingSlots == 0)
                return;

            var candidates = post.Items.Where(i => i.Status == ItemStatus.Available && !currentLoad.Slots.ContainsKey(i)).ToList();

            Parallel.ForEach(candidates, i => FillLoadWithItem(loads, post, currentLoad, currentDucts, i));
        }
Ejemplo n.º 7
0
        private void FillLoadWithItem(ConcurrentBag<Load> loads, TradingPost post, Load currentLoad, long currentDucats, Item item)
        {
            var canAdd = (int)(currentDucats / item.Price);

            var added = AddItemToLoad(loads, post, currentLoad, currentDucats, item, canAdd);

            var excess = added % item.QuantityPerSlot;

            if (added < item.QuantityPerSlot || excess == 0)
                return;

            AddItemToLoad(loads, post, currentLoad, currentDucats, item, added - excess);
        }
Ejemplo n.º 8
0
        private int AddItemToLoad(ConcurrentBag<Load> loads, TradingPost post, Load currentLoad, long currentDucats, Item item, int requested)
        {
            var loadCopy = currentLoad.Copy();

            var added = loadCopy.AddItem(item, Math.Min(item.Stock, requested));

            if (added != 0)
            {
                loads.Add(loadCopy);

                GetLoads(loads, post, loadCopy, currentDucats - item.Price * added);
            }

            return added;
        }
Ejemplo n.º 9
0
        public ConcurrentBag<Trade> CalculateTrades(TradingPost post)
        {
            var newTrades = new ConcurrentBag<Trade>();

            var s = new System.Diagnostics.Stopwatch();
            s.Start();

            var mods = GetModifierCombinations(Modifiers);

            var cmMod = new Modifier(-1, "Commerce Mastery", 0, 0, 0,
                    CmRank.Bonus, CmRank.Bonus, CmRank.Bonus, CmRank.Bonus, new List<int>(), new List<int>());

            foreach (var m in mods)
                m.Add(cmMod);

            mods.Add(new List<Modifier> { cmMod });

            Parallel.ForEach(Transports.Where(t => t.Enabled), t =>
                {
                    var allowedMods = mods.Where(combination =>
                        !combination.Any(m =>
                            m.TransportationBlacklist.Contains(t.Id))
                        );

                    Parallel.ForEach(allowedMods, m =>
                    {
                        var baseLoad = new Load(t.Slots + m.Sum(i => i.ExtraSlots),
                            t.Weight + m.Sum(i => i.ExtraWeight));

                        var loads = new ConcurrentBag<Load>();
                        GetLoads(loads, post, baseLoad, Ducats);

                        foreach (var load in loads)
                            foreach (var dst in Posts.Where(p => p != post))
                            {
                                newTrades.Add(new Trade(t, Route(post.Waypoint, dst.Waypoint), load, post, dst, m));
                            }
                    });
                });

            s.Stop();

            System.Diagnostics.Debug.WriteLine("Calculated {0} possible trades ({1} items, {2} destinations, {3} means of transport, {4} modifier combinations) in {5}", newTrades.Count,
                post.Items.Count(i => i.Status == ItemStatus.Available), Posts.Count - 1, Transports.Count(t => t.Enabled), mods.Count, s.Elapsed);

            return newTrades;
        }
Ejemplo n.º 10
0
 public Profit(TradingPost destination, int profit)
 {
     Destination = destination;
     Amount      = profit;
 }