Пример #1
0
        public Market.Market GetMarket(SystemBody body, string code)
        {
            string marketCode = string.Format("{0}/{1}/{2}", body.StarSystem.Coords, body.SystemBodyId, code);

            wrl.AcquireReaderLock(-1);
            try {
                if (markets.ContainsKey(marketCode))
                {
                    MarketManager_Entry ioM = markets[marketCode];
                    ioM.Stamp = DateTime.Now;
                    return(ioM.Market);
                }
                else
                {
                    LockCookie lc = wrl.UpgradeToWriterLock(-1);
                    try {
                        Market.Market       m   = new Market.Market(body, code);
                        MarketManager_Entry ioM = new MarketManager_Entry(m);
                        markets.Add(marketCode, ioM);
                        return(m);
                    } finally {
                        wrl.DowngradeFromWriterLock(ref lc);
                    }
                }
            } finally {
                wrl.ReleaseReaderLock();
            }
        }
        public void Awake()
        {
            _player = GetComponent <Player>();
            var marketGameObject = GameObject.FindGameObjectWithTag("Market");

            _market = marketGameObject.GetComponent <Market.Market>();
        }
Пример #3
0
        public Output(calculator.T2Builder t2mods, db.Db dataBase, Market.Market market, ApiImport.MainImport import)
        {
            StreamReader sr;

            using (StreamWriter sw = new StreamWriter("moduleNumbers.html"))
            {
                using (sr = new StreamReader("files\\htmloutputone.txt"))
                {
                    sw.WriteLine(sr.ReadToEnd());
                    OutputTableBuilder       otb = new OutputTableBuilder(dataBase, t2mods, sw, "T2Modules(and ships)");
                    IntermediaryTableBuilder itb = new IntermediaryTableBuilder(dataBase, t2mods, sw, "T2Components", import, market);
                    itb = new IntermediaryTableBuilder(dataBase, t2mods, sw, "T1modules", import, market);
                    itb = new IntermediaryTableBuilder(dataBase, t2mods, sw, "T1ships", import, market);
                    itb = new IntermediaryTableBuilder(dataBase, t2mods, sw, "Tools", import, market);

                    RawMaterialTableBuilder rmtb = new RawMaterialTableBuilder(dataBase, t2mods, market, sw, "Minerals", import);
                    rmtb = new RawMaterialTableBuilder(dataBase, t2mods, market, sw, "Planetary Interaction", import);
                    rmtb = new RawMaterialTableBuilder(dataBase, t2mods, market, sw, "Advanced Materials", import);
                }

                using (sr = new StreamReader("files\\htmloutputtwo.txt"))
                    sw.WriteLine(sr.ReadToEnd());
                sw.Close();
            }

            System.Diagnostics.Process.Start(@"moduleNumbers.html");

            new MarketInfo(dataBase, t2mods, import, market);
        }
Пример #4
0
        public Market.Market.MarketOperationResult Sell(int goodId, int quantity, Market.Market market)
        {
            int actQuantity = this.SpaceShip.CargoBay.GetGoods(goodId, quantity);
            var ret         = market[goodId].Sell(actQuantity);

            this.Money += ret.Money;

            return(ret);
        }
Пример #5
0
        public void TestMarketSigndown_01_Empty()
        {
            market = new Market.Market();
            List <Market.Underwriter> underwriters = new List <Market.Underwriter>();

            market.MarketSigndown(0, underwriters);


            Assert.IsTrue(underwriters.Count == 0, "Returned underwriters list is empty when imput list is empty too.");
        }
Пример #6
0
        public void TestMarketSigndown_01_Empty()
        {
            market = new Market.Market();
            List <Market.MarketElement> MarketElements = new List <Market.MarketElement>();

            market.MarketSigndown(0, MarketElements);


            Assert.IsTrue(MarketElements.Count == 0, "Returned MarketElements list is empty when imput list is empty too.");
        }
