public override void OnLoad(Harmony harmony)
        {
            BuildingUtils.AddBuildingToPlanScreen(GameStrings.PlanMenuCategory.Base, ItemPermeableTileConfig.ID);

            LocString.CreateLocStringKeys(typeof(STRINGS), null);
            base.OnLoad(harmony);
        }
 public static void Postfix()
 {
     BuildingUtils.AddBuildingToTechnology(
         GameStrings.Technology.Power.AdvancedPowerRegulation,
         SmallTransformerConfig.Id
         );
 }
 public static void Postfix()
 {
     BuildingUtils.AddBuildingToTechnology(
         GameStrings.Technology.Liquids.Sanitation,
         ItemPermeableTileConfig.ID
         );
 }
Example #4
0
 public static void Setup()
 {
     BuildingUtils.AddStrings(ID,
                              "Tall Pneumatic Door",
                              STRINGS.BUILDINGS.PREFABS.DOOR.DESC,
                              STRINGS.BUILDINGS.PREFABS.DOOR.EFFECT);
     BuildingUtils.AddBuilding(ID, "Base", DoorConfig.ID);
 }
Example #5
0
 public static void Setup()
 {
     BuildingUtils.AddStrings(ID,
                              "Space Ladder",
                              "Slippery when wet.",
                              "Extremely resistant to damage.");
     BuildingUtils.AddBuilding(ID, "Base", LadderConfig.ID, "BasicRocketry");
 }
Example #6
0
 public static void Setup()
 {
     BuildingUtils.AddStrings(ID,
                              "Space Glass",
                              "A remarkable alloy, transparent to light and Space Scanners, opaque to fluids and meteors. Repels water. Still attracts fingerprints and dust.",
                              "Can withstand extreme pressures and impacts. Allows " + STRINGS.UI.FormatAsLink("Light", "LIGHT") + " and " + STRINGS.UI.FormatAsLink("Decor", "DECOR") + " to pass through.");
     BuildingUtils.AddBuilding(ID, "Base", GlassTileConfig.ID, "SkyDetectors");
 }
Example #7
0
        public static void Postfix()
        {
            BuildingUtils.AddBuildingToPlanScreen(GermicideLampConfig.ID, GameStrings.PlanMenuCategory.Utilities);
            BuildingUtils.AddBuildingToPlanScreen(CeilingGermicideLampConfig.ID, GameStrings.PlanMenuCategory.Utilities);

            BuildingUtils.AddBuildingToTech(GermicideLampConfig.ID, GameStrings.Technology.Medicine.PathogenDiagnostics);
            BuildingUtils.AddBuildingToTech(CeilingGermicideLampConfig.ID, GameStrings.Technology.Medicine.PathogenDiagnostics);
        }
Example #8
0
 public static void Setup()
 {
     BuildingUtils.AddStrings(ID,
                              "Rocket Door",
                              STRINGS.BUILDINGS.PREFABS.BUNKERDOOR.DESC + " Perfectly sized for rockets.",
                              STRINGS.BUILDINGS.PREFABS.BUNKERDOOR.EFFECT);
     BuildingUtils.AddBuilding(ID, "Base", DoorConfig.ID, "EnginesI");
 }
Example #9
0
 internal static void Setup()
 {
     BuildingUtils.AddStrings(ID,
                              "Space Mesh",
                              "Nikola tried to teach me how this works, but I'm pretty sure it's just magic.",
                              "Resists " + STRINGS.UI.FormatAsLink("gas", "ELEMENTS_GAS") + " flow without obstructing " + STRINGS.UI.FormatAsLink("liquids", "ELEMENTS_LIQUID") + ". Falling liquids may force gas up into and through this block. ");
     BuildingUtils.AddBuilding(ID, "Base", GasPermeableMembraneConfig.ID, "Jetpacks");
 }
