"Wie funktioniert das Room-Temperatur-Equalization-System intern?"
District = zusammenhängende Regions gleichen Typs (Normal/Fence/ImpassableFreeAir).
Room = Districts die über Portal-Regions (Türen) verbunden sind.
Ein Raum kann mehrere Districts haben.
Verse/Room.cs:1-937 Verse/RegionAndRoomUpdater.cs:1-409
Alle 120 Ticks (~2 Sekunden Spielzeit, Offset 7) berechnet Verse/MapTemperature.cs:1-254 die Temperatur für jeden Room auf der Map. Die eigentliche Berechnung delegiert an Verse/RoomTempTracker.cs:1-325, der pro Room 4 Equalization-Quellen addiert.
TempDiffFromOutdoorsAdjusted logarithmisch gedämpft bei extremen Differenzen
(>100°C Differenz: Faktor ×5 → ×1). Verhindert extreme Oszillation.
Bei Room-Rebuild werden equalizeCells neu gesammelt und Shuffle() aufgerufen:
equalizeCells.Shuffle() verbraucht Rand-Calls.
Wenn Rooms auf verschiedenen Clients zu unterschiedlichen Zeitpunkten rebuilt werden
→ unterschiedliche Rand-Sequenz → Desync.
Wärme fließt durch Wände zu Nachbar-Rooms. equalizeCells = Zellen die 2 Wände entfernt in angrenzenden Rooms liegen. 20% der Zellen werden pro Tick-Intervall verarbeitet (cycleIndex rotiert).
Achtung: Für ALLE Wand-Materialien identisch — Holz isoliert wie Granit!
Verse/RoomTempTracker.cs:WallEqualizationLangsamer Ausgleich mit Außentemperatur durch dünnes Dach.
Bei 100% ThinRoof und 20°C Differenz: ~0.12°C pro Intervall. Sehr langsam.
Verse/RoomTempTracker.cs:EqualizeTemperatureOffene Zellen ohne Dach. 14× schneller als ThinRoof!
0.0007 / 0.00005 = 14× schneller als ThinRoof. Bei 50% offen und 20°C Diff: ~1.68°C pro Intervall.
Verse/RoomTempTracker.cs:EqualizeTemperatureThickRoof-Zellen ziehen Temperatur Richtung 15°C. Wirkt NUR als Kühlung — wenn Room >15°C kein Effekt. Auf Underground-Maps: 40× schnellerer Ausgleich.
Zieltemperatur: 15°C (TemperatureTuning.DeepUndergroundTemperature)
Verse/RoomTempTracker.cs:EqualizeTemperatureTüren haben eigene Equalization-Regeln:
| Tür-Typ | Verhalten | Intervall |
|---|---|---|
| Offene Tür | EqualizeTemperaturesThroughBuilding — Durchschnitt beider Seiten | 34 Ticks |
| Geschlossene Tür | EqualizeTemperaturesThroughBuilding — langsamer | 375 Ticks |
| Isolierte Tür (nur von Türen umgeben) | Normale WallEqualization stattdessen | 120 Ticks |
| Vent-Gebäude | EqualizeTemperaturesThroughBuilding × 14 Rate | Wie Tür |
Verse/GenTemperature.cs:EqualizeTemperaturesThroughBuilding
| Property | Bedingung | Bedeutung |
|---|---|---|
UsesOutdoorTemperature | ≥25% kein Dach ODER TouchesMapEdge | Temperatur = Outdoor (keine Equalization) |
PsychologicallyOutdoors | ≥300 offene Dachzellen ODER (MapEdge + ≥50% offen) | Pawns fühlen sich "draußen" |
OutdoorsForWork | >100 offene Zellen ODER >25% offen | Arbeitsplatz-Bewertung |
IsHuge | >60 Regions | Stats werden NICHT berechnet |
ProperRoom | !TouchesMapEdge + min. 1 Normal-Region | Echter Innenraum |
| Methode | Formel | Zweck |
|---|---|---|
PushHeat(cell, energy) |
Room.Temperature += energy / CellCount |
Feuer, Explosionen, Lagerfeuer |
ControlTemperatureTempChange |
delta = min(targetDiff, energy/CellCount), geclampt auf Vorzeichen |
Heater/Cooler steuern auf Zieltemperatur |
EqualizeTemperaturesThroughBuilding |
Durchschnittstemperatur der angrenzenden Rooms × Rate × Vakuum-Faktor | Türen, Vents (Rate: Tür=1.0, Vent=14.0) |
Verse/GenTemperature.cs:1-533
ComfortableTemperatureRange = Pawn-Stat ± 10°C Puffer (SafeTemperatureRange).
Außerhalb davon → Hypothermia/Heatstroke Hediffs.Wenn eine Wand/Tür gebaut oder entfernt wird:
Verse/RegionAndRoomUpdater.cs:1-409
| Konstante | Wert | Bedeutung |
|---|---|---|
MinTemperature | -273.15°C | Absoluter Nullpunkt |
MaxTemperature | 1000°C | Temperatur-Cap |
DefaultTemperature | 21°C | Start-Temperatur |
DeepUndergroundTemperature | 15°C | Mountain-Zieltemperatur |
RoomEqualizeInterval | 120 Ticks | ~2 Sekunden (Offset 7) |
WallEqualizeFactor | 0.00017f | Pro Wand-Zelle, alle Materialien gleich |
ThinRoofFactor | 5E-05f | Dünnes Dach Equalization |
NoRoofFactor | 0.0007f | Offenes Dach (14× ThinRoof) |
UndergroundFactor | 0.002f | Underground-Map (40× normal) |
Vent_TempEqualizeRate | 14.0 | Vent = 14× Tür |
Door Open Interval | 34 Ticks | Tür offen Equalize-Intervall |
Door Closed Interval | 375 Ticks | Tür geschlossen Equalize-Intervall |
Refrigeration | <10°C | Essen haltbar |
Freezing | <0°C | Essen gefroren |
Seasonal Amplitude | 3-28°C | Je nach Breitengrad (Kurve) |
Verse/TemperatureTuning.cs:1-45
3 Quellen, in Prioritätsreihenfolge:
| Priorität | Quelle | Wann |
|---|---|---|
| 1 | Biome.constantOutdoorTemperature | Biome mit fester Temp (z.B. Underground) |
| 2 | PocketMap.temperature | Pocket-Maps (Anomaly DLC) |
| 3 | World.tileTemperatures | Normal: Breitengrad + Jahreszeit + Sonnenzyklus |
Sonnenzyklus: Cosinus, 7°C Amplitude, Peak bei 0.32 Tageszeit (ca. 19:40).
Jahreszeit: Cosinus, 3-28°C Amplitude je nach Breitengrad.
Verse/GenTemperature.cs:OffsetFromSunCycle, OffsetFromSeasonCycle
Wenn du das Temperatur-System änderst, haben diese Systeme direkte Auswirkungen:
Das Temperatur-System ist vollständig erfasst. Alle relevanten Dateien (Room.cs, RoomTempTracker.cs, GenTemperature.cs, MapTemperature.cs, TemperatureTuning.cs, RegionAndRoomUpdater.cs) wurden analysiert.
Building_Vent.cs — Vent-Gebäude intern (wie TickRare → EqualizeTemperatures aufruft)Building_Cooler.cs — Cooler-Logik (Intake/Output Side, EnergyPerTick)CompTempControl.cs — Shared Comp für Heater/Cooler UI und TargetTemp