public override void ExposeData()
 {
     base.ExposeData();
     this.compPowerTrader = base.GetComp <CompPowerTrader>();
     this.compTempControl = base.GetComp <CompTempControl>();
     //this.compHeatPusher = base.GetComp<CompHeatPusher>();
 }
示例#2
0
        public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense)
        {
            CompTempControl tempControl    = req.Thing.TryGetComp <CompTempControl>();
            Thing           tempController = req.Thing;

            IntVec3 intVec3_2 = tempController.Position + IntVec3.North.RotatedBy(tempController.Rotation);
            IntVec3 intVec3_1 = tempController.Position + IntVec3.South.RotatedBy(tempController.Rotation);

            float cooledRoomTemp          = intVec3_1.GetTemperature(tempController.Map);
            float extRoomTemp             = intVec3_2.GetTemperature(tempController.Map);
            float efficiencyLossPerDegree = 1.0f / 130.0f;                                             // SOS2 internal value, means loss of efficiency for each degree above targettemp, lose 50% at 65C above targetTemp, 100% at 130+
            float energyPerSecond         = tempControl.Props.energyPerSecond;                         // the power of the radiator
            float roomSurface             = intVec3_1.GetRoomGroup(tempController.Map).CellCount;
            float coolingConversionRate   = 4.16666651f;                                               // Celsius cooled per Joules*Second*Meter^2  conversion rate
            float sidesTempGradient       = extRoomTemp - (cooledRoomTemp < 40 ? cooledRoomTemp : 40);
            float efficiency     = (1f - sidesTempGradient * efficiencyLossPerDegree);                 // a negative value indicates heat generation
            float maxACPerSecond = energyPerSecond * efficiency / roomSurface * coolingConversionRate; // max cooling power possible, positive value indicates heat generation

            SEB seb = new SEB("StatsReport_RWHS");

            seb.Simple("CooledRoomTemp", cooledRoomTemp);
            seb.Simple("ExteriorRoomTemp", extRoomTemp);
            seb.Simple("EfficiencyLossPerDegree", efficiencyLossPerDegree);
            seb.Simple("EnergyPerSecond", energyPerSecond);
            seb.Simple("CooledRoomSurface", roomSurface);
            seb.Simple("ACConversionRate", coolingConversionRate);
            seb.Full("SidesTempGradient", sidesTempGradient, extRoomTemp, cooledRoomTemp);
            seb.Full("RelativeEfficiency", efficiency * 100, sidesTempGradient, efficiencyLossPerDegree);
            seb.Full("MaxACPerSecond", maxACPerSecond, energyPerSecond, efficiency, roomSurface, coolingConversionRate);

            return(seb.ToString());
        }
 public override void SpawnSetup(Map map, bool respawningAfterLoad)
 {
     base.SpawnSetup(map, respawningAfterLoad);
     this.compTempControl = base.GetComp <CompTempControl>();
     this.compPowerTrader = base.GetComp <CompPowerTrader>();
     //this.compHeatPusher = base.GetComp<CompHeatPusher>();
 }
示例#4
0
        public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense)
        {
            StringBuilder   stringBuilder  = new StringBuilder();
            CompTempControl tempControl    = req.Thing.TryGetComp <CompTempControl>();
            Thing           tempController = req.Thing;

            float roomTemp              = tempController.Position.GetTemperature(tempController.Map);
            float energyPerSecond       = tempControl.Props.energyPerSecond; // the power of the radiator
            float roomSurface           = tempController.Position.GetRoomGroup(tempController.Map).CellCount;
            float coolingConversionRate = 4.16666651f;                       // Celsius cooled per Joules*Second*Meter^2  conversion rate
            float minTemp        = 20;
            float maxTemp        = 120;
            float efficiency     = 1 - Mathf.Min(Mathf.Max((roomTemp - minTemp) / (maxTemp - minTemp), 0), 1);
            float maxACPerSecond = energyPerSecond * efficiency / roomSurface * coolingConversionRate; // max cooling power possible

            SEB seb = new SEB("StatsReport_RWHS");

            seb.Simple("AmbientRoomTemp", roomTemp);
            seb.Simple("EnergyPerSecond", energyPerSecond);
            seb.Simple("RoomSurface", roomSurface);
            seb.Simple("ACConversionRate", coolingConversionRate);
            seb.Full("LerpEfficiency", efficiency * 100, roomTemp, minTemp, maxTemp);
            seb.Full("MaxACPerSecond", maxACPerSecond, energyPerSecond, efficiency, roomSurface, coolingConversionRate);

            return(seb.ToString());
        }
        // Token: 0x06000005 RID: 5 RVA: 0x00002140 File Offset: 0x00000340
        public static TempControlType AnalyzeType(this CompTempControl tempControl)
        {
            var energyPerSecond = tempControl.Props.energyPerSecond;

            return(energyPerSecond > 0f ? TempControlType.Heater :
                   energyPerSecond < 0f ? TempControlType.Cooler : TempControlType.None);
        }