Пример #7
0
        public T2Builder(db.Db dataBase_, Market.Market market)
            : base(market, dataBase_)
        {
            this.market         = market;
            t1Modules           = new long[256, 2];    // categoryid=7
            t1ships             = new long[256, 2];    // categoryid=6
            planetaryComodities = new long[256, 2];    // categoryid=43
            tools    = new long[256, 2];               // groupid=332
            minerals = new long[256, 2];               // groupid=18
            constructionComponents = new long[256, 2]; // groupid=334
            compopsites            = new long[256, 2]; // groupip=429

            dataBase      = dataBase_;
            moduleMats    = new int[dataBase.t2bpoOwned.Index()][, ];
            moduleAmounts = new int[dataBase.t2bpoOwned.Index()];

            output           = new int[dataBase.t2bpoOwned.Index(), 2];
            outputName       = new string[dataBase.t2bpoOwned.Index()];
            outputTotalValue = new decimal[dataBase.t2bpoOwned.Index()];
            outputTotalCost  = new decimal[dataBase.t2bpoOwned.Index()];

            int i = 0;

            while (i < dataBase.t2bpoOwned.Index()) // adds amounts
            {
                int bpoid = dataBase.t2bpoOwned.Bpo(i);
                moduleAmounts[i] = GetBuildAmount(bpoid);

                moduleMats[i]    = dataBase.bpo.ManufacturingMats(bpoid);
                materialModifier = MaterialModifier();

                int[,] bpoOutput    = dataBase.bpo.ManufacturingOutput(bpoid);
                output[i, 0]        = bpoOutput[0, 0]; output[i, 1] = bpoOutput[0, 1] * moduleAmounts[i];
                outputName[i]       = dataBase.types.TypeName(output[i, 0]);
                outputTotalValue[i] = output[i, 1] * market.FindPrice(dataBase.settings.MarketRegion, "sell", output[i, 0]);
                int j = 0;
                while (j < (moduleMats[i].Length / 2))
                {
                    if (moduleMats[i][j, 1] == 1)
                    {
                        moduleMats[i][j, 1] = Convert.ToInt32(Math.Ceiling(moduleMats[i][j, 1] * moduleAmounts[i] * 1.0));
                    }
                    else
                    {
                        moduleMats[i][j, 1] = Convert.ToInt32(Math.Ceiling(moduleMats[i][j, 1] * moduleAmounts[i] * materialModifier));
                    }
                    j++;
                }
                //test variable
                decimal installcost = FindInstallCost(bpoid) * moduleAmounts[i];
                outputTotalCost[i] = SortMaterials(moduleMats[i]) + installcost;
                i++;
            }
            TotalModuleMaterials();
        }
Пример #8
0
        public void TestMarketSigndown_02_Simple_Example_NoMins1()
        {
            // test the trivial case.
            market = new Market.Market();
            List <Market.Underwriter> listUWs = new List <Market.Underwriter>();

            listUWs.Add(new Market.Underwriter(10, "Sponge Bob", 40, 30, 0));
            listUWs.Add(new Market.Underwriter(20, "Patrick Star", 60, 20, 0));

            listUWs = market.MarketSigndown(100, listUWs);

            assertSignedLine(listUWs, "Sponge Bob", 40f);
            assertSignedLine(listUWs, "Patrick Star", 60f);
        }
Пример #9
0
        public void TestMarketSigndown_08_Mins3_UW2GetsMinSoTheRestForUW1()
        {
            // test the trivial case.
            market = new Market.Market();
            List <Market.Underwriter> listUWs = new List <Market.Underwriter>();

            listUWs.Add(new Market.Underwriter(10, "Sponge Bob", 80, 20, 0));
            listUWs.Add(new Market.Underwriter(20, "Patrick Star", 90, 70, 0));

            listUWs = market.MarketSigndown(100, listUWs);

            assertSignedLine(listUWs, "Sponge Bob", 30f);
            assertSignedLine(listUWs, "Patrick Star", 70f);
        }
Пример #10
0
        public void TestMarketSigndown_03_Simple_Example_NoMins_TotalOrderNot100()
        {
            //
            market = new Market.Market();
            List <Market.Underwriter> listUWs = new List <Market.Underwriter>();

            listUWs.Add(new Market.Underwriter(10, "Sponge Bob", 30, 0, 0));
            listUWs.Add(new Market.Underwriter(20, "Patrick Star", 30, 0, 0));

            listUWs = market.MarketSigndown(60, listUWs);

            assertSignedLine(listUWs, "Sponge Bob", 30f);
            assertSignedLine(listUWs, "Patrick Star", 30f);
        }
Пример #11
0
        public void TestMarketSigndown_02_Simple_Example_NoMins1()
        {
            // test the trivial case.
            market = new Market.Market();
            List <Market.MarketElement> listUWs = new List <Market.MarketElement>
            {
                new Market.MarketElement(10, "Element 1", 40, 30, 0),
                new Market.MarketElement(20, "Element 2", 60, 20, 0)
            };

            listUWs = market.MarketSigndown(100, listUWs);

            AssertSignedLine(listUWs, "Element 1", 40f);
            AssertSignedLine(listUWs, "Element 2", 60f);
        }
