Esempio n. 1
0
        public void SolutionModify()
        {
            var    item1 = new Item("a");
            var    item2 = new Item("b");
            Recipe r     = new Recipe("");

            r.AddIngredient(new ItemAmount(item1, 1));
            r.AddResult(new ItemAmount(item2, 1));
            r.CraftingCategory = "test";

            Building b = new Building("");

            b.AddCraftingCategory("test");
            b.IngredientCount = 4;
            b.ProductionSpeed = 1;

            Library l = new Library();

            l.AddItem(item1);
            l.AddItem(item2);
            l.AddRecipe(r);
            l.AddBuilding(b);
            l.Initialize();

            var coarseGraph = RecipeGraph.FromLibrary(l, new Item[] { item1 }, new ItemAmount[] { new ItemAmount(item2, 0.01) }, (a) => 1);
            var denseGraph  = TrivialSolutionFactory.CreateFactory(coarseGraph);

            var parameters = SolutionParameters.FromFactory(12, 12, denseGraph);

            Assert.AreEqual(parameters, parameters.Modify(0));
        }
Esempio n. 2
0
        public void RouteSink()
        {
            SolidRouter r = new SolidRouter(
                new Building("belt"),
                new Building("beltground3"),
                new Building("beltground2"),
                new Building("beltground1"),

                new Building("inserter1"),
                new Building("inserter2"),
                new Building("longInserter"),
                new Building("basic-splitter"),

                new SolutionGrader()
                );

            Building assembler = new Building("assembler");

            assembler.Size            = new Vector2(3, 3);
            assembler.IngredientCount = 3;
            assembler.ProductionSpeed = 1;
            assembler.AddCraftingCategory("test");
            Recipe recipe = new Recipe("dummy");

            recipe.CraftingCategory = "test";
            Item item = new Item("dummy");

            Library l = new Library();

            l.AddBuilding(assembler);
            l.AddItem(item);
            l.AddRecipe(recipe);

            l.Initialize();

            Searchspace s        = new Searchspace(new Vector2(13, 10));
            var         physical = new ProductionBuilding(recipe, 1, assembler, new Vector2(7, 3), BuildingRotation.North);

            s = s.AddComponent(physical);

            var dict = new Dictionary <ProductionStep, Tuple <Vector2, BuildingRotation> >();

            dict.Add(physical, new Tuple <Vector2, BuildingRotation>(physical.Position, physical.Rotation));
            var param = new SolutionParameters(13, 10, ImmutableDictionary <SourceStep, Vector2> .Empty, ImmutableDictionary <SinkStep, Vector2> .Empty, dict.ToImmutableDictionary(), ImmutableList <Tuple <IStep, Item, bool> > .Empty);

            var dests = SolutionGenerator.BuildingToPlaceables(physical, param);

            var result = r.Route(new ItemAmount(item, 0.01), s, dests, new RoutingCoordinate[] { new RoutingCoordinate(new Vector2(7, 9), RoutingCoordinate.CoordinateType.Belt, BuildingRotation.South) });
        }
Esempio n. 3
0
        public void TestRotations()
        {
            Building b = new Building("test");

            b.Size = Vector2.One * 3;
            b.AddCraftingCategory("test");
            b.ProductionSpeed = 2;
            b.IngredientCount = 3;
            b.AddFluidBox(new FluidBox(true, Vector2.Zero));

            Recipe r = new Recipe("test");

            r.CraftingCategory = "test";

            var phys1 = new ProductionBuilding(r, 1, b, Vector2.Zero, BuildingRotation.North);
            var phys2 = new ProductionBuilding(r, 1, b, Vector2.Zero, BuildingRotation.East);
            var phys3 = new ProductionBuilding(r, 1, b, Vector2.Zero, BuildingRotation.South);
            var phys4 = new ProductionBuilding(r, 1, b, Vector2.Zero, BuildingRotation.West);

            Assert.AreEqual(Vector2.Zero, phys1.FluidBoxes.First().Position);
            Assert.AreEqual(new Vector2(2, 0), phys2.FluidBoxes.First().Position);
            Assert.AreEqual(new Vector2(2, 2), phys3.FluidBoxes.First().Position);
            Assert.AreEqual(new Vector2(0, 2), phys4.FluidBoxes.First().Position);
        }