示例#6
0
        public override void PostSpawnSetup(bool respawningAfterLoad)
        {
            base.PostSpawnSetup(respawningAfterLoad);
            if (Props.dependsOnPower)
            {
                powerComp = this.parent.GetComp <CompPowerTrader>();
            }
            if (Props.dependsOnFuel)
            {
                fuelComp = this.parent.GetComp <CompRefuelable>();
            }
            if (Props.dependsOnGas)
            {
                gasComp = GetGasComp();
            }
            if (Props.flickable)
            {
                compFlickable = this.parent.GetComp <CompFlickable>();
            }
            if (!Props.dependsOnFuel && !Props.dependsOnPower)
            {
                active = true;
            }

            tempControlComp       = this.parent.GetComp <CompTempControl>();
            this.position         = this.parent.Position;
            this.map              = this.parent.Map;
            this.proxyHeatManager = this.map.GetComponent <ProxyHeatManager>();
            if (Props.dependsOnPower || Props.dependsOnFuel || Props.dependsOnGas || Props.flickable)
            {
                this.proxyHeatManager.compTemperaturesToTick.Add(this);
            }

            this.MarkDirty();
        }
        /// <summary>
        /// Calculate the Temperature Delta for the Tick.
        /// </summary>
        /// <param name="compTempControl">Temperature Control Component</param>
        private void GenerateDelta(CompTempControl compTempControl)
        {
            var targetDelta  = TargetTemperature - IntakeTemperature;
            var currentDelta = ConvertedTemperature - IntakeTemperature;

            IsHeating = TargetTemperature > IntakeTemperature;

            if (Mathf.Abs(targetDelta - currentDelta) < 1.0f)
            {
                DeltaTemperature += (targetDelta - currentDelta);
                IsStable          = true;
                return;
            }

            IsStable = false;
            //var deltaDelta = targetDelta - currentDelta;

            //var deltaSmoothened = deltaDelta / DeltaSmooth;
            //var deltaSmoothened = (targetDelta - currentDelta) / DeltaSmooth;
            //DeltaTemperature += (compTempControl.Props.energyPerSecond * AirFlowNet.ThermalEfficiency) * deltaSmoothened;
            DeltaTemperature += (
                (compTempControl.Props.energyPerSecond
                 * AirFlowNet.ThermalEfficiency)
                * ((targetDelta - currentDelta) / DeltaSmooth)
                );
        }
示例#8
0
        /// <summary>
        /// Tick for Climate Control
        /// Here we calculate the growth of Delta Temperature which is increased or decrased based on Intake and Target Temperature.
        /// </summary>
        /// <param name="compTempControl">Current Temperature Control Component of the Building</param>
        public void TickRare(CompTempControl compTempControl)
        {
            IntakeTemperature    = AirFlowNet.AverageIntakeTemperature;
            TargetTemperature    = compTempControl.targetTemperature;
            ConvertedTemperature = IntakeTemperature + DeltaTemperature;

            GenerateDelta(compTempControl);
        }