Пример #12
0
        public void TestMarketSigndown_08_Mins3_UW2GetsMinSoTheRestForUW1()
        {
            // test the trivial case.
            market = new Market.Market();
            List <Market.MarketElement> listUWs = new List <Market.MarketElement>
            {
                new Market.MarketElement(10, "Element 1", 80, 20, 0),
                new Market.MarketElement(20, "Element 2", 90, 70, 0)
            };

            listUWs = market.MarketSigndown(100, listUWs);

            AssertSignedLine(listUWs, "Element 1", 30f);
            AssertSignedLine(listUWs, "Element 2", 70f);
        }
Пример #13
0
        public void TestMarketSigndown_03_Simple_Example_NoMins_TotalOrderNot100()
        {
            //
            market = new Market.Market();
            List <Market.MarketElement> listUWs = new List <Market.MarketElement>
            {
                new Market.MarketElement(10, "Element 1", 30, 0, 0),
                new Market.MarketElement(20, "Element 2", 30, 0, 0)
            };

            listUWs = market.MarketSigndown(60, listUWs);

            AssertSignedLine(listUWs, "Element 1", 30f);
            AssertSignedLine(listUWs, "Element 2", 30f);
        }
Пример #14
0
        public void TestMarketSigndown_10_Mins5_MinimumsAreTheSolution()
        {
            // test the trivial case.
            market = new Market.Market();
            List <Market.Underwriter> listUWs = new List <Market.Underwriter>();

            listUWs.Add(new Market.Underwriter(10, "Sponge Bob", 80, 34, 0));
            listUWs.Add(new Market.Underwriter(20, "Patrick Star", 90, 33, 0));
            listUWs.Add(new Market.Underwriter(30, "Squidward Tentacles", 40, 33, 0));

            listUWs = market.MarketSigndown(100, listUWs);

            assertSignedLine(listUWs, "Sponge Bob", 34f);
            assertSignedLine(listUWs, "Patrick Star", 33f);
            assertSignedLine(listUWs, "Squidward Tentacles", 33f);
        }
Пример #15
0
        public void TestMarketSigndown_09_Mins4_SortUWsBySequenceNumber()
        {
            // test the trivial case.
            market = new Market.Market();
            List <Market.Underwriter> listUWs = new List <Market.Underwriter>();

            listUWs.Add(new Market.Underwriter(10, "Sponge Bob", 80, 20, 0));
            listUWs.Add(new Market.Underwriter(20, "Patrick Star", 90, 50, 0));
            listUWs.Add(new Market.Underwriter(30, "Squidward Tentacles", 40, 20, 0));

            listUWs = market.MarketSigndown(100, listUWs);

            assertSignedLine(listUWs, "Sponge Bob", 30f);
            assertSignedLine(listUWs, "Patrick Star", 50f);
            assertSignedLine(listUWs, "Squidward Tentacles", 20f);
        }
Пример #16
0
        public void TestMarketSigndown_07_Mins2_2DecimalPlaces_SameResultsAsTest06()
        {
            // test the trivial case.
            market = new Market.Market();
            List <Market.Underwriter> listUWs = new List <Market.Underwriter>();

            listUWs.Add(new Market.Underwriter(10, "Sponge Bob", 80, 20, 0));
            listUWs.Add(new Market.Underwriter(20, "Patrick Star", 90, 40, 0));
            listUWs.Add(new Market.Underwriter(30, "Squidward Tentacles", 40, 20, 0));

            listUWs = market.MarketSigndown(100, listUWs);

            assertSignedLine(listUWs, "Sponge Bob", 37.65f);
            assertSignedLine(listUWs, "Patrick Star", 42.35f);
            assertSignedLine(listUWs, "Squidward Tentacles", 20f);
        }
Пример #17
0
        public void TestMarketSigndown_05_Simple_Example_NoMins3()
        {
            // test the trivial case.
            market = new Market.Market();
            List <Market.Underwriter> listUWs = new List <Market.Underwriter>();

            listUWs.Add(new Market.Underwriter(10, "Sponge Bob", 80, 0, 0));
            listUWs.Add(new Market.Underwriter(20, "Patrick Star", 40, 0, 0));
            listUWs.Add(new Market.Underwriter(30, "Squidward Tentacles", 40, 0, 0));

            listUWs = market.MarketSigndown(50, listUWs);

            assertSignedLine(listUWs, "Sponge Bob", 25f);
            assertSignedLine(listUWs, "Patrick Star", 12.5f);
            assertSignedLine(listUWs, "Squidward Tentacles", 12.5f);
        }