Example #10
0
 public static void Setup()
 {
     BuildingUtils.AddStrings(ID,
                              "Artifact Bin",
                              "Of what, then, is an empty launchpad a sign? - Abe",
                              "Stores up to 50 space artifacts. Use caution when emptying.");
     BuildingUtils.AddBuilding(ID, "Base", StorageLockerConfig.ID, "CargoI");
 }
 internal static void Setup()
 {
     BuildingUtils.AddStrings(ID,
                              "Artifact Pedestal",
                              "Ergonomic!",
                              "A display " + STRINGS.UI.FormatAsLink("Pedestal", ItemPedestalConfig.ID) + " specifically designed for space artifacts.");
     BuildingUtils.AddBuilding(ID, "Furniture", ItemPedestalConfig.ID, "Artistry");
 }
Example #12
0
 public static void Postfix()
 {
     BuildingUtils.AddBuildingToPlanScreen(ThresholdWallConfig.ID, GameStrings.PlanMenuCategory.Utilities);
     BuildingUtils.AddBuildingToPlanScreen(CautionThresholdWallConfig.ID, GameStrings.PlanMenuCategory.Utilities);
     BuildingUtils.AddBuildingToPlanScreen(MetalThresholdWallConfig.ID, GameStrings.PlanMenuCategory.Utilities);
     BuildingUtils.AddBuildingToTech(CautionThresholdWallConfig.ID, GameStrings.Technology.Exosuits.HazardProtection);
     BuildingUtils.AddBuildingToTech(ThresholdWallConfig.ID, GameStrings.Technology.Decor.HomeLuxuries);
     BuildingUtils.AddBuildingToTech(MetalThresholdWallConfig.ID, GameStrings.Technology.SolidMaterial.RefinedRenovations);
 }
        public void RenderAfterWorld(WorldRenderer wr, World world)
        {
            var position = wr.Position(wr.Viewport.ViewToWorldPx(Viewport.LastMousePos)).ToCPos();
            var topLeft  = position - FootprintUtils.AdjustForBuildingSize(BuildingInfo);

            var actorInfo = Rules.Info[Building];

            foreach (var dec in actorInfo.Traits.WithInterface <IPlaceBuildingDecoration>())
            {
                dec.Render(wr, world, actorInfo, position.CenterPosition);                      /* hack hack */
            }
            var cells = new Dictionary <CPos, bool>();

            // Linebuild for walls.
            // Assumes a 1x1 footprint; weird things will happen for other footprints
            if (Rules.Info[Building].Traits.Contains <LineBuildInfo>())
            {
                foreach (var t in BuildingUtils.GetLineBuildCells(world, topLeft, Building, BuildingInfo))
                {
                    cells.Add(t, BuildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, Building, t));
                }
            }
            else
            {
                if (!initialized)
                {
                    var rbi     = Rules.Info[Building].Traits.Get <RenderBuildingInfo>();
                    var palette = rbi.Palette ?? (Producer.Owner != null ?
                                                  rbi.PlayerPalette + Producer.Owner.InternalName : null);

                    preview     = rbi.RenderPreview(Rules.Info[Building], wr.Palette(palette));
                    initialized = true;
                }

                var offset = topLeft.CenterPosition + FootprintUtils.CenterOffset(BuildingInfo) - WPos.Zero;
                foreach (var r in preview)
                {
                    r.OffsetBy(offset).Render(wr);
                }

                var res           = world.WorldActor.Trait <ResourceLayer>();
                var isCloseEnough = BuildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, Building, topLeft);
                foreach (var t in FootprintUtils.Tiles(Building, BuildingInfo, topLeft))
                {
                    cells.Add(t, isCloseEnough && world.IsCellBuildable(t, BuildingInfo) && res.GetResource(t) == null);
                }
            }

            var pal = wr.Palette("terrain");

            foreach (var c in cells)
            {
                var tile = c.Value ? buildOk : buildBlocked;
                new SpriteRenderable(tile, c.Key.CenterPosition,
                                     WVec.Zero, -511, pal, 1f, true).Render(wr);
            }
        }
