示例#1
0
        public void TestMethod1()
        {
            var eb = new EquipmentBuilder(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
            var options = new StoreOptions() { LawLevel = 2, Population = 6, Starport = "B", TechLevel = 10, Roll = true };
            var store = eb.AvailabilityTable(options);

            foreach (var section in store.Sections)
                foreach (var item in section.Items)
                    Debug.WriteLine($"{item.Name} TL: {item.TechLevel} CR{item.Price.ToString("N0")} Roll {item.Availability} {(item.BlackMarket ? " Black Market" : "")}");
        }
        public Store AvailabilityTable(World world)
        {
            StoreOptions options = new StoreOptions()
            {
                LawLevel = world.LawCode.Value,
                Population = world.PopulationCode.Value,
                Starport = world.StarportCode.ToString(),
                TechLevel = world.TechCode.Value,
            };

            options.TradeCodes.AddRange(world.RemarksList);
            return AvailabilityTable(options);
        }
        public Store AvailabilityTable(StoreOptions options)
        {
            var actualSeed = options.Seed ?? (new Random()).Next();
            var dice       = new Dice(actualSeed);

            var result = new Store()
            {
                Options = options
            };

            foreach (var sectionXml in m_Book.Section)
            {
                var section = result.Sections.SingleOrDefault(s => s.Name == sectionXml.Name);
                if (section == null)
                {
                    section = new Section()
                    {
                        Name = sectionXml.Name
                    };
                    result.Sections.Add(section);
                }

                if (sectionXml.Item != null)
                {
                    foreach (var itemXml in sectionXml.Item)
                    {
                        ProcessItem(options, dice, sectionXml, section, itemXml);
                    }
                }

                if (sectionXml.Subsection != null)
                {
                    foreach (var subsectionXml in sectionXml.Subsection)
                    {
                        subsectionXml.Book     = subsectionXml.Book ?? sectionXml.Book;
                        subsectionXml.Category = ReadString(subsectionXml.Category, sectionXml.Category);
                        subsectionXml.Law      = ReadString(subsectionXml.Law, sectionXml.Law);
                        subsectionXml.Mod      = subsectionXml.Mod ?? sectionXml.Mod;
                        subsectionXml.Page     = subsectionXml.Page ?? sectionXml.Page;
                        subsectionXml.Skill    = subsectionXml.Skill ?? sectionXml.Skill;
                        subsectionXml.TL       = ReadString(subsectionXml.TL, sectionXml.TL);


                        var subsection = section.Subsections.SingleOrDefault(s => s.Name == subsectionXml.Name);
                        if (subsection == null)
                        {
                            subsection = new Subsection()
                            {
                                Name = subsectionXml.Name, SectionKey = section.Key
                            };
                            section.Subsections.Add(subsection);
                        }

                        if (subsectionXml.Item != null)
                        {
                            foreach (var itemXml in subsectionXml.Item)
                            {
                                ProcessItem(options, dice, subsectionXml, subsection, itemXml);
                            }
                        }
                    }
                }
            }

            //cleanup

            for (int i = result.Sections.Count - 1; i >= 0; i--)
            {
                var section = result.Sections[i];
                for (int j = section.Subsections.Count - 1; j >= 0; j--)
                {
                    if (section.Subsections[j].Items.Count == 0)
                    {
                        section.Subsections.RemoveAt(j);
                    }
                }

                if (section.Items.Count == 0 && section.Subsections.Count == 0)
                {
                    result.Sections.RemoveAt(i);
                }
            }


            return(result);
        }
        private static void ProcessItem(StoreOptions options, Dice dice, CatalogSection sectionXml, IHasItems section, CatalogSectionItem itemXml)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options), $"{nameof(options)} is null.");
            }
            if (dice == null)
            {
                throw new ArgumentNullException(nameof(dice), $"{nameof(dice)} is null.");
            }
            if (sectionXml == null)
            {
                throw new ArgumentNullException(nameof(sectionXml), $"{nameof(sectionXml)} is null.");
            }
            if (section == null)
            {
                throw new ArgumentNullException(nameof(section), $"{nameof(section)} is null.");
            }
            if (itemXml == null)
            {
                throw new ArgumentNullException(nameof(itemXml), $"{nameof(itemXml)} is null.");
            }

            var item = new Item
            {
                Book      = itemXml.Book ?? sectionXml.Book,
                Category  = ParseInt(itemXml.Category, sectionXml.Category),
                Law       = ParseInt(itemXml.Law, sectionXml.Law),
                TechLevel = ParseInt(itemXml.TL, sectionXml.TL),
                Price     = itemXml.PriceCredits,
                Name      = itemXml.Name,
                Mod       = itemXml.Mod ?? sectionXml.Mod,
                Mass      = itemXml.Mass,
                AmmoPrice = itemXml.AmmoPriceCredits,
                Skill     = itemXml.Skill ?? sectionXml.Skill,
                Page      = itemXml.Page ?? sectionXml.Page
            };
            var options1 = options;
            var item1    = item;

            if (item1.Category == 0)
            {
                item1.Category = 1; //force a minimum category
            }
            var availabilityDM = 0;

            if (string.Equals(item1.Mod, "Specialized", OrdinalIgnoreCase))
            {
                availabilityDM += -1;
            }
            if (string.Equals(item1.Mod, "Military", OrdinalIgnoreCase))
            {
                availabilityDM += -2;
            }


            var techDiff = options1.TechLevel.Value - item1.TechLevel;

            if (techDiff < 0)
            {
                item1.NotAvailable = true;                //item is not available.
            }
            else if (3 <= techDiff && techDiff <= 4)
            {
                availabilityDM += -1;
            }
            else if (5 <= techDiff && techDiff <= 9)
            {
                availabilityDM += -2;
            }
            else if (10 <= techDiff)
            {
                availabilityDM += -4;
            }


            if (options1.Starport == "A" || options1.Starport == "B")
            {
                availabilityDM += 1;
            }
            else if (options1.Starport == "X")
            {
                availabilityDM += -4;
            }

            if (options1.TradeCodes.Contains("Hi", OrdinalIgnoreCase) || options1.TradeCodes.Contains("Ht", OrdinalIgnoreCase) || options1.TradeCodes.Contains("In", OrdinalIgnoreCase) || options1.TradeCodes.Contains("Ri", OrdinalIgnoreCase))
            {
                availabilityDM += 2;
            }
            if (options1.TradeCodes.Contains("Lt", OrdinalIgnoreCase) || options1.TradeCodes.Contains("Na", OrdinalIgnoreCase) || options1.TradeCodes.Contains("NI", OrdinalIgnoreCase) || options1.TradeCodes.Contains("Po", OrdinalIgnoreCase))
            {
                availabilityDM += -2;
            }

            if (options1.Population == 0)
            {
                availabilityDM += -4;
            }
            else if (1 <= options1.Population && options1.Population <= 2)
            {
                availabilityDM += -2;
            }
            else if (3 <= options1.Population && options1.Population <= 5)
            {
                availabilityDM += -1;
            }
            else if (9 <= options1.Population && options1.Population <= 11)
            {
                availabilityDM += 1;
            }
            else if (12 <= options1.Population)
            {
                availabilityDM += 2;
            }

            if (item1.Law > 0 && options1.LawLevel >= item1.Law)
            {
                item1.BlackMarket = true;

                if (options1.LawLevel == 0)
                {
                    availabilityDM += 2;
                }
                else if (1 <= options1.LawLevel && options1.LawLevel <= 3)
                {
                    availabilityDM += 1;
                }
                else if (4 <= options1.LawLevel && options1.LawLevel <= 6)
                {
                    availabilityDM += 0;
                }
                else if (7 <= options1.LawLevel && options1.LawLevel <= 9)
                {
                    availabilityDM += -1;
                }
                else if (10 <= options1.LawLevel)
                {
                    availabilityDM += -2;
                }

                switch (item1.Category)
                {
                case 1: availabilityDM += 4; item1.Price *= 2; break;

                case 2: availabilityDM += 2; item1.Price *= 3; break;

                case 3: availabilityDM += 0; item1.Price *= 5; break;

                case 4: availabilityDM += -2; item1.Price *= 10; break;

                case 5: availabilityDM += -4; item1.Price *= 20; break;

                case 6: availabilityDM += -6; item1.Price *= 20; break;
                }

                item1.SentencingDM = (options1.LawLevel.Value - item1.Law) + item1.Category;
            }

            if (item1.BlackMarket)
            {
                availabilityDM += options1.StreetwiseScore;
            }
            else
            {
                availabilityDM += Math.Max(options1.BrokerScore, options1.StreetwiseScore);
            }
            item1.Availability = 8 - availabilityDM;

            if (item.NotAvailable)
            {
                //skip item
            }
            else if (!options.Roll)
            {
                section.Items.Add(item);
            }
            else
            {
                var roll = dice.D(2, 6) - item.Availability;
                if (roll >= 0)
                {
                    section.Items.Add(item);
                }
                else if (roll == -1)
                {
                    item.Price *= 2;
                    section.Items.Add(item);
                }
                else if (roll == -2)
                {
                    item.Price *= 3;
                    section.Items.Add(item);
                }
            }
        }
        public ActionResult Store(int brokerScore = 0,
             string lawLevel = "0",
             string population = "0",
             bool roll = false,
             int? seed = null,
             string starport = "X",
             int streetwiseScore = 0,
             string techLevel = "0",
             string tradeCodes = null,
             string name = null)
        {
            var options = new StoreOptions()
            {
                BrokerScore = brokerScore,
                LawLevel = lawLevel,
                Population = population,
                Roll = roll,
                Seed = seed,
                Starport = starport,
                StreetwiseScore = streetwiseScore,
                TechLevel = techLevel,
                Name = (name == "") ? null : name
            };
            options.TradeCodes.AddRange((tradeCodes ?? "").Split(' '));


            var model = Global.EquipmentBuilder.AvailabilityTable(options);

            return View(model);

        }
        public Store AvailabilityTable(StoreOptions options)
        {
            var actualSeed = options.Seed ?? (new Random()).Next();
            var dice = new Dice(actualSeed);

            var result = new Store() { Options = options };

            foreach (var sectionXml in m_Book.Section)
            {
                var section = result.Sections.SingleOrDefault(s => s.Name == sectionXml.Name);
                if (section == null)
                {
                    section = new Section() { Name = sectionXml.Name };
                    result.Sections.Add(section);
                }

                foreach (var itemXml in sectionXml.Item)
                {
                    var item = new Item
                    {
                        Book = sectionXml.Book,
                        Category = (itemXml.Category > 0) ? itemXml.Category : sectionXml.Category,
                        Law = (itemXml.Law > 0) ? itemXml.Law : sectionXml.Law,
                        TechLevel = itemXml.TL,
                        Price = itemXml.PriceCredits,
                        Name = itemXml.Name,
                        Mod = itemXml.Mod,
                        Mass = itemXml.Mass
                    };

                    if (item.Category == 0)
                        item.Category = 1; //force a minimum category

                    var availabilityDM = 0;
                    if (string.Equals(item.Mod, "Specialized", OrdinalIgnoreCase))
                        availabilityDM += -1;
                    if (string.Equals(item.Mod, "Military", OrdinalIgnoreCase))
                        availabilityDM += -2;


                    var techDiff = options.TechLevel.Value - item.TechLevel;
                    if (techDiff < 0)
                        continue; //item is not avaiable.
                    else if (3 <= techDiff && techDiff <= 4) availabilityDM += -1;
                    else if (5 <= techDiff && techDiff <= 9) availabilityDM += -2;
                    else if (10 <= techDiff) availabilityDM += -4;


                    if (options.Starport == "A" || options.Starport == "B") availabilityDM += 1;
                    else if (options.Starport == "X") availabilityDM += -4;

                    if (options.TradeCodes.Contains("Hi", OrdinalIgnoreCase) || options.TradeCodes.Contains("Ht", OrdinalIgnoreCase) || options.TradeCodes.Contains("In", OrdinalIgnoreCase) || options.TradeCodes.Contains("Ri", OrdinalIgnoreCase)) availabilityDM += 2;
                    if (options.TradeCodes.Contains("Lt", OrdinalIgnoreCase) || options.TradeCodes.Contains("Na", OrdinalIgnoreCase) || options.TradeCodes.Contains("NI", OrdinalIgnoreCase) || options.TradeCodes.Contains("Po", OrdinalIgnoreCase)) availabilityDM += -2;

                    if (options.Population == 0) availabilityDM += -4;
                    else if (1 <= options.Population && options.Population <= 2) availabilityDM += -2;
                    else if (3 <= options.Population && options.Population <= 5) availabilityDM += -1;
                    else if (9 <= options.Population && options.Population <= 11) availabilityDM += 1;
                    else if (12 <= options.Population) availabilityDM += 2;

                    if (item.Law > 0 && options.LawLevel >= item.Law)
                    {
                        item.BlackMarket = true;

                        if (options.LawLevel == 0) availabilityDM += 2;
                        else if (1 <= options.LawLevel && options.LawLevel <= 3) availabilityDM += 1;
                        else if (4 <= options.LawLevel && options.LawLevel <= 6) availabilityDM += 0;
                        else if (7 <= options.LawLevel && options.LawLevel <= 9) availabilityDM += -1;
                        else if (10 <= options.LawLevel) availabilityDM += -2;

                        switch (item.Category)
                        {
                            case 1: availabilityDM += 4; item.Price *= 2; break;
                            case 2: availabilityDM += 2; item.Price *= 3; break;
                            case 3: availabilityDM += 0; item.Price *= 5; break;
                            case 4: availabilityDM += -2; item.Price *= 10; break;
                            case 5: availabilityDM += -4; item.Price *= 20; break;
                            case 6: availabilityDM += -6; item.Price *= 20; break;
                        }

                        item.SentencingDM = (options.LawLevel.Value - item.Law) + item.Category;
                    }

                    if (item.BlackMarket)
                        availabilityDM += options.StreetwiseScore;
                    else
                        availabilityDM += Math.Max(options.BrokerScore, options.StreetwiseScore);


                    item.Availability = 8 - availabilityDM;

                    if (!options.Roll)
                        section.Items.Add(item);
                    else
                    {
                        var roll = dice.D(2, 6) - item.Availability;
                        if (roll >= 0)
                        {
                            section.Items.Add(item);
                        }
                        else if (roll == -1)
                        {
                            item.Price *= 2;
                            section.Items.Add(item);
                        }
                        else if (roll == -2)
                        {
                            item.Price *= 3;
                            section.Items.Add(item);
                        }
                    }
                }
            }
            return result;
        }