Пример #18
0
        public void TestMarketSigndown_06_Mins1_AsPerExcel_Example()
        {
            // test the trivial case.
            market = new Market.Market();
            List <Market.Underwriter> listUWs = new List <Market.Underwriter>();

            listUWs.Add(new Market.Underwriter(10, "Sponge Bob", 80, 10, 0));
            listUWs.Add(new Market.Underwriter(20, "Patrick Star", 90, 10, 0));
            listUWs.Add(new Market.Underwriter(30, "Squidward Tentacles", 40, 20, 0));

            listUWs = market.MarketSigndown(100, listUWs);

            assertSignedLine(listUWs, "Sponge Bob", 37.65f);
            assertSignedLine(listUWs, "Patrick Star", 42.35f);
            assertSignedLine(listUWs, "Squidward Tentacles", 20f);
        }
Пример #19
0
        public void TestMarketSigndown_06_Mins1_AsPerExcel_Example()
        {
            // test the trivial case.
            market = new Market.Market();
            List <Market.MarketElement> listUWs = new List <Market.MarketElement>
            {
                new Market.MarketElement(10, "Element 1", 80, 10, 0),
                new Market.MarketElement(20, "Element 2", 90, 10, 0),
                new Market.MarketElement(30, "Element 3", 40, 20, 0)
            };

            listUWs = market.MarketSigndown(100, listUWs);

            AssertSignedLine(listUWs, "Element 1", 37.65f);
            AssertSignedLine(listUWs, "Element 2", 42.35f);
            AssertSignedLine(listUWs, "Element 3", 20f);
        }
Пример #20
0
        public void TestMarketSigndown_07_Mins2_2DecimalPlaces_SameResultsAsTest06()
        {
            // test the trivial case.
            market = new Market.Market();
            List <Market.MarketElement> listUWs = new List <Market.MarketElement>
            {
                new Market.MarketElement(10, "Element 1", 80, 20, 0),
                new Market.MarketElement(20, "Element 2", 90, 40, 0),
                new Market.MarketElement(30, "Element 3", 40, 20, 0)
            };

            listUWs = market.MarketSigndown(100, listUWs);

            AssertSignedLine(listUWs, "Element 1", 37.65f);
            AssertSignedLine(listUWs, "Element 2", 42.35f);
            AssertSignedLine(listUWs, "Element 3", 20f);
        }
Пример #21
0
        public void TestMarketSigndown_09_Mins4_SortUWsBySequenceNumber()
        {
            // test the trivial case.
            market = new Market.Market();
            List <Market.MarketElement> listUWs = new List <Market.MarketElement>
            {
                new Market.MarketElement(10, "Element 1", 80, 20, 0),
                new Market.MarketElement(20, "Element 2", 90, 50, 0),
                new Market.MarketElement(30, "Element 3", 40, 20, 0)
            };

            listUWs = market.MarketSigndown(100, listUWs);

            AssertSignedLine(listUWs, "Element 1", 30f);
            AssertSignedLine(listUWs, "Element 2", 50f);
            AssertSignedLine(listUWs, "Element 3", 20f);
        }
Пример #22
0
        public void TestMarketSigndown_10_Mins5_MinimumsAreTheSolution()
        {
            // test the trivial case.
            market = new Market.Market();
            List <Market.MarketElement> listUWs = new List <Market.MarketElement>
            {
                new Market.MarketElement(10, "Element 1", 80, 34, 0),
                new Market.MarketElement(20, "Element 2", 90, 33, 0),
                new Market.MarketElement(30, "Element 3", 40, 33, 0)
            };

            listUWs = market.MarketSigndown(100, listUWs);

            AssertSignedLine(listUWs, "Element 1", 34f);
            AssertSignedLine(listUWs, "Element 2", 33f);
            AssertSignedLine(listUWs, "Element 3", 33f);
        }
