public override void ExposeData() { base.ExposeData(); this.compPowerTrader = base.GetComp <CompPowerTrader>(); this.compTempControl = base.GetComp <CompTempControl>(); //this.compHeatPusher = base.GetComp<CompHeatPusher>(); }
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>(); }
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); }
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) ); }
/// <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); }
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); }
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)); } }
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); }
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); }
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>(); }
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>(); }