Example #14
0
        public static void Postfix()
        {
            Debug.Log("Permeable Plastic Tiles: Adding buildings to game...");

            BuildingUtils.AddBuildingToPlanScreen(PlasticMeshTileConfig.ID, GameStrings.PlanMenuCategory.Base, PlasticTileConfig.ID);
            BuildingUtils.AddBuildingToTech(PlasticMeshTileConfig.ID, GameStrings.Technology.Decor.HomeLuxuries);

            BuildingUtils.AddBuildingToPlanScreen(PlasticMembraneTileConfig.ID, GameStrings.PlanMenuCategory.Base, PlasticMeshTileConfig.ID);
            BuildingUtils.AddBuildingToTech(PlasticMembraneTileConfig.ID, GameStrings.Technology.Decor.HomeLuxuries);
        }
Example #15
0
        //ACOES
        private void saveBuildingName(UITextField u)
        {
            string value = u.text;

            Singleton <BuildingManager> .instance.StartCoroutine(BuildingUtils.SetBuildingName(m_buildingIdSelecionado.Building, value, () =>
            {
                buildingNameField.text = Singleton <BuildingManager> .instance.GetBuildingName(m_buildingIdSelecionado.Building, default(InstanceID));
                EventOnBuildingSelChanged?.Invoke(m_buildingIdSelecionado.Building);
            }));
        }
 public static void Prefix()
 {
     BuildingUtils.AddBuildingToTechnology("LiquidPiping", "asquared31415.PipedLiquidBottler");
     BuildingUtils.AddBuildingToTechnology("SolidTransport", "asquared31415.ConveyorBottleEmptier");
     BuildingUtils.AddBuildingToTechnology("SolidTransport", "asquared31415.ConveyorGasPipeFillerConfig");
     BuildingUtils.AddBuildingToTechnology("SolidTransport", "asquared31415.ConveyorLiquidPipeFillerConfig");
     BuildingUtils.AddBuildingToTechnology("SolidTransport", "asquared31415.ConveyorGasLoaderConfig");
     BuildingUtils.AddBuildingToTechnology("SolidTransport", "asquared31415.ConveyorLiquidLoaderConfig");
     LocString.CreateLocStringKeys(typeof(STRINGS.BUILDINGS));
 }
Example #17
0
        public static void RegisterBuildings()
        {
            BuildingUtils.AddStrings(KingDoorConfig.ID, KingDoorConfig.DisplayName, KingDoorConfig.Description, KingDoorConfig.Effect);
            BuildingUtils.AddToPlanning("Base", KingDoorConfig.ID, "Door");
            BuildingUtils.AddToTechnology("Jobs", KingDoorConfig.ID);

            BuildingUtils.AddStrings(KingPowerDoorConfig.ID, KingPowerDoorConfig.DisplayName, KingPowerDoorConfig.Description, KingPowerDoorConfig.Effect);
            BuildingUtils.AddToPlanning("Base", KingPowerDoorConfig.ID, "PressureDoor");
            BuildingUtils.AddToTechnology("RefinedObjects", KingPowerDoorConfig.ID);
        }
        public void RenderBeforeWorld(WorldRenderer wr, World world)
        {
            var position = Game.viewport.ViewToWorld(Viewport.LastMousePos);
            var topLeft  = position - FootprintUtils.AdjustForBuildingSize(BuildingInfo);

            var actorInfo = Rules.Info[Building];

            foreach (var dec in actorInfo.Traits.WithInterface <IPlaceBuildingDecoration>())
            {
                dec.Render(wr, world, actorInfo, Traits.Util.CenterOfCell(position));                   /* hack hack */
            }
            var cells = new Dictionary <CPos, bool>();

            // Linebuild for walls.
            // Assumes a 1x1 footprint; weird things will happen for other footprints
            if (Rules.Info[Building].Traits.Contains <LineBuildInfo>())
            {
                foreach (var t in BuildingUtils.GetLineBuildCells(world, topLeft, Building, BuildingInfo))
                {
                    cells.Add(t, BuildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, Building, t));
                }
            }
            else
            {
                if (!initialized)
                {
                    var rbi     = Rules.Info[Building].Traits.Get <RenderBuildingInfo>();
                    var palette = rbi.Palette ?? (Producer.Owner != null ?
                                                  rbi.PlayerPalette + Producer.Owner.InternalName : null);

                    preview     = rbi.RenderPreview(Rules.Info[Building], wr.Palette(palette));
                    initialized = true;
                }

                foreach (var r in preview)
                {
                    r.Sprite.DrawAt(topLeft.ToPPos().ToFloat2() + r.Pos,
                                    r.Palette.Index,
                                    r.Scale * r.Sprite.size);
                }

                var res           = world.WorldActor.Trait <ResourceLayer>();
                var isCloseEnough = BuildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, Building, topLeft);
                foreach (var t in FootprintUtils.Tiles(Building, BuildingInfo, topLeft))
                {
                    cells.Add(t, isCloseEnough && world.IsCellBuildable(t, BuildingInfo) && res.GetResource(t) == null);
                }
            }

            foreach (var c in cells)
            {
                (c.Value ? buildOk : buildBlocked).DrawAt(wr, c.Key.ToPPos().ToFloat2(), "terrain");
            }
        }