示例#9
0
        public static float GetMaxACPerSecond(StatRequest req, bool applyPostProcess = true)
        {
            CompTempControl tempControl    = req.Thing.TryGetComp <CompTempControl>();
            Thing           tempController = req.Thing;

            float roomTemp              = tempController.Position.GetTemperature(tempController.Map);
            float energyPerSecond       = tempControl.Props.energyPerSecond;                                  // the power of the radiator
            float roomSurface           = tempController.Position.GetRoomGroup(tempController.Map).CellCount;
            float coolingConversionRate = 4.16666651f;                                                        // Celsius cooled per Joules*Second*Meter^2  conversion rate
            float efficiency            = 1 - Mathf.Min(Mathf.Max((roomTemp - 20) / (120 - 20), 0), 1);
            float maxACPerSecond        = energyPerSecond * efficiency / roomSurface * coolingConversionRate; // max cooling power possible

            return(maxACPerSecond);
        }
        public static float GetMaxACPerSecond(StatRequest req, bool applyPostProcess = true)
        {
            CompTempControl tempControl    = req.Thing.TryGetComp <CompTempControl>();
            Thing           tempController = req.Thing;

            IntVec3 intVec3_1 = tempController.Position + IntVec3.North.RotatedBy(tempController.Rotation);

            float energyPerSecond       = tempControl.Props.energyPerSecond;                                  // the power of the radiator
            float roomSurface           = GetRoomSurface(req.Thing);                                          // the power of the radiator
            float coolingConversionRate = 4.16666651f;                                                        // Celsius cooled per JoulesSecond*Meter^2  conversion rate
            float efficiency            = GetCurrentEfficiency(req);
            float maxACPerSecond        = energyPerSecond * efficiency / roomSurface * coolingConversionRate; // max cooling power possible

            return(maxACPerSecond);
        }
示例#11
0
        public static float GetCurrentACPerSecond(StatRequest req, bool applyPostProcess = true)
        {
            CompTempControl tempControl    = req.Thing.TryGetComp <CompTempControl>();
            Thing           tempController = req.Thing;

            float roomTemp       = tempController.Position.GetTemperature(tempController.Map);
            float targetTemp     = tempControl.targetTemperature;
            float targetTempDiff = targetTemp - roomTemp;
            float maxACPerSecond = GetMaxACPerSecond(req); // max cooling power possible
            bool  isHeater       = tempControl.Props.energyPerSecond > 0;

            if (isHeater)
            {
                return(Mathf.Max(Mathf.Min(targetTempDiff, maxACPerSecond), 0));
            }
            else
            {
                return(Mathf.Min(Mathf.Max(targetTempDiff, maxACPerSecond), 0));
            }
        }
示例#12
0
        public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense)
        {

            StringBuilder stringBuilder = new StringBuilder();
            CompTempControl tempControl = req.Thing.TryGetComp<CompTempControl>();
            Thing tempController = req.Thing;

            IntVec3 intVec3_1 = tempController.Position + IntVec3.South.RotatedBy(tempController.Rotation);

            float cooledRoomTemp = intVec3_1.GetTemperature(tempController.Map);
            float targetTemp = tempControl.targetTemperature;
            float targetTempDiff = targetTemp - cooledRoomTemp;
            float maxACPerSecond = RWHS_TempControl_RoomExchange.GetMaxACPerSecond(req); // max cooling power possible            
            bool isHeater = tempControl.Props.energyPerSecond > 0;
            float actualAC;
            if (isHeater)
            {
                actualAC = Mathf.Max(Mathf.Min(targetTempDiff, maxACPerSecond), 0);
            }
            else
            {
                actualAC = Mathf.Min(Mathf.Max(targetTempDiff, maxACPerSecond), 0);
            }

            SEB seb = new SEB("StatsReport_RWHS");
            seb.Simple("CooledRoomTemp", cooledRoomTemp);
            seb.Simple("TargetTemperature", targetTemp);
            seb.Full("TargetTempDiff", targetTempDiff, targetTemp, cooledRoomTemp );
            seb.Simple("MaxACPerSecond", maxACPerSecond);
            if (isHeater)
            {
                seb.Full("ActualHeaterACPerSecond", actualAC, targetTempDiff, maxACPerSecond);
            }
            else
            {
                seb.Full("ActualCoolerACPerSecond", actualAC, targetTempDiff, maxACPerSecond);
            }

            return seb.ToString();
        }
 // Token: 0x06000004 RID: 4 RVA: 0x000020A0 File Offset: 0x000002A0
 public static CompTempControl GetTempControl(this Room room, TempControlType targetType)
 {
     foreach (IntVec3 c in room.Cells)
     {
         Building firstBuilding = c.GetFirstBuilding(room.Map);
         bool     flag          = firstBuilding != null && firstBuilding.Powered();
         if (flag)
         {
             CompTempControl comp  = firstBuilding.GetComp <CompTempControl>();
             bool            flag2 = comp != null;
             if (flag2)
             {
                 bool flag3 = (comp.AnalyzeType() & targetType) > TempControlType.None;
                 if (flag3)
                 {
                     return(comp);
                 }
             }
         }
     }
     return(null);
 }
