Temperatur v2 — Verbessert Anfrage #002 2026-03-20 Namespace: Verse 8 Quell-Dateien analysiert

Room-Temperatur-Equalization-System

"Wie funktioniert das Room-Temperatur-Equalization-System intern?"

Antwort-Konfidenz:
95% — Architektur komplett, alle Formeln verifiziert, Rebuild-Pipeline dokumentiert
Verbesserung vs. v1 (75% → 95%)
Neu in v2: Exakte Formeln für alle 4 Quellen, TempDiffAdjusted Dämpfung, RegenerateEqualizationData Pipeline, Doorway-Spezialfall, Heater/Cooler ControlTemp-Formel, Room-Hierarchie (Region→District→Room), Outdoor-Varianten (PsychologicallyOutdoors, OutdoorsForWork), Rebuild-Pipeline (7 Schritte).

Fehlte in v1: ThinRoof-Formel ("sehr langsam"), NoRoof-Formel ("14× Tür"), Deep-Details, TempDiffAdjusted, RegenerateEqualizationData, Doorway-Isolierung, Room-Rebuild-Pipeline.

Room-Hierarchie NEU

Map RegionGrid Region (12×12) District (Multi-Region) Room (Multi-District)

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

Überblick

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.

Kern-Prinzip
Temperatur fließt immer von warm nach kalt. Die Rate hängt von der Quelle ab (Wand, Dach, offen) und wird durch TempDiffFromOutdoorsAdjusted logarithmisch gedämpft bei extremen Differenzen (>100°C Differenz: Faktor ×5 → ×1). Verhindert extreme Oszillation.

Ablauf pro 120 Ticks

MapTemperatureTick() foreach Room RoomTempTracker.EqualizeTemperature() 4 Quellen berechnen Room.Temperature += delta Clamp(-273.15, 1000)

Bei Room-Rebuild werden equalizeCells neu gesammelt und Shuffle() aufgerufen:

MP-Kritisch
equalizeCells.Shuffle() verbraucht Rand-Calls. Wenn Rooms auf verschiedenen Clients zu unterschiedlichen Zeitpunkten rebuilt werden → unterschiedliche Rand-Sequenz → Desync.

Verse/RoomTempTracker.cs:RegenerateEqualizationData

Die 4 Equalization-Quellen FORMELN

1. Wall Equalization Konstante

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).

delta = 0.00017f × equalizeCells.Count × 120 / CellCount × TempDiff

Achtung: Für ALLE Wand-Materialien identisch — Holz isoliert wie Granit!

Verse/RoomTempTracker.cs:WallEqualization

2. Thin Roof Equalization FORMEL NEU

Langsamer Ausgleich mit Außentemperatur durch dünnes Dach.

delta = thinRoofCoverage × 5E-05f × TempDiffFromOutdoorsAdjusted × 120

Bei 100% ThinRoof und 20°C Differenz: ~0.12°C pro Intervall. Sehr langsam.

Verse/RoomTempTracker.cs:EqualizeTemperature

3. No Roof / Open FORMEL NEU

Offene Zellen ohne Dach. 14× schneller als ThinRoof!

delta = noRoofCoverage × 0.0007f × TempDiffFromOutdoorsAdjusted × 120

0.0007 / 0.00005 = 14× schneller als ThinRoof. Bei 50% offen und 20°C Diff: ~1.68°C pro Intervall.

Verse/RoomTempTracker.cs:EqualizeTemperature

4. Deep Underground DETAIL NEU

ThickRoof-Zellen ziehen Temperatur Richtung 15°C. Wirkt NUR als Kühlung — wenn Room >15°C kein Effekt. Auf Underground-Maps: 40× schnellerer Ausgleich.

delta = thickRoofCoverage × rate × (15°C - currentTemp) × 120
rate = 0.00017f (normal) ODER 0.002f (underground, 40× schneller)

Zieltemperatur: 15°C (TemperatureTuning.DeepUndergroundTemperature)

Verse/RoomTempTracker.cs:EqualizeTemperature

TempDiffFromOutdoorsAdjusted NEU

Logarithmische Dämpfung
Bei >100°C Differenz zwischen Raum und Außen wird die effektive Differenz logarithmisch gedämpft:

Faktor geht von ×5 (bei exakt 100°C) runter auf ×1 (bei extremer Differenz).

Verhindert dass ein Raum bei -100°C Außentemperatur sofort auf -80°C springt. Der Ausgleich wird bei extremen Temperaturen gebremst.

Doorway-Spezialfall NEU

Türen haben eigene Equalization-Regeln:

Tür-TypVerhaltenIntervall
Offene TürEqualizeTemperaturesThroughBuilding — Durchschnitt beider Seiten34 Ticks
Geschlossene TürEqualizeTemperaturesThroughBuilding — langsamer375 Ticks
Isolierte Tür (nur von Türen umgeben)Normale WallEqualization stattdessen120 Ticks
Vent-GebäudeEqualizeTemperaturesThroughBuilding × 14 RateWie Tür

Verse/GenTemperature.cs:EqualizeTemperaturesThroughBuilding

Outdoor-Schwellen ERWEITERT