Example #19
0
        IEnumerable <IRenderable> IOrderGenerator.RenderAboveShroud(WorldRenderer wr, World world)
        {
            var topLeft       = TopLeft;
            var footprint     = new Dictionary <CPos, PlaceBuildingCellType>();
            var activeVariant = variants[variant];
            var actorInfo     = activeVariant.ActorInfo;
            var buildingInfo  = activeVariant.BuildingInfo;
            var plugInfo      = activeVariant.PlugInfo;
            var lineBuildInfo = activeVariant.LineBuildInfo;
            var preview       = activeVariant.Preview;
            var owner         = queue.Actor.Owner;

            if (plugInfo != null)
            {
                if (buildingInfo.Dimensions.X != 1 || buildingInfo.Dimensions.Y != 1)
                {
                    throw new InvalidOperationException("Plug requires a 1x1 sized Building");
                }

                footprint.Add(topLeft, MakeCellType(AcceptsPlug(topLeft, plugInfo)));
            }
            else if (lineBuildInfo != null && owner.Shroud.IsExplored(topLeft))
            {
                // Linebuild for walls.
                if (buildingInfo.Dimensions.X != 1 || buildingInfo.Dimensions.Y != 1)
                {
                    throw new InvalidOperationException("LineBuild requires a 1x1 sized Building");
                }

                if (!Game.GetModifierKeys().HasModifier(Modifiers.Shift))
                {
                    foreach (var t in BuildingUtils.GetLineBuildCells(world, topLeft, actorInfo, buildingInfo, owner))
                    {
                        var lineBuildable   = world.IsCellBuildable(t.Cell, actorInfo, buildingInfo);
                        var lineCloseEnough = buildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, actorInfo, t.Cell);
                        footprint.Add(t.Cell, MakeCellType(lineBuildable && lineCloseEnough, true));
                    }
                }

                var buildable   = world.IsCellBuildable(topLeft, actorInfo, buildingInfo);
                var closeEnough = buildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, actorInfo, topLeft);
                footprint[topLeft] = MakeCellType(buildable && closeEnough);
            }
            else
            {
                var isCloseEnough = buildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, actorInfo, topLeft);
                foreach (var t in buildingInfo.Tiles(topLeft))
                {
                    footprint.Add(t, MakeCellType(isCloseEnough && world.IsCellBuildable(t, actorInfo, buildingInfo) && (resourceLayer == null || resourceLayer.GetResource(t).Type == null)));
                }
            }

            return(preview?.Render(wr, topLeft, footprint) ?? Enumerable.Empty <IRenderable>());
        }
        public override void OnLoad(Harmony harmony)
        {
            BuildingUtils.AddBuildingToPlanScreen(GameStrings.PlanMenuCategory.Power, SmallTransformerConfig.Id);

            StringUtils.AddBuildingStrings(
                SmallTransformerConfig.Id,
                SmallTransformerConfig.DisplayName,
                SmallTransformerConfig.Description,
                SmallTransformerConfig.Effect
                );
            base.OnLoad(harmony);
        }
 public static void Setup()
 {
     BuildingUtils.AddStrings(ID, DisplayName, Description, Effect);
     if (CritterPathingPatches.config.TreatDefaultDoorsAsCritterProof)
     {
         return;
     }
     else if (CritterPathingPatches.config.EnableCritterProofMechanisedAirlock)
     {
         BuildingUtils.AddToPlanning("Base", ID, "PressureDoor");
         BuildingUtils.AddToTechnology("AnimalControl", ID);
     }
 }
