diff --git a/tools/transpile-engine/transpile.py b/tools/transpile-engine/transpile.py index c3e45d01..3f7df487 100644 --- a/tools/transpile-engine/transpile.py +++ b/tools/transpile-engine/transpile.py @@ -61,6 +61,7 @@ REQUIRED_GD_FUNCTIONS: list[tuple[str, str]] = [ ("climate", "_update_lake_evaporation"), ("climate", "_update_deep_earth_water"), ("climate", "_update_precipitation"), + ("climate_base", "_check_terrain_evolution"), ("climate", "_compute_global_stats"), ("climate", "_clear_magic_deltas"), ("climate_spec_eval", "ideal_terrain"), @@ -182,6 +183,7 @@ METHOD_MAP = [ ("_update_lake_evaporation", "stepLakeEvaporation", "private"), ("_update_deep_earth_water", "stepDeepEarthWater", "private"), ("_update_precipitation", "stepPrecipitation", "private"), + ("_check_terrain_evolution", "stepTerrainEvolution", "HAND_WRITTEN"), ("_compute_global_stats", "stepGlobalStats", "private"), ("_clear_magic_deltas", "stepClearDeltas", "private"), ] @@ -353,6 +355,7 @@ export class ClimatePhysics { this.stepLakeEvaporation(grid) this.stepDeepEarthWater(grid) this.stepPrecipitation(grid) + this.stepTerrainEvolution(grid) const events = this.stepEcologicalEvents(grid, turn, seed) this.stepAnchorDecay(grid) this.stepGlobalStats(grid) @@ -361,25 +364,24 @@ export class ClimatePhysics { } private stepOrbitalForcing(grid: GridState, turn: number): void { - const orbitalRaw = (this.params as Record)['orbital_cycles'] - if (!orbitalRaw) return - const orbital = orbitalRaw as Record - const cycles = (orbital['cycles'] ?? []) as Array> - if (cycles.length === 0) return - - let totalDelta = 0.0 const t = turn - for (const cycle of cycles) { - const period = cycle['period'] ?? 200.0 - const amplitude = cycle['amplitude'] ?? 0.01 - const phase = cycle['phase'] ?? 0.0 + let totalDelta = 0.0 + for (let i = 1; i <= 3; i++) { + const prefix = `orbital_cycle_${i}_` + const period = this.p(prefix + 'period', 0.0) + if (period <= 0.0) continue + const amplitude = this.p(prefix + 'amplitude', 0.0) + const phase = this.p(prefix + 'phase', 0.0) totalDelta += amplitude * Math.sin(2 * Math.PI * (t / period) + phase) } if (Math.abs(totalDelta) < 0.0001) return + const moistureCoupling = this.p('orbital_moisture_coupling', 0.5) + for (const tile of grid.tiles) { tile.magic_heat_delta += totalDelta + tile.magic_moisture_delta += totalDelta * moistureCoupling } }