diff --git a/engine/src/worlds/mars/climate_params.json b/engine/src/worlds/mars/climate_params.json new file mode 100644 index 00000000..9926afea --- /dev/null +++ b/engine/src/worlds/mars/climate_params.json @@ -0,0 +1,126 @@ +{ + "atmosphere": { + "pressure_bands": { + "polar_high_cut": 0.15, + "subpolar_low_cut": 0.30, + "subtropical_high_cut": 0.60, + "hadley_low_cut": 1.00, + "polar_high_hpa": 610.0, + "subpolar_low_hpa": 595.0, + "subtropical_high_hpa": 608.0, + "equatorial_low_hpa": 600.0 + }, + "pressure_terrain_modifiers": { + "mountain_per_0_1_elevation": 15.0, + "ocean_offset": 0.0, + "hot_land_threshold": 0.25, + "hot_land_offset": -3.0 + }, + "anomaly": { + "thermal_low_spawn_hpa": -8.0, + "cold_high_spawn_hpa": 8.0, + "tropical_low_spawn_hpa": -5.0, + "spawn_hot_temp_threshold": 0.20, + "spawn_cold_temp_threshold": 0.05, + "spawn_adjacent_cool_threshold": 0.12, + "spawn_ocean_hot_threshold": 0.30, + "decay_per_turn_hpa": 1.5, + "reinforce_per_turn_hpa": 2.0, + "max_anomaly_hpa": 25.0, + "drift_wind_fraction": 0.6, + "merge_radius_hexes": 3 + }, + "pressure_wind": { + "gradient_scale": 0.06, + "speed_scale": 0.05, + "coriolis_scale": 0.25 + }, + "humidity": { + "ocean_evap_rate": 0.0, + "soil_contribution": 0.0, + "forest_evapotranspiration": 0.0, + "wind_transport_fraction": 0.0, + "precipitation_rh_threshold": 99.0, + "precipitation_humidity_loss": 0.0, + "precipitation_moisture_gain": 0.0, + "mountain_barrier_block": 0.5, + "decay_per_turn": 0.0 + }, + "relative_humidity": { + "saturation_base": 0.0, + "saturation_temp_scale": 0.0 + }, + "dew_point": { + "rh_factor": 0.0 + }, + "cape": { + "lapse_rate_per_elevation": 0.004, + "temp_diff_scale": 0.5, + "humidity_scale": 0.0, + "stability_offset": 0.0, + "moisture_feedback_scale": 0.0 + }, + "event_thresholds": {}, + "event_effects": {} + }, + "moisture_relaxation": 0.0, + "ocean_evaporation_hops": 0, + "ocean_evaporation_hop_decay": 0.0, + "atmospheric_loss_rate": 0.0, + "water_boil_threshold": 0.15, + "surface_runoff_rate": 0.0, + "deep_earth_water": { + "volcano_self": 0.0, + "volcano_neighbor": 0.0, + "hot_spring_self": 0.0, + "hot_spring_neighbor": 0.0, + "hot_spring_max_temperature": 0.0, + "high_elevation_self": 0.0, + "high_elevation_threshold": 0.95 + }, + "wind_conductivity": 0.12, + "energy_scale": 0.004, + "equilibrium_relaxation": 0.02, + "evaporation_rate": 0.0, + "moisture_transport": 0.0, + "precipitation_threshold": 99.0, + "moisture_decay": 1.0, + "quality_up_threshold": 10, + "quality_down_threshold": 5, + "lake_thermal_conductivity": 0.0, + "river_moisture_transport": 0.0, + "mountain_rain_shadow_block": 0.4, + "wind_band_polar_cut": 0.15, + "wind_band_polar_front_cut": 0.30, + "wind_band_ferrel_cut": 0.50, + "wind_band_subtropical_cut": 0.60, + "wind_band_hadley_cut": 0.85, + "wind_speed_polar": 0.5, + "wind_speed_polar_front": 0.4, + "wind_speed_ferrel": 0.6, + "wind_speed_subtropical": 0.35, + "wind_speed_hadley": 0.55, + "wind_speed_itcz": 0.3, + "wind_friction_land": 0.6, + "wind_friction_mountain_downwind": 0.3, + "solar_min": 0.03, + "solar_max": 0.18, + "orbital_cycle_1_period": 686, + "orbital_cycle_1_amplitude": 0.018, + "orbital_cycle_1_phase": 0.0, + "orbital_cycle_2_period": 51000, + "orbital_cycle_2_amplitude": 0.030, + "orbital_cycle_2_phase": 1.05, + "orbital_cycle_3_period": 95000, + "orbital_cycle_3_amplitude": 0.025, + "orbital_cycle_3_phase": 2.40, + "orbital_moisture_coupling": 0.0, + "sea_level_temp_sensitivity": 0.0, + "sea_level_equilibrium_temp": 0.12, + "water_freeze_threshold": 0.25, + "aerosol_background": 0.008, + "aerosol_desert_dust": 0.025, + "aerosol_volcanic_outgas": 0.0, + "dust_storm_threshold": 0.8, + "dust_storm_aerosol_boost": 0.25 +} diff --git a/engine/src/worlds/mars/climate_spec.json b/engine/src/worlds/mars/climate_spec.json new file mode 100644 index 00000000..39e2307f --- /dev/null +++ b/engine/src/worlds/mars/climate_spec.json @@ -0,0 +1,71 @@ +{ + "terrain_classification": { + "comment": "Mars terrain rules — ordered, first match wins. Cold, dry, abiotic. No biological biomes. CO2 ice caps at poles.", + "rules": [ + { + "comment": "CO2 polar ice — extreme cold at any elevation", + "and": [ + { "field": "temperature", "op": "<=", "value": 0.06 } + ], + "terrain": "glacial" + }, + { + "comment": "Olympus Mons summit / Tharsis calderas — extreme elevation volcanic peaks", + "and": [ + { "field": "elevation", "op": ">", "value": 0.82 } + ], + "terrain": "caldera" + }, + { + "comment": "Tharsis highlands / highland basalt — elevated ancient terrain", + "and": [ + { "field": "elevation", "op": ">", "value": 0.70 } + ], + "terrain": "basalt_highland" + }, + { + "comment": "Valles Marineris canyon floor — deep lowland valleys", + "and": [ + { "field": "elevation", "op": "<", "value": 0.12 } + ], + "terrain": "canyon" + }, + { + "comment": "Hellas / Argyre basin — ancient impact basins and low plains", + "and": [ + { "field": "elevation", "op": "<", "value": 0.28 } + ], + "terrain": "ancient_lakebed" + }, + { + "comment": "Dune field — aeolian sand deposits on mid-elevation terrain", + "and": [ + { "field": "elevation", "op": ">=", "value": 0.28 }, + { "field": "elevation", "op": "<=", "value": 0.55 }, + { "field": "temperature", "op": ">", "value": 0.06 }, + { "field": "temperature", "op": "<", "value": 0.18 } + ], + "terrain": "dune_field" + }, + { + "comment": "Default: dust plain — the vast regolith-covered lowlands", + "and": [], + "terrain": "dust_plain" + } + ] + }, + "terrain_transitions": {}, + "ley_network": { + "enabled": false, + "anchor_spawn_chance": 0.0, + "link_max_distance": 0, + "residue_decay_per_turn": 1.0, + "quality_threshold_for_node": 99 + }, + "atmospheric_chemistry": { + "enabled": true, + "co2_concentration": 0.953, + "so2_concentration": 0.0, + "acid_rain_threshold": 9999.0 + } +} diff --git a/engine/src/worlds/mars/hydrology_params.json b/engine/src/worlds/mars/hydrology_params.json new file mode 100644 index 00000000..fc873831 --- /dev/null +++ b/engine/src/worlds/mars/hydrology_params.json @@ -0,0 +1,33 @@ +{ + "rainfall": { + "multiplier_tropical": 0.0, + "multiplier_temperate": 0.0, + "multiplier_cold": 0.0, + "multiplier_frozen": 0.0, + "multiplier_desert_terrain": 0.0 + }, + "source_bonuses": {}, + "depression_fill": { + "epsilon": 0.0001 + }, + "lakes": { + "depth_threshold": 9999.0, + "inland_sea_min_tiles": 9999 + }, + "rivers": { + "threshold_tropical": 9999.0, + "threshold_temperate": 9999.0, + "threshold_cold": 9999.0, + "threshold_frozen": 9999.0, + "threshold_desert": 9999.0, + "width_thresholds": [9999.0, 9999.0, 9999.0], + "width_labels": ["stream", "river", "major_river", "great_river"] + }, + "deltas": { + "accumulation_threshold": 9999.0, + "max_branches": 0 + }, + "frozen_river_temperature": 0.25, + "lake_moisture_injection": 0.0, + "river_moisture_per_turn": 0.0 +} diff --git a/engine/src/worlds/mars/manifest.json b/engine/src/worlds/mars/manifest.json new file mode 100644 index 00000000..92c519ba --- /dev/null +++ b/engine/src/worlds/mars/manifest.json @@ -0,0 +1,23 @@ +{ + "id": "mars", + "name": "Mars — Red Planet", + "description": "Thin CO2 atmosphere, -60°C average, no water cycle. Seasonal CO2 sublimation at poles, global dust storms reshape the regolith plains.", + "has_climate": true, + "has_weather": false, + "has_ecology": false, + "grid_width": 40, + "grid_height": 24, + "polar_rows": 3, + "physics_features": { + "water_cycle": false, + "weather_events": false, + "ecology": false, + "volcanism": false, + "co2_cycle": true, + "dust_storms": true, + "acid_clouds": false + }, + "subscribes_biomes": ["arid_world", "volcanic_world", "elevated", "arctic"], + "subscribes_substrates": ["substrates"], + "subscribes_events": [] +} diff --git a/engine/src/worlds/mars/runtime_biomes.json b/engine/src/worlds/mars/runtime_biomes.json new file mode 100644 index 00000000..d98d4fac --- /dev/null +++ b/engine/src/worlds/mars/runtime_biomes.json @@ -0,0 +1,33 @@ +{ + "comment": "Transient Mars terrain states that normalize back to stable biomes each turn.", + "biomes": [ + { + "id": "co2_frost", + "name": "CO₂ Frost", + "comment": "Seasonal CO2 frost deposition outside the permanent cap", + "normalizes_to": "glacial", + "tags": ["is_frozen", "is_dry"] + }, + { + "id": "dust_storm_track", + "name": "Dust Storm Track", + "comment": "Active dust storm deposit — high aerosol load, reduced insolation", + "normalizes_to": "dust_plain", + "tags": ["is_dry"] + }, + { + "id": "crater_floor", + "name": "Crater Floor", + "comment": "Impact crater flat floor — fine-grained sediment, sheltered from wind", + "normalizes_to": "ancient_lakebed", + "tags": ["is_dry"] + }, + { + "id": "ancient_riverbed", + "name": "Ancient Riverbed", + "comment": "Dried Noachian-era fluvial channel — distinctive linear lowland", + "normalizes_to": "canyon", + "tags": ["is_dry"] + } + ] +}