Example #22
0
        public static void RegisterBuildings()
        {
            BuildingUtils.AddToPlanning("Base", BuildablePOIFacilityDoorConfig.ID, "ManualPressureDoor");
            BuildingUtils.AddToTechnology("RefinedObjects", BuildablePOIFacilityDoorConfig.ID);

            BuildingUtils.AddToPlanning("Base", BuildablePOISecurityDoorConfig.ID, "PressureDoor");
            BuildingUtils.AddToTechnology("RefinedObjects", BuildablePOISecurityDoorConfig.ID);

            BuildingUtils.AddToPlanning("Base", BuildablePOIInternalDoorConfig.ID, "Door");
            BuildingUtils.AddToTechnology("RefinedObjects", BuildablePOIInternalDoorConfig.ID);

            LocString.CreateLocStringKeys(typeof(BuildablePOIDoorsStrings.BUILDINGS));
        }
 public static void Setup()
 {
     BuildingUtils.AddStrings(ID, DisplayName, Description, Effect);
     if (CritterPathingPatches.config.TreatDefaultDoorsAsCritterProof)
     {
         return;
     }
     else if (CritterPathingPatches.config.EnablePneumaticCritterProofDoor)
     {
         BuildingUtils.AddToPlanning("Base", ID, "Door");
         BuildingUtils.AddToTechnology("Ranching", ID);
     }
 }
Example #24
0
            public static void Postfix()
            {
                BuildingUtils.AddBuildingToPlanScreen(InfiniteLiquidSourceConfig.ID, GameStrings.PlanMenuCategory.Plumbing);
                BuildingUtils.AddBuildingToTech(InfiniteLiquidSourceConfig.ID, GameStrings.Technology.Liquids.Plumbing);

                BuildingUtils.AddBuildingToPlanScreen(InfiniteLiquidSinkConfig.ID, GameStrings.PlanMenuCategory.Plumbing);
                BuildingUtils.AddBuildingToTech(InfiniteLiquidSinkConfig.ID, GameStrings.Technology.Liquids.Plumbing);

                BuildingUtils.AddBuildingToPlanScreen(InfiniteGasSourceConfig.ID, GameStrings.PlanMenuCategory.Ventilation);
                BuildingUtils.AddBuildingToTech(InfiniteGasSourceConfig.ID, GameStrings.Technology.Gases.Ventilation);

                BuildingUtils.AddBuildingToPlanScreen(InfiniteGasSinkConfig.ID, GameStrings.PlanMenuCategory.Ventilation);
                BuildingUtils.AddBuildingToTech(InfiniteGasSinkConfig.ID, GameStrings.Technology.Gases.Ventilation);
            }
