private BatteryState GetBatteryState(PowerNet pn)
        {
            if (Find.TickManager.TicksGame - FirstTick > 60 && pn.batteryComps.Count() > 0)
            {
                float cegr = pn.CurrentEnergyGainRate();
                float cse  = pn.CurrentStoredEnergy();
                //!pn.Map.gameConditionManager.ConditionIsActive(GameConditionDefOf.SolarFlare)
                // Avoid spamming the warning when browning out by checking for insufficient power and keeping the alert on.
                if (cse / (float)pn.batteryComps.Sum(bc => bc.Props.storedEnergyMax) < 0.05f &&
                    pn.powerComps.Any(pc => !pc.PowerOn && FlickUtility.WantsToBeOn(pc.parent) && !pc.parent.IsBrokenDown()))
                {
                    return(BatteryState.Brownout);
                }

                if (cegr < 0)
                {
                    float timeLeft = (cse / cegr / -60f);
                    if (timeLeft <= Power_Alerts.drainingBatteriesThresholdSeconds)
                    {
                        return(BatteryState.Draining);
                    }
                }
            }

            return(BatteryState.Normal);
        }
Ejemplo n.º 2
0
        public static void SetNetColor(PowerNet net)
        {
            if (net.powerComps.Count == 0 && net.batteryComps.Count == 0)             // just conduits
            {
                netColors.SetOrAdd(net, ActiveCircuitsSettings.justConduits);
                return;
            }

            float production;
            float consumption;

            PowerMetrics(net, out production, out consumption);
            if (consumption == 0)         // nothing using power
            {
                netColors.SetOrAdd(net, ActiveCircuitsSettings.nothingConnected);
                return;
            }

            float rate = consumption + production;

            if (rate < 0)
            {
                float stored = net.CurrentStoredEnergy();
                if (stored < 5f)
                {
                    netColors.SetOrAdd(net, ActiveCircuitsSettings.noPower);
                }
                else
                {
                    netColors.SetOrAdd(net, ActiveCircuitsSettings.drainingPower);
                }
                return;
            }
            else                                                                          // rate >= 0
            {
                if (rate > 1.5 * consumption || net.CurrentStoredEnergy() >= consumption) // 1 day of power
                {
                    netColors.SetOrAdd(net, ActiveCircuitsSettings.surplusPower);
                }
                else
                {
                    netColors.SetOrAdd(net, ActiveCircuitsSettings.hasPower);
                }
                return;
            }
        }
Ejemplo n.º 3
0
        private bool HasEnoughEnergy()
        {
            float?num;

            if (powerTrader == null)
            {
                num = null;
            }
            else
            {
                PowerNet powerNet = powerTrader.PowerNet;
                num = ((powerNet != null) ? new float?(powerNet.CurrentStoredEnergy()) : null);
            }
            float?num2 = num;
            float num3 = activePower;

            return(num2.GetValueOrDefault() >= num3 & num2 != null);
        }
Ejemplo n.º 4
0
        public override string CompInspectStringExtra()
        {
            if (PowerNet == null)
            {
                return("PowerNotConnected".Translate());
            }
            StringBuilder str = new StringBuilder();

            str.AppendLine("VoidNetConverterLabel1".Translate((-PowerConsumption).ToString("f0")));
            string value  = (PowerNet.CurrentEnergyGainRate() / CompPower.WattsToWattDaysPerTick).ToString("F0");
            string value2 = PowerNet.CurrentStoredEnergy().ToString("F0");

            str.Append("PowerConnectedRateStored".Translate(value, value2));
            if (Prefs.DevMode)
            {
                str.Append("\n" + "VoidNetConverterLabel2".Translate(energyCost.ToString("f3")) +
                           "\n" + "VoidNetConverterLabel3".Translate((convertRate * 100).ToString("F0")));
            }
            return(str.ToString());
        }
Ejemplo n.º 5
0
 public static bool Prefix(PowerNet __instance)
 {
     if (__instance.transmitters.Any(connector => connector.parent.GetComp <CompSteamAlternator>() != null))
     {
         float num  = __instance.CurrentEnergyGainRate();
         float num2 = __instance.CurrentStoredEnergy();
         if (num2 + num >= -1E-07f)
         {
             float num3;
             if (__instance.batteryComps.Count > 0 && num2 >= 0.1f)
             {
                 num3 = num2 - 5f;
             }
             else
             {
                 num3 = num2;
             }
             if (num3 + num >= 0f)
             {
                 List <CompPowerTrader> partsWantingPowerOn = new List <CompPowerTrader>();
                 for (int i = 0; i < __instance.powerComps.Count; i++)
                 {
                     if (!__instance.powerComps[i].PowerOn && FlickUtility.WantsToBeOn(__instance.powerComps[i].parent) && !__instance.powerComps[i].parent.IsBrokenDown())
                     {
                         partsWantingPowerOn.Add(__instance.powerComps[i]);
                     }
                 }
                 if (partsWantingPowerOn.Count > 0)
                 {
                     int num4 = 200 / partsWantingPowerOn.Count;
                     if (num4 < 30)
                     {
                         num4 = 30;
                     }
                     if (Find.TickManager.TicksGame % num4 == 0)
                     {
                         CompPowerTrader compPowerTrader = partsWantingPowerOn.RandomElement();
                         if (num + num2 >= -(compPowerTrader.EnergyOutputPerTick + 1E-07f))
                         {
                             compPowerTrader.PowerOn = true;
                             num += compPowerTrader.EnergyOutputPerTick;
                         }
                     }
                 }
             }
             Traverse.Create(__instance).Method("ChangeStoredEnergy", num).GetValue();
         }
         else if (Find.TickManager.TicksGame % 20 == 0)
         {
             List <CompPowerTrader> potentialShutdownParts = new List <CompPowerTrader>();
             for (int j = 0; j < __instance.powerComps.Count; j++)
             {
                 if (__instance.powerComps[j].PowerOn && __instance.powerComps[j].EnergyOutputPerTick < 0f)
                 {
                     potentialShutdownParts.Add(__instance.powerComps[j]);
                 }
             }
             if (potentialShutdownParts.Count > 0)
             {
                 potentialShutdownParts.RandomElement().PowerOn = false;
             }
         }
         return(false);
     }
     return(true);
 }