示例#14
0
        public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense)
        {
            CompTempControl tempControl    = req.Thing.TryGetComp <CompTempControl>();
            Thing           tempController = req.Thing;

            float roomTemp       = tempController.Position.GetTemperature(tempController.Map);
            float targetTemp     = tempControl.targetTemperature;
            float targetTempDiff = targetTemp - roomTemp;
            float maxACPerSecond = RWHS_TempControl_InPlace.GetMaxACPerSecond(req); // max cooling power possible
            bool  isHeater       = tempControl.Props.energyPerSecond > 0;
            float actualAC;

            if (isHeater)
            {
                actualAC = Mathf.Max(Mathf.Min(targetTempDiff, maxACPerSecond), 0);
            }
            else
            {
                actualAC = Mathf.Min(Mathf.Max(targetTempDiff, maxACPerSecond), 0);
            }

            SEB seb = new SEB("StatsReport_RWHS");

            seb.Simple("AmbientRoomTemp", roomTemp);
            seb.Simple("TargetTemperature", targetTemp);
            seb.Full("TargetTempDiff", targetTempDiff, targetTemp, roomTemp);
            seb.Simple("MaxACPerSecond", maxACPerSecond);
            if (isHeater)
            {
                seb.Full("ActualHeaterACPerSecond", actualAC, targetTempDiff, maxACPerSecond);
            }
            else
            {
                seb.Full("ActualCoolerACPerSecond", actualAC, targetTempDiff, maxACPerSecond);
            }

            return(seb.ToString());
        }
 /// <summary>
 /// Building spawned on the map
 /// </summary>
 /// <param name="map">RimWorld Map</param>
 /// <param name="respawningAfterLoad">Unused flag</param>
 public override void SpawnSetup(Map map, bool respawningAfterLoad)
 {
     CompTempControl        = GetComp <CompTempControl>();
     CompAirFlowTempControl = GetComp <CompAirFlowTempControl>();
     base.SpawnSetup(map, respawningAfterLoad);
 }
示例#16
0
        public static TempControlType AnalyzeType(this CompTempControl tempControl)
        {
            float f = tempControl.Props.energyPerSecond;

            return(f > 0 ? TempControlType.Heater : f < 0 ? TempControlType.Cooler : TempControlType.None);
        }
 public override void SpawnSetup()
 {
     base.SpawnSetup();
     this.compTempControl = base.GetComp<CompTempControl>();
     this.compPowerTrader = base.GetComp<CompPowerTrader>();
 }
示例#18
0
 public override void SpawnSetup(Map map, bool respawningAfterLoad)
 {
     base.SpawnSetup(map, respawningAfterLoad);
     compTempControl = GetComp <CompTempControl>();
     compRefuelable  = GetComp <CompRefuelable>();
 }
 public override void SpawnSetup()
 {
     base.SpawnSetup();
     this.compTempControl = base.GetComp <CompTempControl>();
     this.compPowerTrader = base.GetComp <CompPowerTrader>();
 }