Esempio n. 4
0
        private IEnumerable <Building> ParseEntities(LuaTable entities)
        {
            foreach (var entitylist in entities.Values.OfType <LuaTable>())
            {
                foreach (var entity in entitylist.Values.OfType <LuaTable>())
                {
                    //HACK: try to find a better way to select only entities
                    if (!entity.ContainsKey("icon") || (string)entity["type"] == "technology")
                    {
                        continue;
                    }

                    var name = entity["name"] as string;

                    var result = new Building(name);
                    result.IconPath = ((string)entity["icon"]).Replace("__base__", AppDataFolder.FullName);

                    if (entity.ContainsKey("selection_box"))
                    {
                        var selectionBox = entity["selection_box"] as LuaTable;
                        var v1           = (selectionBox[1.0] as LuaTable).ToVector2();
                        var v2           = (selectionBox[2.0] as LuaTable).ToVector2();
                        result.Size = v2 - v1;
                        result.Size = new Vector2(Math.Ceiling(result.Size.X), Math.Ceiling(result.Size.Y));
                    }

                    if (entity.ContainsKey("fluid_boxes"))
                    {
                        var boxes = entity["fluid_boxes"] as LuaTable;

                        foreach (KeyValuePair <Object, Object> pair in boxes)
                        {
                            if (pair.Key.Equals("off_when_no_fluid_recipe"))
                            {
                                result.HidesFluidBox = (bool)pair.Value;
                            }
                            else
                            {
                                var values = pair.Value as LuaTable;
                                var center = (result.Size - Vector2.One) / 2;
                                result.AddFluidBox(new FluidBox(
                                                       (values["production_type"] as string).Equals("output", StringComparison.OrdinalIgnoreCase),
                                                       (((values["pipe_connections"] as LuaTable)[1.0] as LuaTable)["position"] as LuaTable).ToVector2() + center
                                                       ));
                            }
                        }
                    }

                    if (entity.ContainsKey("crafting_categories"))
                    {
                        var categories = entity["crafting_categories"] as LuaTable;
                        foreach (var cat in categories.Values.OfType <string>())
                        {
                            result.AddCraftingCategory(cat);
                        }
                        if (result.CraftingCategories.Contains("smelting"))
                        {
                            result.IngredientCount = 1;
                        }
                    }

                    if (entity.ContainsKey("crafting_speed"))
                    {
                        result.ProductionSpeed = (double)entity["crafting_speed"];
                    }

                    if (entity.ContainsKey("ingredient_count"))
                    {
                        result.IngredientCount = (int)((double)entity["ingredient_count"]);
                    }

                    if (entity.ContainsKey("energy_source"))
                    {
                        var source = entity["energy_source"] as LuaTable;

                        double efficiency = 1;
                        result.EnergySource = (EnergySource)Enum.Parse(typeof(EnergySource), source["type"] as string, true);

                        if (result.EnergySource == EnergySource.Burner)
                        {
                            if (source.ContainsKey("effectivity"))
                            {
                                efficiency = (double)source["effectivity"];
                            }
                        }

                        if (entity.ContainsKey("energy_usage"))
                        {
                            result.Energy = ParseEnergy(entity["energy_usage"] as string) / efficiency;
                        }
                        else if (source.ContainsKey("drain"))
                        {
                            result.Energy = ParseEnergy(source["drain"] as string) / efficiency;
                        }
                        else if (entity.Keys.OfType <string>().Where((s) => s.StartsWith("energy_per_")).Any())
                        {
                            string key    = entity.Keys.OfType <string>().Where((s) => s.StartsWith("energy_per_")).First();
                            string energy = entity[key] as string;
                            if (!string.IsNullOrWhiteSpace(energy))
                            {
                                result.Energy = ParseEnergy(energy);
                            }
                            else
                            {
                                result.Energy = (double)entity[key];
                            }
                        }
                    }

                    yield return(result);
                }
            }
        }