Ejemplo n.º 6
0
        public override void Tick()
        {
            base.Tick();

            if (this.StoredEnergy > 0)
            {
                this.StoredEnergy -= 0.01f;
            }
            else
            {
                if (!this.Downed)
                {
                    Hediff hediff = HediffMaker.MakeHediff(ProfSchmilvsPokemon.DefOfs.HediffDefOf.OutOfPower, this);
                    this.health.AddHediff(hediff);
                }
            }

            if (closestCompPower == null && this.StoredEnergy >= this.storedEnergyMax * 0.21f && this.Faction != null)
            {
                if (this.repairJob == null)
                {
                    List <Thing> toRepair = base.Map.listerBuildingsRepairable.RepairableBuildings(this.Faction);

                    if (!toRepair.NullOrEmpty())
                    {
                        this.repairJob = toRepair[0];
                        this.jobs.ClearQueuedJobs();
                        this.pather.StartPath(new LocalTargetInfo(this.repairJob.Position), Verse.AI.PathEndMode.Touch);
                    }
                }
                else
                {
                    if (this.repairJob.MaxHitPoints == this.repairJob.HitPoints)
                    {
                        base.Map.listerBuildingsRepairable.Notify_BuildingRepaired((Building)this.repairJob);
                        this.repairJob = null;
                        this.jobs.ClearQueuedJobs();
                    }
                    else
                    {
                        if (this.Position.AdjacentTo8WayOrInside(this.repairJob.Position))
                        {
                            this.repairing();
                        }
                        else if (this.pather.Destination != new LocalTargetInfo(this.repairJob.Position))
                        {
                            this.pather.StartPath(new LocalTargetInfo(this.repairJob.Position), Verse.AI.PathEndMode.Touch);
                        }
                    }
                }
            }

            if (closestCompPower != null && this.StoredEnergy >= this.storedEnergyMax)
            {
                closestCompPower = null;
                this.jobs.ClearQueuedJobs();
            }

            if (this.Downed)
            {
                if (this.StoredEnergy < this.storedEnergyMax * 0.2f)
                {
                    List <CompPower> dummylist = Spawner.spawnerPokemon.PowerComps;

                    if (!dummylist.NullOrEmpty())
                    {
                        float distance = 999999f;

                        foreach (CompPower cp in dummylist)
                        {
                            float compareDistance = this.Position.DistanceTo(cp.parent.Position);

                            if (compareDistance < distance)
                            {
                                distance         = compareDistance;
                                closestCompPower = cp;
                            }
                        }
                    }
                }

                if (this.Position.AdjacentTo8WayOrInside(this.closestCompPower.parent.Position))
                {
                    PowerNet pn = this.closestCompPower.PowerNet;
                    if (pn != null)
                    {
                        float currentEnergy = pn.CurrentStoredEnergy();
                        if (currentEnergy >= 0.5f)
                        {
                            List <CompPowerBattery> cpb = pn.batteryComps;
                            CompPowerBattery        bat = null;
                            foreach (CompPowerBattery c in cpb)
                            {
                                if (c.StoredEnergy >= 0.5f)
                                {
                                    bat = c;
                                    break;
                                }
                            }
                            if (bat != null)
                            {
                                this.StoredEnergy += 0.5f;
                                bat.DrawPower(0.5f);
                            }
                        }
                    }
                }

                if (this.StoredEnergy > this.storedEnergyMax * 0.2f)
                {
                    List <Hediff> heds = this.health.hediffSet.hediffs;
                    if (!heds.NullOrEmpty())
                    {
                        Hediff oop = null;
                        foreach (Hediff h in heds)
                        {
                            if (h.def.Equals(ProfSchmilvsPokemon.DefOfs.HediffDefOf.OutOfPower))
                            {
                                oop = h;
                            }
                        }
                        if (oop != null)
                        {
                            this.health.RemoveHediff(oop);
                        }
                    }
                }
            }
            else
            {
                if (closestCompPower == null)
                {
                    if (this.StoredEnergy > 0 && this.StoredEnergy < this.storedEnergyMax * 0.2f)
                    {
                        List <CompPower> dummylist = Spawner.spawnerPokemon.PowerComps;

                        if (!dummylist.NullOrEmpty())
                        {
                            float distance = 999999f;

                            foreach (CompPower cp in dummylist)
                            {
                                float compareDistance = this.Position.DistanceTo(cp.parent.Position);

                                if (compareDistance < distance)
                                {
                                    distance         = compareDistance;
                                    closestCompPower = cp;
                                }
                            }

                            this.pather.StartPath(new LocalTargetInfo(this.closestCompPower.parent.Position), Verse.AI.PathEndMode.OnCell);
                        }
                    }
                }
                else
                {
                    if (this.Position.AdjacentTo8WayOrInside(this.closestCompPower.parent.Position))
                    {
                        PowerNet pn = this.closestCompPower.PowerNet;
                        if (pn != null)
                        {
                            float currentEnergy = pn.CurrentStoredEnergy();
                            if (currentEnergy >= 0.5f)
                            {
                                List <CompPowerBattery> cpb = pn.batteryComps;
                                CompPowerBattery        bat = null;
                                foreach (CompPowerBattery c in cpb)
                                {
                                    if (c.StoredEnergy >= 0.5f)
                                    {
                                        bat = c;
                                        break;
                                    }
                                }
                                if (bat != null)
                                {
                                    this.StoredEnergy += 0.5f;
                                    bat.DrawPower(0.5f);

                                    this.evolve();
                                }
                            }
                        }
                    }
                    else
                    {
                        if (this.pather.Destination != new LocalTargetInfo(this.closestCompPower.parent.Position))
                        {
                            this.jobs.ClearQueuedJobs();
                            this.pather.StartPath(new LocalTargetInfo(this.closestCompPower.parent.Position), Verse.AI.PathEndMode.Touch);
                        }
                    }
                }
            }
        }