Пример #23
0
        public void TestMarketSigndown_05_Simple_Example_NoMins3()
        {
            // test the trivial case.
            market = new Market.Market();
            List <Market.MarketElement> listUWs = new List <Market.MarketElement>
            {
                new Market.MarketElement(10, "Element 1", 80, 0, 0),
                new Market.MarketElement(20, "Element 2", 40, 0, 0),
                new Market.MarketElement(30, "Element 3", 40, 0, 0)
            };

            listUWs = market.MarketSigndown(50, listUWs);

            AssertSignedLine(listUWs, "Element 1", 25f);
            AssertSignedLine(listUWs, "Element 2", 12.5f);
            AssertSignedLine(listUWs, "Element 3", 12.5f);
        }
Пример #24
0
        public IntermediateBuilder(long[,] buildlist, db.Db data, string rigGroup, Market.Market market)
            : base(market, data)
        {
            this.market = market;
            rigTypeUsed = rigGroup;
            dataBase    = data;
            int i = 0;

            moduleMats = new long[buildlist.Length / 2][, ];
            while (i < (buildlist.Length / 2))
            {
                //  buildlist[i, 0] = FindBpoTypeIdForItem(Convert.ToInt32(buildlist[i, 0]));
                i++;
            }
            moduleMats = GetMaterialBill(buildlist);
            totalMats  = TotalModuleMaterials(moduleMats);
            costOfMats = FindCosts(totalMats);
        }
Пример #25
0
        int[,] compopsites; //advanced materials

        public Calculator()
        {
            Console.WriteLine("..Loading the database...");
            dataBase = new db.Db();
            Console.WriteLine("..Done loading the database");
            Console.WriteLine("..Authenticating with SSO...");
            new ESI.Login(ESI.CharacterEnum.BuildCorp);
            new ESI.Login(ESI.CharacterEnum.EmpireDonkey);
            Console.WriteLine("..Done authenticating");
            Console.WriteLine("..Importing API's...");
            apiImports = new ApiImport.MainImport();
            Console.WriteLine("..Done importing API's");
            Console.WriteLine("..Generating the market Class...");
            market = new Market.Market(dataBase);
            Console.WriteLine("..Done generating the market class");
            Console.WriteLine("..Calculates t2 production...");
            T2Builder t2mods = new T2Builder(dataBase, market);

            Console.WriteLine("..Done calculating t2 production");
            Console.WriteLine("..Generates output files...");
            Output.Output output = new Output.Output(t2mods, dataBase, market, apiImports);
            Console.WriteLine("..Done generating output files");
        }
Пример #26
0
        public Market.Market.MarketOperationResult Buy(int goodId, int quantity, Market.Market market)
        {
            if (quantity > this.SpaceShip.CargoBay.FreeSpace)
            {
                quantity = this.SpaceShip.CargoBay.FreeSpace;
            }

            int price = market[goodId].Price * quantity;

            if (price < Money)
            {
                var ret = market[goodId].Buy(quantity);
                this.SpaceShip.CargoBay.StoreGoods(goodId, ret.Quantity);
                return(ret);
            }
            else
            {
                int payableQuant = (int)Money / market[goodId].Price;
                var ret          = market[goodId].Buy(payableQuant);
                this.SpaceShip.CargoBay.StoreGoods(goodId, ret.Quantity);
                return(ret);
            }
        }
Пример #27
0
 public MarketManager_Entry(Market.Market market)
 {
     this.Market = market;
     this.Stamp  = DateTime.Now;
 }
Пример #28
0
        protected long[,] compopsites; //advanced materials

        public ProductionMethods(Market.Market market, db.Db dataBase)
        {
            this.dataBase = dataBase;
            this.market   = market;
        }
