Example #1
0
            public TestCase()
            {
                Universe = new Universe();

                Seller = new Corporation {Name = "Seller", Location = Universe };
                Buyer = new Corporation {Name = "Buyer", Location = Universe };

                var starCluster = new StarCluster();
                Universe.AddStarCluster(starCluster);

                var sol = new SolarSystem();
                starCluster.AddSolarSystem(sol);

                Refinery = new Refinery(sol, Seller);
                sol.OrbitSun(Refinery, 100d);

                var m1 = new Ship(Seller.Recruit()) {Name = "M1"};
                sol.EnterSystem(m1, Refinery.LocalCoordinates);
                Refinery.Dock(m1);

                var m2 = new Ship(Buyer.Recruit()) {Name = "M2"};
                sol.EnterSystem(m2, Refinery.LocalCoordinates);
                Refinery.Dock(m2);

                this.item = new Ore {Quantity = 1000, Location = Refinery, Owner = Seller};
            }
Example #2
0
        public void RefineOre()
        {
            Rand.Initialise(0);

            var universe = new Universe();
            var sol = new SolarSystem { Location = universe };

            var corporation = new Corporation() { Location = universe };
            var mPilot = corporation.Recruit();
            var tPilot = corporation.Recruit();

            var asteroidBelt = new AsteroidBelt(sol) {Richness = 100};
            sol.OrbitSun(asteroidBelt, 100d);

            var refinery = new Refinery(sol, corporation) {OreProcessedPerTick = 5, Efficiency = 2.5d };
            sol.OrbitSun(refinery, 200d);

            var manufactory = new Manufactory(sol, corporation);
            sol.OrbitSun(manufactory, 400d);

            var m1 = new Ship(mPilot) { Speed = 5d, CargoHoldSize = 100d, Name = "M1", UniversalCoordinates = refinery.UniversalCoordinates };
            refinery.Dock(m1);

            var t1 = new Ship(tPilot) { Speed = 5d, CargoHoldSize = 10d, Name = "T1", UniversalCoordinates = refinery.UniversalCoordinates };
            refinery.Dock(t1);

            var start = new ShipTask(asteroidBelt, (ship, target) => asteroidBelt.Mine(ship));
            start = start.Join(refinery, (ship, target) => refinery.UnloadOre(ship)).Join(start);

            refinery.Undock(m1, mPilot);
            m1.SetTask(start);

            start = new ShipTask(refinery, (ship, target) => { refinery.LoadRefinedOre(ship); return ship.Cargo.Count > 0 && ship.Cargo[0].Quantity > 50; });
            start = start.Join(manufactory, (ship, target) => manufactory.UnloadRefinedOre(ship)).Join(start);

            refinery.Undock(t1, tPilot);
            t1.SetTask(start);

            CollectionAssert.Contains(sol.Objects, m1);
            CollectionAssert.Contains(sol.Objects, t1);

            ulong tick = 0L;
            while ( manufactory.OreRemaining < 100 )
            {
                Assert.Less(tick, 1000, "Ssytem took more than 1000 days to complete the task.  {0:n0} products manufactured", manufactory.ProductCount);

                sol.Tick(tick);
                tick++;
            }

            Console.WriteLine("System took {0} days to manufacture {1:n0} items", tick, manufactory.ProductCount);
            Console.WriteLine("The refinery had {0:n0} unprocessed ore", refinery.UnrefinedOre);
            Console.WriteLine("The manufactory has {0:n0} unprocessed ore for building", manufactory.OreRemaining);
        }