Example #1
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);
        }
Example #2
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);
                }
            }
        }