示例#1
0
    public void EnergySim200ms(float dt)
    {
        KSelectable component = GetComponent <KSelectable>();

        if (operational.IsActive)
        {
            generator.GenerateJoules(generator.WattageRating * dt, false);
            component.SetStatusItem(Db.Get().StatusItemCategories.Power, Db.Get().BuildingStatusItems.Wattage, generator);
        }
        else
        {
            generator.ResetJoules();
            component.SetStatusItem(Db.Get().StatusItemCategories.Power, Db.Get().BuildingStatusItems.GeneratorOffline, null);
            if (operational.IsOperational)
            {
                CircuitManager circuitManager = Game.Instance.circuitManager;
                if (circuitManager != null)
                {
                    ushort circuitID = circuitManager.GetCircuitID(powerCell);
                    bool   flag      = circuitManager.HasBatteries(circuitID);
                    bool   flag2     = false;
                    if (!flag && circuitManager.HasConsumers(circuitID))
                    {
                        flag2 = true;
                    }
                    else if (flag)
                    {
                        if (batteryRefillPercent <= 0f && circuitManager.GetMinBatteryPercentFullOnCircuit(circuitID) <= 0f)
                        {
                            flag2 = true;
                        }
                        else if (circuitManager.GetMinBatteryPercentFullOnCircuit(circuitID) < batteryRefillPercent)
                        {
                            flag2 = true;
                        }
                    }
                    if (flag2)
                    {
                        if (chore == null && smi.GetCurrentState() == smi.sm.on)
                        {
                            chore = new WorkChore <ManualGenerator>(Db.Get().ChoreTypes.GeneratePower, this, null, true, null, null, null, true, null, false, true, null, false, true, true, PriorityScreen.PriorityClass.basic, 5, false, true);
                        }
                    }
                    else if (chore != null)
                    {
                        chore.Cancel("No refill needed");
                        chore = null;
                    }
                    component.ToggleStatusItem(EnergyGenerator.BatteriesSufficientlyFull, !flag2, null);
                }
            }
        }
    }
示例#2
0
    protected override bool OnWorkTick(Worker worker, float dt)
    {
        CircuitManager circuitManager = Game.Instance.circuitManager;
        bool           flag           = false;

        if (circuitManager != null)
        {
            ushort circuitID = circuitManager.GetCircuitID(powerCell);
            bool   flag2     = circuitManager.HasBatteries(circuitID);
            flag = ((flag2 && circuitManager.GetMinBatteryPercentFullOnCircuit(circuitID) < 1f) || (!flag2 && circuitManager.HasConsumers(circuitID)));
        }
        AttributeLevels component = worker.GetComponent <AttributeLevels>();

        if ((Object)component != (Object)null)
        {
            component.AddExperience(Db.Get().Attributes.Athletics.Id, dt, DUPLICANTSTATS.ATTRIBUTE_LEVELING.ALL_DAY_EXPERIENCE);
        }
        return(!flag);
    }