Example #25
0
        private static void Postfix()
        {
            BuildingUtils.AddBuildingToPlanScreen(GasFanConfig.Id, GameStrings.PlanMenuCategory.Ventilation);
            BuildingUtils.AddBuildingToPlanScreen(HighPressureGasFan.Id, GameStrings.PlanMenuCategory.Ventilation);
            BuildingUtils.AddBuildingToPlanScreen(CompressorGasFanConfig.Id, GameStrings.PlanMenuCategory.Ventilation);
            BuildingUtils.AddBuildingToPlanScreen(LiquidFanConfig.Id, GameStrings.PlanMenuCategory.Plumbing);
            BuildingUtils.AddBuildingToPlanScreen(CompressorLiquidFanConfig.Id, GameStrings.PlanMenuCategory.Plumbing);

            BuildingUtils.AddBuildingToTech(GasFanConfig.Id, GameStrings.Technology.Gases.Ventilation);
            BuildingUtils.AddBuildingToTech(HighPressureGasFan.Id, GameStrings.Technology.Gases.ImprovedVentilation);
            BuildingUtils.AddBuildingToTech(CompressorGasFanConfig.Id, GameStrings.Technology.Gases.HVAC);
            BuildingUtils.AddBuildingToTech(LiquidFanConfig.Id, GameStrings.Technology.Liquids.Plumbing);
            BuildingUtils.AddBuildingToTech(CompressorLiquidFanConfig.Id, GameStrings.Technology.Liquids.LiquidTuning);
        }
Example #26
0
        public static void RegisterBuildings()
        {
            BuildingUtils.AddStrings(GasTrashcanConfig.ID, GasTrashcanConfig.Name, GasTrashcanConfig.Description, GasTrashcanConfig.Effect);
            BuildingUtils.AddToPlanning("Base", GasTrashcanConfig.ID, "GasReservoir");
            BuildingUtils.AddToTechnology("SmartStorage", GasTrashcanConfig.ID);

            BuildingUtils.AddStrings(LiquidTrashcanConfig.ID, LiquidTrashcanConfig.Name, LiquidTrashcanConfig.Description, LiquidTrashcanConfig.Effect);
            BuildingUtils.AddToPlanning("Base", LiquidTrashcanConfig.ID, "LiquidReservoir");
            BuildingUtils.AddToTechnology("SmartStorage", LiquidTrashcanConfig.ID);

            BuildingUtils.AddStrings(SolidTrashcanConfig.ID, SolidTrashcanConfig.Name, SolidTrashcanConfig.Description, SolidTrashcanConfig.Effect);
            BuildingUtils.AddToPlanning("Base", SolidTrashcanConfig.ID, "StorageLockerSmart");
            BuildingUtils.AddToTechnology("SmartStorage", SolidTrashcanConfig.ID);
        }
Example #27
0
        public static void RegisterBuildings()
        {
            BuildingUtils.AddStrings(WirelessSenderConfig.ID, WirelessSenderConfig.Name, WirelessSenderConfig.Description, WirelessSenderConfig.Effect);
            BuildingUtils.AddToPlanning("Power", WirelessSenderConfig.ID, "BatterySmart");
            BuildingUtils.AddToTechnology("PrettyGoodConductors", WirelessSenderConfig.ID);

            BuildingUtils.AddStrings(WirelessReceiverConfig.ID, WirelessReceiverConfig.Name, WirelessReceiverConfig.Description, WirelessReceiverConfig.Effect);
            BuildingUtils.AddToPlanning("Power", WirelessReceiverConfig.ID, "BatterySmart");
            BuildingUtils.AddToTechnology("PrettyGoodConductors", WirelessReceiverConfig.ID);

            BuildingUtils.AddStrings(WirelessBatteryConfig.ID, WirelessBatteryConfig.Name, WirelessBatteryConfig.Description, WirelessBatteryConfig.Effect);
            BuildingUtils.AddToPlanning("Power", WirelessBatteryConfig.ID, "BatterySmart");
            BuildingUtils.AddToTechnology("PrettyGoodConductors", WirelessBatteryConfig.ID);
        }