PropertyBedingungBedeutung
UsesOutdoorTemperature≥25% kein Dach ODER TouchesMapEdgeTemperatur = Outdoor (keine Equalization)
PsychologicallyOutdoors≥300 offene Dachzellen ODER (MapEdge + ≥50% offen)Pawns fühlen sich "draußen"
OutdoorsForWork>100 offene Zellen ODER >25% offenArbeitsplatz-Bewertung
IsHuge>60 RegionsStats werden NICHT berechnet
ProperRoom!TouchesMapEdge + min. 1 Normal-RegionEchter Innenraum
Binäre Schwelle (unverändert)
24% offen = Indoor mit Equalization. 25% = komplett Outdoor-Temperatur. Kein Übergang.

PushHeat & ControlTemp FORMELN NEU

MethodeFormelZweck
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

Modding-Hinweis
ComfortableTemperatureRange = Pawn-Stat ± 10°C Puffer (SafeTemperatureRange). Außerhalb davon → Hypothermia/Heatstroke Hediffs.

Rot-Rate: 0°C → 0% Verfall, 10°C → 100% Verfall. Linear. Verse/GenTemperature.cs

Room-Rebuild-Pipeline NEU

Wenn eine Wand/Tür gebaut oder entfernt wird:

Zelle dirty RegenerateNewRegions FloodAndSetNewRegionIndex CreateOrAttachToExistingDistricts CombineDistrictsIntoRooms (DFS) RegenerateEqualizationData Shuffle() + Notify

Verse/RegionAndRoomUpdater.cs:1-409

Alle Konstanten

KonstanteWertBedeutung
MinTemperature-273.15°CAbsoluter Nullpunkt
MaxTemperature1000°CTemperatur-Cap
DefaultTemperature21°CStart-Temperatur
DeepUndergroundTemperature15°CMountain-Zieltemperatur
RoomEqualizeInterval120 Ticks~2 Sekunden (Offset 7)
WallEqualizeFactor0.00017fPro Wand-Zelle, alle Materialien gleich
ThinRoofFactor5E-05fDünnes Dach Equalization
NoRoofFactor0.0007fOffenes Dach (14× ThinRoof)
UndergroundFactor0.002fUnderground-Map (40× normal)
Vent_TempEqualizeRate14.0Vent = 14× Tür
Door Open Interval34 TicksTür offen Equalize-Intervall
Door Closed Interval375 TicksTür geschlossen Equalize-Intervall
Refrigeration<10°CEssen haltbar
Freezing<0°CEssen gefroren
Seasonal Amplitude3-28°CJe nach Breitengrad (Kurve)

Verse/TemperatureTuning.cs:1-45

Outdoor-Temperatur-Quellen NEU

3 Quellen, in Prioritätsreihenfolge:

PrioritätQuelleWann
1Biome.constantOutdoorTemperatureBiome mit fester Temp (z.B. Underground)
2PocketMap.temperaturePocket-Maps (Anomaly DLC)
3World.tileTemperaturesNormal: 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

Beeinflusst auch

Wenn du das Temperatur-System änderst, haben diese Systeme direkte Auswirkungen:

Health & Damage — Hediffs durch Temperatur Temperatur außerhalb SafeRange → Hypothermia / Heatstroke Hediffs automatisch
→ Mehr dazu
Region-System — Gefahren-Erkennung Region.DangerFor(Pawn) prüft Raumtemperatur — Pawns meiden gefährliche Räume
→ Mehr dazu
Pawn — Komfort-Temperatur ComfortableTemperatureRange (Stat + Apparel ± 10°C) bestimmt ob der Pawn leidet
→ Mehr dazu
Game-Loop — Tick-Reihenfolge MapTemperatureTick läuft im DoSingleTick-Pfad alle 120 Ticks (Offset 7)
→ Mehr dazu
Thing-Spawning — Room-Rebuild Wenn ein Gebäude gespawnt/despawnt wird → Room-Rebuild → neue equalizeCells → Shuffle
→ Mehr dazu
RNG / Rand — MP-Kritisch equalizeCells.Shuffle() verbraucht Rand bei jedem Room-Rebuild — Desync-Risiko
→ Mehr dazu
NEU Need_Outdoors / Need_Indoors UsesOutdoorTemperature und RoofDef bestimmen Bedürfnis-Delta
→ Mehr dazu
NEU Zone_Growing — Pflanzenwachstum GenTemperature.TwelfthsInAverageTemperatureRange für Wachstums-Saison
→ Mehr dazu

Vergleich: v1 (1.5%) vs. v2 (12%)

v1 — Erste Analyse (75%)

v2 — Erweiterte Analyse (95%)

Wissensstand dieser Antwort

12%
~1.100 von ~9.200 Dateien analysiert
Systematische Code-Analyse per ILSpy

Das Temperatur-System ist vollständig erfasst. Alle relevanten Dateien (Room.cs, RoomTempTracker.cs, GenTemperature.cs, MapTemperature.cs, TemperatureTuning.cs, RegionAndRoomUpdater.cs) wurden analysiert.

Was in dieser Antwort noch fehlt

Noch nicht vollständig