Ejemplo n.º 7
0
        static bool Prefix(ref PowerNet __instance)
        {
            float extra = __instance.CurrentEnergyGainRate() * RefcellRespeedConfig.currentTimeMultiplier;
            float num1  = __instance.CurrentStoredEnergy();

            if ((double)num1 + (double)extra >= -1.0000000116861E-07 && !__instance.Map.gameConditionManager.ElectricityDisabled)
            {
                if ((__instance.batteryComps.Count <= 0 || (double)num1 < 0.100000001490116 ? (double)num1 : (double)(num1 - 5f)) + (double)extra >= 0.0)
                {
                    PowerNet.partsWantingPowerOn.Clear();
                    for (int index = 0; index < __instance.powerComps.Count; ++index)
                    {
                        if (!__instance.powerComps[index].PowerOn && FlickUtility.WantsToBeOn((Thing)__instance.powerComps[index].parent) && !__instance.powerComps[index].parent.IsBrokenDown())
                        {
                            PowerNet.partsWantingPowerOn.Add(__instance.powerComps[index]);
                        }
                    }
                    if (PowerNet.partsWantingPowerOn.Count > 0)
                    {
                        int num2 = 200 / PowerNet.partsWantingPowerOn.Count;
                        if (num2 < 30)
                        {
                            num2 = 30;
                        }
                        if (Find.TickManager.TicksGame % num2 < RefcellRespeedConfig.currentTimeMultiplier)
                        {
                            int num3 = Mathf.Max(1, Mathf.RoundToInt((float)PowerNet.partsWantingPowerOn.Count * 0.05f));
                            for (int index = 0; index < num3; ++index)
                            {
                                CompPowerTrader compPowerTrader = PowerNet.partsWantingPowerOn.RandomElement <CompPowerTrader>();
                                if (!compPowerTrader.PowerOn && (double)extra + (double)num1 >= -((double)compPowerTrader.EnergyOutputPerTick + 1.0000000116861E-07))
                                {
                                    compPowerTrader.PowerOn = true;
                                    extra += compPowerTrader.EnergyOutputPerTick;
                                }
                            }
                        }
                    }
                }
                __instance.ChangeStoredEnergy(extra);
            }
            else
            {
                if (Find.TickManager.TicksGame % 20 > RefcellRespeedConfig.currentTimeMultiplier - 1)
                {
                    return(false);
                }
                PowerNet.potentialShutdownParts.Clear();
                for (int index = 0; index < __instance.powerComps.Count; ++index)
                {
                    if (__instance.powerComps[index].PowerOn && (double)__instance.powerComps[index].EnergyOutputPerTick < 0.0)
                    {
                        PowerNet.potentialShutdownParts.Add(__instance.powerComps[index]);
                    }
                }
                if (PowerNet.potentialShutdownParts.Count <= 0)
                {
                    return(false);
                }
                int num2 = Mathf.Max(1, Mathf.RoundToInt((float)PowerNet.potentialShutdownParts.Count * 0.05f));
                for (int index = 0; index < num2; ++index)
                {
                    PowerNet.potentialShutdownParts.RandomElement <CompPowerTrader>().PowerOn = false;
                }
            }
            return(false);
        }