Example #28
0
 public void PlaceBuilding(Coordinate coordinate)
 {
     if (m_BuildingMap[coordinate] == Building.NONE)
     {
         m_BuildingMap[coordinate] = Building.ONE;
         MapGrid.MapTiles[coordinate].CurrentBuilding = Building.ONE;
     }
     else
     {
         Building nextBuilding = BuildingUtils.NextBuilding(m_BuildingMap[coordinate]);
         m_BuildingMap[coordinate] = nextBuilding;
         MapGrid.MapTiles[coordinate].CurrentBuilding = nextBuilding;
     }
 }
Example #29
0
        protected override IEnumerable <IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
        {
            var topLeft   = TopLeft;
            var footprint = new Dictionary <CPos, PlaceBuildingCellType>();
            var plugInfo  = actorInfo.TraitInfoOrDefault <PlugInfo>();

            if (plugInfo != null)
            {
                if (buildingInfo.Dimensions.X != 1 || buildingInfo.Dimensions.Y != 1)
                {
                    throw new InvalidOperationException("Plug requires a 1x1 sized Building");
                }

                footprint.Add(topLeft, MakeCellType(AcceptsPlug(topLeft, plugInfo)));
            }
            else if (actorInfo.HasTraitInfo <LineBuildInfo>())
            {
                // Linebuild for walls.
                if (buildingInfo.Dimensions.X != 1 || buildingInfo.Dimensions.Y != 1)
                {
                    throw new InvalidOperationException("LineBuild requires a 1x1 sized Building");
                }

                if (!Game.GetModifierKeys().HasModifier(Modifiers.Shift))
                {
                    foreach (var t in BuildingUtils.GetLineBuildCells(world, topLeft, actorInfo, buildingInfo))
                    {
                        var lineBuildable   = world.IsCellBuildable(t.First, actorInfo, buildingInfo);
                        var lineCloseEnough = buildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, actorInfo, t.First);
                        footprint.Add(t.First, MakeCellType(lineBuildable && lineCloseEnough, true));
                    }
                }

                var buildable   = world.IsCellBuildable(topLeft, actorInfo, buildingInfo);
                var closeEnough = buildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, actorInfo, topLeft);
                footprint[topLeft] = MakeCellType(buildable && closeEnough);
            }
            else
            {
                var res           = world.WorldActor.TraitOrDefault <ResourceLayer>();
                var isCloseEnough = buildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, actorInfo, topLeft);
                foreach (var t in buildingInfo.Tiles(topLeft))
                {
                    footprint.Add(t, MakeCellType(isCloseEnough && world.IsCellBuildable(t, actorInfo, buildingInfo) && (res == null || res.GetResource(t) == null)));
                }
            }

            return(preview != null?preview.Render(wr, topLeft, footprint) : Enumerable.Empty <IRenderable>());
        }
        public static void OnLoad()
        {
            CaiLib.Logger.Logger.LogInit();

            BuildingUtils.AddBuildingToPlanScreen(GameStrings.PlanMenuCategory.Base, DeepItemStorage.Id);
            BuildingUtils.AddBuildingToTechnology(
                GameStrings.Technology.SolidMaterial.SolidManagement,
                DeepItemStorage.Id
                );

            BuildingUtils.AddBuildingToPlanScreen(GameStrings.PlanMenuCategory.Base, DeepLiquidStorage.Id);
            BuildingUtils.AddBuildingToTechnology(GameStrings.Technology.Liquids.LiquidTuning, DeepLiquidStorage.Id);

            BuildingUtils.AddBuildingToPlanScreen(GameStrings.PlanMenuCategory.Base, DeepGasStorage.Id);
            BuildingUtils.AddBuildingToTechnology(GameStrings.Technology.Gases.HVAC, DeepGasStorage.Id);

            LocString.CreateLocStringKeys(typeof(STRINGS), null);
        }