示例#3
0
            public static bool Prefix(Wire __instance, ref StatusItem ___WireCircuitStatus, ref StatusItem ___WireMaxWattageStatus)
            {
                if (___WireCircuitStatus == null)
                {
                    ___WireCircuitStatus = new StatusItem("WireCircuitStatus", "BUILDING", string.Empty, StatusItem.IconType.Info, NotificationType.Neutral, false, OverlayModes.None.ID).SetResolveStringCallback(delegate(string str, object data)
                    {
                        Wire wire2 = (Wire)data;
                        int cell2  = Grid.PosToCell(wire2.transform.GetPosition());
                        CircuitManager circuitManager2 = Game.Instance.circuitManager;
                        ushort circuitID2                   = circuitManager2.GetCircuitID(cell2);
                        float wattsUsedByCircuit            = circuitManager2.GetWattsUsedByCircuit(circuitID2);
                        GameUtil.WattageFormatterUnit unit2 = wire2.MaxWattageRating.GetFormatterUnit();
                        float maxWattageAsFloat2            = Wire.GetMaxWattageAsFloat(wire2.MaxWattageRating);
                        float wattsNeededWhenActive2        = circuitManager2.GetWattsNeededWhenActive(circuitID2);
                        string wireLoadColor                = GameUtil.GetWireLoadColor(wattsUsedByCircuit, maxWattageAsFloat2, wattsNeededWhenActive2);
                        str = str.Replace("{CurrentLoadAndColor}", (wireLoadColor == Color.white.ToHexString()) ? GameUtil.GetFormattedWattage(wattsUsedByCircuit, unit2) : ("<color=#" + wireLoadColor + ">" + GameUtil.GetFormattedWattage(wattsUsedByCircuit, unit2) + "</color>"));
                        str = str.Replace("{MaxLoad}", GameUtil.GetFormattedWattage(maxWattageAsFloat2, unit2));
                        str = str.Replace("{WireType}", __instance.GetProperName());
                        return(str);
                    });
                }
                if (___WireMaxWattageStatus == null)
                {
                    ___WireMaxWattageStatus = new StatusItem("WireMaxWattageStatus", "BUILDING", string.Empty, StatusItem.IconType.Info, NotificationType.Neutral, false, OverlayModes.None.ID).SetResolveStringCallback(delegate(string str, object data)
                    {
                        Wire wire = (Wire)data;
                        GameUtil.WattageFormatterUnit unit = wire.MaxWattageRating.GetFormatterUnit();
                        int cell = Grid.PosToCell(wire.transform.GetPosition());
                        CircuitManager circuitManager = Game.Instance.circuitManager;
                        ushort circuitID            = circuitManager.GetCircuitID(cell);
                        float wattsNeededWhenActive = circuitManager.GetWattsNeededWhenActive(circuitID);
                        float maxWattageAsFloat     = Wire.GetMaxWattageAsFloat(wire.MaxWattageRating);
                        str = str.Replace("{TotalPotentialLoadAndColor}", (wattsNeededWhenActive > maxWattageAsFloat) ? ("<color=#" + new Color(251f / 255f, 176f / 255f, 59f / 255f).ToHexString() + ">" + GameUtil.GetFormattedWattage(wattsNeededWhenActive, unit) + "</color>") : GameUtil.GetFormattedWattage(wattsNeededWhenActive, unit));
                        str = str.Replace("{MaxLoad}", GameUtil.GetFormattedWattage(maxWattageAsFloat, unit));
                        return(str);
                    });
                }

                return(true);
            }