Пример #29
0
        public MarketInfo(db.Db dataBase, calculator.T2Builder t2mods, ApiImport.MainImport import, Market.Market market)
        {
            using (StreamWriter sw = new StreamWriter("marketInfo.txt"))
            {
                var office = import.ESIbuildCorpAssets.GetContainer(1022964286749);
                int i      = 0;

                sw.WriteLine("Name" + "\t" + "Buildcost" + "\t" + "Haulingcost" + "\t" + "Market sell" + "\t" + "Amount on market" + "\t" + "Stock in xanadu" + "\t" + "Stock in chanuur"
                             + "\t" + "Order price" + "\t" + "Avg daily volume" + "\t" + "Item category" + "\t" + "Max output");
                while (i < t2mods.OutputName.Length)
                {
                    decimal itemCost       = t2mods.OutputTotalCost[i] / t2mods.Output[i, 1];
                    decimal haulingCost    = dataBase.types.GetRepackagedVolume(t2mods.Output[i, 0]) * 800;
                    decimal marketSell     = market.FindPrice(dataBase.settings.MarketRegion, "sell", t2mods.Output[i, 0]);
                    decimal sellOrderPrize = import.ESIcorpMarketOrders.SellOrderPrice(t2mods.Output[i, 0]);
                    sw.WriteLine(
                        t2mods.OutputName[i]                                                                                                //name
                        + "\t" + itemCost.ToString(StaticInfo.ci)                                                                           //cost per item
                        + "\t" + haulingCost.ToString(StaticInfo.ci)                                                                        // hauling cost per item (800 is ITL's price per m3 from delve to jita, hardcoding it because im lazy
                        + "\t" + marketSell.ToString(StaticInfo.ci)                                                                         // gets the sale value of the item
                        + "\t" + import.ESIcorpMarketOrders.ItemsOnMarket(t2mods.Output[i, 0])                                              //amount we have on the market
                        + "\t" + import.ESIempireDonkey.FindItem(t2mods.Output[i, 0])                                                       // amount on Reluah
                        + "\t" + office.FindItem(t2mods.Output[i, 0])                                                                       // ammount on chanuur
                        + "\t" + sellOrderPrize.ToString(StaticInfo.ci)                                                                     // value of our sell order
                        + "\t" + market.FindAverageVolume(dataBase.settings.MarketRegion, t2mods.Output[i, 0], 30)                          // average volume sold per day(last 30 days)
                        + "\t" + dataBase.categoryIDs.GetName(dataBase.groupIDs.CategoryID(dataBase.types.GroupID(t2mods.Output[i, 0])), 0) // items category
                        + "\t" + t2mods.Output[i, 1]                                                                                        //amount of items produced per cycle
                        );
                    i++;
                }
                sw.WriteLine("market orders cached until" + "\t" + import.ESIcorpMarketOrders.CachedUntil);
                sw.WriteLine("build corp assets cached until" + "\t" + import.ESIbuildCorpAssets.CachedUntil);
                sw.WriteLine("empire donkey corp assets cached until" + "\t" + import.ESIempireDonkey.CachedUntil);
                sw.Close();
            }
            System.Diagnostics.Process.Start(@"marketInfo.txt");
        }
Пример #30
0
        public RawMaterialTableBuilder(db.Db dataBase, calculator.T2Builder t2builder, Market.Market market, StreamWriter sw, string tableName, ApiImport.MainImport import)
        {
            var office = import.ESIbuildCorpAssets.GetContainer(1022964286749);

            long[,] materials = new long[1, 1];
            if (tableName == "Minerals")
            {
                materials = t2builder.GetGroup(4);
            }
            else if (tableName == "Planetary Interaction")
            {
                materials = t2builder.GetGroup(2);
            }
            else if (tableName == "Advanced Materials")
            {
                materials = t2builder.GetGroup(6);
            }
            string[] names = new string[materials.Length / 2];
            int      i     = 0;

            while (i < names.Length)
            {
                names[i] = dataBase.types.TypeName(materials[i, 0]);
                i++;
            }

            sw.WriteLine("<table>");
            sw.WriteLine("<caption><b>" + tableName + "</b></caption>");
            sw.WriteLine("<tr><td>Name</td><td>Needed</td><td>Have</td><td>Lacking</td><td>Value</td></tr>");
            i = 0;
            decimal totalValue = 0;

            while (i < names.Length)
            {
                long    need = materials[i, 1];
                long    have = office.FindItem(Convert.ToInt32(materials[i, 0]));
                long    lacking;
                decimal value = 0;
                if (have - need >= 0)
                {
                    lacking = 0;
                }
                else
                {
                    lacking = need - have;
                    value   = market.FindPrice("the forge", "buy", materials[i, 0]) * lacking; totalValue += value;
                }
                sw.WriteLine("<tr><td>" + names[i] + "</td><td>" +
                             string.Format("{0:n0}", need) + "</td><td>" +
                             string.Format("{0:n0}", have) + "</td><td>" +
                             string.Format("{0:n0}", lacking) + "</td><td>" +
                             string.Format("{0:n0}", value) + "</td></tr>");
                i++;
            }
            sw.WriteLine("<tr><td><b>Sum</b></td><td></td><td><b>" +
                         null + "</b></td><td><b>" +
                         null + "</b></td><td><b>" +
                         string.Format("{0:n0}", totalValue) + "</b></td></tr>");
            sw.WriteLine("</table>");
        }