示例#4
0
        /// <summary>
        /// Updates the plugged in status of batteries or transformers.
        /// </summary>
        /// <param name="instance">The circuit manager to update.</param>
        /// <param name="batteries">The batteries or transformers to update.</param>
        /// <param name="hasSources">Whether the batteries have a potential energy source.</param>
        private static void UpdateConnectionStatus(CircuitManager instance, int circuitID,
                                                   IList <Battery> batteries, bool hasSources)
        {
            int ni = batteries.Count;

            for (int i = 0; i < ni; i++)
            {
                var battery = batteries[i];
                if (battery != null)
                {
                    if (battery.powerTransformer == null)
                    {
                        battery.SetConnectionStatus(hasSources ? ConnectionStatus.Powered :
                                                    ConnectionStatus.NotConnected);
                    }
                    else if (instance.GetCircuitID(battery) == circuitID)
                    {
                        battery.SetConnectionStatus(hasSources ? ConnectionStatus.Powered :
                                                    ConnectionStatus.Unpowered);
                    }
                }
            }
        }
 private void Refresh()
 {
     if (!((Object)selectedTarget == (Object)null))
     {
         foreach (KeyValuePair <string, GameObject> overviewLabel in overviewLabels)
         {
             overviewLabel.Value.SetActive(false);
         }
         foreach (KeyValuePair <string, GameObject> generatorsLabel in generatorsLabels)
         {
             generatorsLabel.Value.SetActive(false);
         }
         foreach (KeyValuePair <string, GameObject> consumersLabel in consumersLabels)
         {
             consumersLabel.Value.SetActive(false);
         }
         foreach (KeyValuePair <string, GameObject> batteriesLabel in batteriesLabels)
         {
             batteriesLabel.Value.SetActive(false);
         }
         CircuitManager circuitManager = Game.Instance.circuitManager;
         ushort         num            = ushort.MaxValue;
         EnergyConsumer component      = selectedTarget.GetComponent <EnergyConsumer>();
         if ((Object)component != (Object)null)
         {
             num = component.CircuitID;
         }
         else
         {
             Generator component2 = selectedTarget.GetComponent <Generator>();
             if ((Object)component2 != (Object)null)
             {
                 num = component2.CircuitID;
             }
         }
         if (num == 65535)
         {
             int cell = Grid.PosToCell(selectedTarget.transform.GetPosition());
             num = circuitManager.GetCircuitID(cell);
         }
         if (num != 65535)
         {
             overviewPanel.SetActive(true);
             generatorsPanel.SetActive(true);
             consumersPanel.SetActive(true);
             batteriesPanel.SetActive(true);
             float      joulesAvailableOnCircuit = circuitManager.GetJoulesAvailableOnCircuit(num);
             GameObject gameObject = AddOrGetLabel(overviewLabels, overviewPanel, "joulesAvailable");
             gameObject.GetComponent <LocText>().text    = string.Format(UI.DETAILTABS.ENERGYGENERATOR.AVAILABLE_JOULES, GameUtil.GetFormattedJoules(joulesAvailableOnCircuit, "F1", GameUtil.TimeSlice.None));
             gameObject.GetComponent <ToolTip>().toolTip = UI.DETAILTABS.ENERGYGENERATOR.AVAILABLE_JOULES_TOOLTIP;
             gameObject.SetActive(true);
             float wattsGeneratedByCircuit          = circuitManager.GetWattsGeneratedByCircuit(num);
             float potentialWattsGeneratedByCircuit = circuitManager.GetPotentialWattsGeneratedByCircuit(num);
             gameObject = AddOrGetLabel(overviewLabels, overviewPanel, "wattageGenerated");
             string text = null;
             text = ((wattsGeneratedByCircuit != potentialWattsGeneratedByCircuit) ? $"{GameUtil.GetFormattedWattage(wattsGeneratedByCircuit, GameUtil.WattageFormatterUnit.Automatic)} / {GameUtil.GetFormattedWattage(potentialWattsGeneratedByCircuit, GameUtil.WattageFormatterUnit.Automatic)}" : GameUtil.GetFormattedWattage(wattsGeneratedByCircuit, GameUtil.WattageFormatterUnit.Automatic));
             gameObject.GetComponent <LocText>().text    = string.Format(UI.DETAILTABS.ENERGYGENERATOR.WATTAGE_GENERATED, text);
             gameObject.GetComponent <ToolTip>().toolTip = UI.DETAILTABS.ENERGYGENERATOR.WATTAGE_GENERATED_TOOLTIP;
             gameObject.SetActive(true);
             gameObject = AddOrGetLabel(overviewLabels, overviewPanel, "wattageConsumed");
             gameObject.GetComponent <LocText>().text    = string.Format(UI.DETAILTABS.ENERGYGENERATOR.WATTAGE_CONSUMED, GameUtil.GetFormattedWattage(circuitManager.GetWattsUsedByCircuit(num), GameUtil.WattageFormatterUnit.Automatic));
             gameObject.GetComponent <ToolTip>().toolTip = UI.DETAILTABS.ENERGYGENERATOR.WATTAGE_CONSUMED_TOOLTIP;
             gameObject.SetActive(true);
             gameObject = AddOrGetLabel(overviewLabels, overviewPanel, "potentialWattageConsumed");
             gameObject.GetComponent <LocText>().text    = string.Format(UI.DETAILTABS.ENERGYGENERATOR.POTENTIAL_WATTAGE_CONSUMED, GameUtil.GetFormattedWattage(circuitManager.GetWattsNeededWhenActive(num), GameUtil.WattageFormatterUnit.Automatic));
             gameObject.GetComponent <ToolTip>().toolTip = UI.DETAILTABS.ENERGYGENERATOR.POTENTIAL_WATTAGE_CONSUMED_TOOLTIP;
             gameObject.SetActive(true);
             gameObject = AddOrGetLabel(overviewLabels, overviewPanel, "maxSafeWattage");
             gameObject.GetComponent <LocText>().text    = string.Format(UI.DETAILTABS.ENERGYGENERATOR.MAX_SAFE_WATTAGE, GameUtil.GetFormattedWattage(circuitManager.GetMaxSafeWattageForCircuit(num), GameUtil.WattageFormatterUnit.Automatic));
             gameObject.GetComponent <ToolTip>().toolTip = UI.DETAILTABS.ENERGYGENERATOR.MAX_SAFE_WATTAGE_TOOLTIP;
             gameObject.SetActive(true);
             ReadOnlyCollection <Generator>       generatorsOnCircuit = circuitManager.GetGeneratorsOnCircuit(num);
             ReadOnlyCollection <IEnergyConsumer> consumersOnCircuit  = circuitManager.GetConsumersOnCircuit(num);
             List <Battery> batteriesOnCircuit = circuitManager.GetBatteriesOnCircuit(num);
             ReadOnlyCollection <Battery> transformersOnCircuit = circuitManager.GetTransformersOnCircuit(num);
             if (generatorsOnCircuit.Count > 0)
             {
                 foreach (Generator item in generatorsOnCircuit)
                 {
                     if ((Object)item != (Object)null && (Object)item.GetComponent <Battery>() == (Object)null)
                     {
                         gameObject = AddOrGetLabel(generatorsLabels, generatorsPanel, item.gameObject.GetInstanceID().ToString());
                         Operational component3 = item.GetComponent <Operational>();
                         if (component3.IsActive)
                         {
                             gameObject.GetComponent <LocText>().text = $"{item.GetComponent<KSelectable>().entityName}: {GameUtil.GetFormattedWattage(item.WattageRating, GameUtil.WattageFormatterUnit.Automatic)}";
                         }
                         else
                         {
                             gameObject.GetComponent <LocText>().text = $"{item.GetComponent<KSelectable>().entityName}: {GameUtil.GetFormattedWattage(0f, GameUtil.WattageFormatterUnit.Automatic)} / {GameUtil.GetFormattedWattage(item.WattageRating, GameUtil.WattageFormatterUnit.Automatic)}";
                         }
                         gameObject.SetActive(true);
                         gameObject.GetComponent <LocText>().fontStyle = (((Object)item.gameObject == (Object)selectedTarget) ? FontStyles.Bold : FontStyles.Normal);
                     }
                 }
             }
             else
             {
                 gameObject = AddOrGetLabel(generatorsLabels, generatorsPanel, "nogenerators");
                 gameObject.GetComponent <LocText>().text = UI.DETAILTABS.ENERGYGENERATOR.NOGENERATORS;
                 gameObject.SetActive(true);
             }
             if (consumersOnCircuit.Count > 0 || transformersOnCircuit.Count > 0)
             {
                 foreach (IEnergyConsumer item2 in consumersOnCircuit)
                 {
                     AddConsumerInfo(item2, gameObject);
                 }
                 foreach (Battery item3 in transformersOnCircuit)
                 {
                     AddConsumerInfo(item3, gameObject);
                 }
             }
             else
             {
                 gameObject = AddOrGetLabel(consumersLabels, consumersPanel, "noconsumers");
                 gameObject.GetComponent <LocText>().text = UI.DETAILTABS.ENERGYGENERATOR.NOCONSUMERS;
                 gameObject.SetActive(true);
             }
             if (batteriesOnCircuit.Count > 0)
             {
                 foreach (Battery item4 in batteriesOnCircuit)
                 {
                     if ((Object)item4 != (Object)null)
                     {
                         gameObject = AddOrGetLabel(batteriesLabels, batteriesPanel, item4.gameObject.GetInstanceID().ToString());
                         gameObject.GetComponent <LocText>().text = string.Format("{0}: {1}", item4.GetComponent <KSelectable>().entityName, GameUtil.GetFormattedJoules(item4.JoulesAvailable, "F1", GameUtil.TimeSlice.None));
                         gameObject.SetActive(true);
                         gameObject.GetComponent <LocText>().fontStyle = (((Object)item4.gameObject == (Object)selectedTarget) ? FontStyles.Bold : FontStyles.Normal);
                     }
                 }
             }
             else
             {
                 gameObject = AddOrGetLabel(batteriesLabels, batteriesPanel, "nobatteries");
                 gameObject.GetComponent <LocText>().text = UI.DETAILTABS.ENERGYGENERATOR.NOBATTERIES;
                 gameObject.SetActive(true);
             }
         }
         else
         {
             overviewPanel.SetActive(true);
             generatorsPanel.SetActive(false);
             consumersPanel.SetActive(false);
             batteriesPanel.SetActive(false);
             GameObject gameObject2 = AddOrGetLabel(overviewLabels, overviewPanel, "nocircuit");
             gameObject2.GetComponent <LocText>().text = UI.DETAILTABS.ENERGYGENERATOR.DISCONNECTED;
             gameObject2.SetActive(true);
         }
     }
 }
示例#6
0
        /// <summary>
        /// Rebuilds the electrical networks.
        /// </summary>
        /// <param name="instance">The networks to rebuild.</param>
        private static void Rebuild(CircuitManager instance)
        {
            var circuits       = instance.circuitInfo;
            var minBatteryFull = ListPool <float, CircuitManager> .Allocate();

            int n = circuits.Count, circuitID;

            for (int i = 0; i < n; i++)
            {
                var circuit = circuits[i];
                var bridges = circuit.bridgeGroups;
                int nGroups = bridges.Length;
                circuit.generators.Clear();
                circuit.consumers.Clear();
                circuit.batteries.Clear();
                circuit.inputTransformers.Clear();
                circuit.outputTransformers.Clear();
                minBatteryFull.Add(1.0f);
                for (int j = 0; j < nGroups; j++)
                {
                    bridges[j].Clear();
                }
            }
            foreach (var consumer in instance.consumers)
            {
                if (consumer != null && (circuitID = instance.GetCircuitID(consumer)) !=
                    ushort.MaxValue)
                {
                    var circuit = circuits[circuitID];
                    if (consumer is Battery battery)
                    {
                        if (battery.powerTransformer != null)
                        {
                            circuit.inputTransformers.Add(battery);
                        }
                        else
                        {
                            circuit.batteries.Add(battery);
                            minBatteryFull[circuitID] = Mathf.Min(minBatteryFull[circuitID],
                                                                  battery.PercentFull);
                        }
                    }
                    else
                    {
                        circuit.consumers.Add(consumer);
                    }
                }
            }
            for (int i = 0; i < n; i++)
            {
                var circuit = circuits[i];
                circuit.consumers.Sort(ConsumerWattageComparer.Instance);
                circuit.minBatteryPercentFull = minBatteryFull[i];
                circuits[i] = circuit;
            }
            minBatteryFull.Recycle();
            foreach (var generator in instance.generators)
            {
                if (generator != null && (circuitID = instance.GetCircuitID(generator)) !=
                    ushort.MaxValue)
                {
                    var circuit = circuits[circuitID];
                    if (generator is PowerTransformer)
                    {
                        circuit.outputTransformers.Add(generator);
                    }
                    else
                    {
                        circuit.generators.Add(generator);
                    }
                }
            }
            foreach (var bridge in instance.bridges)
            {
                if (bridge != null && (circuitID = instance.GetCircuitID(bridge)) != ushort.
                    MaxValue)
                {
                    circuits[circuitID].bridgeGroups[(int)bridge.GetMaxWattageRating()].Add(
                        bridge);
                }
            }
            instance.dirty = false;
        }
    public override void UpdateHoverElements(List <KSelectable> hoverObjects)
    {
        HoverTextScreen instance        = HoverTextScreen.Instance;
        HoverTextDrawer hoverTextDrawer = instance.BeginDrawing();

        hoverTextDrawer.BeginShadowBar(false);
        ActionName = ((!((UnityEngine.Object)currentDef != (UnityEngine.Object)null) || !currentDef.DragBuild) ? UI.TOOLS.BUILD.TOOLACTION : UI.TOOLS.BUILD.TOOLACTION_DRAG);
        if ((UnityEngine.Object)currentDef != (UnityEngine.Object)null && currentDef.Name != null)
        {
            ToolName = string.Format(UI.TOOLS.BUILD.NAME, currentDef.Name);
        }
        DrawTitle(instance, hoverTextDrawer);
        DrawInstructions(instance, hoverTextDrawer);
        int cell       = Grid.PosToCell(Camera.main.ScreenToWorldPoint(KInputManager.GetMousePos()));
        int min_height = 26;
        int width      = 8;

        if ((UnityEngine.Object)currentDef != (UnityEngine.Object)null)
        {
            Orientation orientation = Orientation.Neutral;
            if ((UnityEngine.Object)PlayerController.Instance.ActiveTool != (UnityEngine.Object)null)
            {
                Type type = PlayerController.Instance.ActiveTool.GetType();
                if (typeof(BuildTool).IsAssignableFrom(type) || typeof(BaseUtilityBuildTool).IsAssignableFrom(type))
                {
                    if ((UnityEngine.Object)currentDef.BuildingComplete.GetComponent <Rotatable>() != (UnityEngine.Object)null)
                    {
                        hoverTextDrawer.NewLine(min_height);
                        hoverTextDrawer.AddIndent(width);
                        string text = UI.TOOLTIPS.HELP_ROTATE_KEY.ToString();
                        text = text.Replace("{Key}", GameUtil.GetActionString(Action.RotateBuilding));
                        hoverTextDrawer.DrawText(text, Styles_Instruction.Standard);
                    }
                    orientation = BuildTool.Instance.GetBuildingOrientation;
                    string  fail_reason = "Unknown reason";
                    Vector3 pos         = Grid.CellToPosCCC(cell, Grid.SceneLayer.Building);
                    if (!currentDef.IsValidPlaceLocation(BuildTool.Instance.visualizer, pos, orientation, out fail_reason))
                    {
                        hoverTextDrawer.NewLine(min_height);
                        hoverTextDrawer.AddIndent(width);
                        hoverTextDrawer.DrawText(fail_reason, HoverTextStyleSettings[1]);
                    }
                    RoomTracker component = currentDef.BuildingComplete.GetComponent <RoomTracker>();
                    if ((UnityEngine.Object)component != (UnityEngine.Object)null && !component.SufficientBuildLocation(cell))
                    {
                        hoverTextDrawer.NewLine(min_height);
                        hoverTextDrawer.AddIndent(width);
                        hoverTextDrawer.DrawText(UI.TOOLTIPS.HELP_REQUIRES_ROOM, HoverTextStyleSettings[1]);
                    }
                }
            }
            hoverTextDrawer.NewLine(min_height);
            hoverTextDrawer.AddIndent(width);
            hoverTextDrawer.DrawText(ResourceRemainingDisplayScreen.instance.GetString(), Styles_BodyText.Standard);
            hoverTextDrawer.EndShadowBar();
            HashedString mode = SimDebugView.Instance.GetMode();
            if (mode == OverlayModes.Logic.ID && hoverObjects != null)
            {
                SelectToolHoverTextCard component2 = SelectTool.Instance.GetComponent <SelectToolHoverTextCard>();
                foreach (KSelectable hoverObject in hoverObjects)
                {
                    LogicPorts component3 = hoverObject.GetComponent <LogicPorts>();
                    if ((UnityEngine.Object)component3 != (UnityEngine.Object)null && component3.TryGetPortAtCell(cell, out LogicPorts.Port port, out bool isInput))
                    {
                        bool flag = component3.IsPortConnected(port.id);
                        hoverTextDrawer.BeginShadowBar(false);
                        int num;
                        if (isInput)
                        {
                            string replacement = (!port.displayCustomName) ? UI.LOGIC_PORTS.PORT_INPUT_DEFAULT_NAME.text : port.description;
                            num = component3.GetInputValue(port.id);
                            hoverTextDrawer.DrawText(UI.TOOLS.GENERIC.LOGIC_INPUT_HOVER_FMT.Replace("{Port}", replacement).Replace("{Name}", hoverObject.GetProperName().ToUpper()), component2.Styles_Title.Standard);
                        }
                        else
                        {
                            string replacement2 = (!port.displayCustomName) ? UI.LOGIC_PORTS.PORT_OUTPUT_DEFAULT_NAME.text : port.description;
                            num = component3.GetOutputValue(port.id);
                            hoverTextDrawer.DrawText(UI.TOOLS.GENERIC.LOGIC_OUTPUT_HOVER_FMT.Replace("{Port}", replacement2).Replace("{Name}", hoverObject.GetProperName().ToUpper()), component2.Styles_Title.Standard);
                        }
                        hoverTextDrawer.NewLine(26);
                        TextStyleSetting textStyleSetting = (!flag) ? component2.Styles_LogicActive.Standard : ((num != 1) ? component2.Styles_LogicSignalInactive : component2.Styles_LogicActive.Selected);
                        hoverTextDrawer.DrawIcon((num != 1 || !flag) ? component2.iconDash : component2.iconActiveAutomationPort, textStyleSetting.textColor, 18, 2);
                        hoverTextDrawer.DrawText(port.activeDescription, textStyleSetting);
                        hoverTextDrawer.NewLine(26);
                        TextStyleSetting textStyleSetting2 = (!flag) ? component2.Styles_LogicStandby.Standard : ((num != 0) ? component2.Styles_LogicSignalInactive : component2.Styles_LogicStandby.Selected);
                        hoverTextDrawer.DrawIcon((num != 0 || !flag) ? component2.iconDash : component2.iconActiveAutomationPort, textStyleSetting2.textColor, 18, 2);
                        hoverTextDrawer.DrawText(port.inactiveDescription, textStyleSetting2);
                        hoverTextDrawer.EndShadowBar();
                    }
                    LogicGate component4 = hoverObject.GetComponent <LogicGate>();
                    if ((UnityEngine.Object)component4 != (UnityEngine.Object)null && component4.TryGetPortAtCell(cell, out LogicGateBase.PortId port2))
                    {
                        int  portValue     = component4.GetPortValue(port2);
                        bool portConnected = component4.GetPortConnected(port2);
                        LogicGate.LogicGateDescriptions.Description portDescription = component4.GetPortDescription(port2);
                        hoverTextDrawer.BeginShadowBar(false);
                        if (port2 == LogicGateBase.PortId.Output)
                        {
                            hoverTextDrawer.DrawText(UI.TOOLS.GENERIC.LOGIC_MULTI_OUTPUT_HOVER_FMT.Replace("{Port}", portDescription.name).Replace("{Name}", hoverObject.GetProperName().ToUpper()), component2.Styles_Title.Standard);
                        }
                        else
                        {
                            hoverTextDrawer.DrawText(UI.TOOLS.GENERIC.LOGIC_MULTI_INPUT_HOVER_FMT.Replace("{Port}", portDescription.name).Replace("{Name}", hoverObject.GetProperName().ToUpper()), component2.Styles_Title.Standard);
                        }
                        hoverTextDrawer.NewLine(26);
                        TextStyleSetting textStyleSetting3 = (!portConnected) ? component2.Styles_LogicActive.Standard : ((portValue != 1) ? component2.Styles_LogicSignalInactive : component2.Styles_LogicActive.Selected);
                        hoverTextDrawer.DrawIcon((portValue != 1 || !portConnected) ? component2.iconDash : component2.iconActiveAutomationPort, textStyleSetting3.textColor, 18, 2);
                        hoverTextDrawer.DrawText(portDescription.active, textStyleSetting3);
                        hoverTextDrawer.NewLine(26);
                        TextStyleSetting textStyleSetting4 = (!portConnected) ? component2.Styles_LogicStandby.Standard : ((portValue != 0) ? component2.Styles_LogicSignalInactive : component2.Styles_LogicStandby.Selected);
                        hoverTextDrawer.DrawIcon((portValue != 0 || !portConnected) ? component2.iconDash : component2.iconActiveAutomationPort, textStyleSetting4.textColor, 18, 2);
                        hoverTextDrawer.DrawText(portDescription.inactive, textStyleSetting4);
                        hoverTextDrawer.EndShadowBar();
                    }
                }
            }
            else if (mode == OverlayModes.Power.ID)
            {
                CircuitManager circuitManager = Game.Instance.circuitManager;
                ushort         circuitID      = circuitManager.GetCircuitID(cell);
                if (circuitID != 65535)
                {
                    hoverTextDrawer.BeginShadowBar(false);
                    float wattsNeededWhenActive = circuitManager.GetWattsNeededWhenActive(circuitID);
                    wattsNeededWhenActive += currentDef.EnergyConsumptionWhenActive;
                    float maxSafeWattageForCircuit = circuitManager.GetMaxSafeWattageForCircuit(circuitID);
                    Color color = (!(wattsNeededWhenActive >= maxSafeWattageForCircuit)) ? Color.white : Color.red;
                    hoverTextDrawer.AddIndent(width);
                    hoverTextDrawer.DrawText(string.Format(UI.DETAILTABS.ENERGYGENERATOR.POTENTIAL_WATTAGE_CONSUMED, GameUtil.GetFormattedWattage(wattsNeededWhenActive, GameUtil.WattageFormatterUnit.Automatic)), Styles_BodyText.Standard, color, true);
                    hoverTextDrawer.EndShadowBar();
                }
            }
        }
        hoverTextDrawer.EndDrawing();
    }