diff --git a/engine/src/worlds/earth/climate_params.json b/engine/src/worlds/earth/climate_params.json new file mode 100644 index 00000000..db720dd9 --- /dev/null +++ b/engine/src/worlds/earth/climate_params.json @@ -0,0 +1,241 @@ +{ + "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": 1030.0, + "subpolar_low_hpa": 995.0, + "subtropical_high_hpa": 1025.0, + "equatorial_low_hpa": 1005.0 + }, + "pressure_terrain_modifiers": { + "mountain_per_0_1_elevation": 5.0, + "ocean_offset": -2.0, + "hot_land_threshold": 0.6, + "hot_land_offset": -3.0 + }, + "anomaly": { + "thermal_low_spawn_hpa": -15.0, + "cold_high_spawn_hpa": 15.0, + "tropical_low_spawn_hpa": -20.0, + "spawn_hot_temp_threshold": 0.65, + "spawn_cold_temp_threshold": 0.2, + "spawn_adjacent_cool_threshold": 0.45, + "spawn_ocean_hot_threshold": 0.6, + "decay_per_turn_hpa": 2.0, + "reinforce_per_turn_hpa": 3.0, + "max_anomaly_hpa": 50.0, + "drift_wind_fraction": 0.5, + "merge_radius_hexes": 2 + }, + "pressure_wind": { + "gradient_scale": 0.05, + "speed_scale": 0.04, + "coriolis_scale": 0.3 + }, + "humidity": { + "ocean_evap_rate": 0.03, + "soil_contribution": 0.01, + "forest_evapotranspiration": 0.015, + "wind_transport_fraction": 0.1, + "precipitation_rh_threshold": 0.95, + "precipitation_humidity_loss": 0.1, + "precipitation_moisture_gain": 0.05, + "mountain_barrier_block": 0.8, + "decay_per_turn": 0.02 + }, + "relative_humidity": { + "saturation_base": 0.2, + "saturation_temp_scale": 0.8 + }, + "dew_point": { + "rh_factor": 0.2 + }, + "cape": { + "lapse_rate_per_elevation": 0.006, + "temp_diff_scale": 2.0, + "humidity_scale": 1.5, + "stability_offset": 0.3, + "moisture_feedback_scale": 0.5 + }, + "event_thresholds": { + "hurricane": { + "accumulate_per_turn": 0.15, + "decay_per_turn": 0.1, + "spawn_threshold": 1.0, + "ocean_temp_min": 0.65, + "pressure_anomaly_max": -10.0, + "humidity_min": 0.6, + "wind_shear_max_diff": 1, + "latitude_min_pct": 0.1, + "latitude_max_pct": 0.5, + "planet_rotation_min": 0.2, + "mature_pressure_anomaly": -40.0 + }, + "tornado": { + "accumulate_per_turn": 0.25, + "decay_per_turn": 0.2, + "spawn_threshold": 0.8, + "cape_min": 0.5, + "temp_differential_min": 0.2, + "dew_point_min": 0.55 + }, + "drought": { + "accumulate_per_turn": 0.1, + "decay_per_turn": 0.2, + "spawn_threshold": 1.0, + "pressure_anomaly_min": 10.0, + "humidity_max": 0.2, + "moisture_max": 0.25, + "relative_humidity_max": 0.3, + "sustain_turns": 3 + }, + "flood": { + "accumulate_per_turn": 0.2, + "spawn_threshold": 0.8, + "river_flow_threshold": 80.0, + "humidity_min": 0.7, + "coastal_pressure_anomaly_max": -20.0, + "coastal_temp_threshold": 0.55 + }, + "monsoon": { + "accumulate_per_turn": 0.1, + "spawn_threshold": 1.0, + "ocean_temp_min": 0.6, + "land_pressure_anomaly_max": -5.0, + "season_period": 20 + }, + "blizzard": { + "accumulate_per_turn": 0.15, + "spawn_threshold": 0.8, + "temp_max": 0.15, + "wind_speed_min": 0.5, + "humidity_min": 0.3, + "pressure_anomaly_max": -5.0 + }, + "heat_wave": { + "accumulate_per_turn": 0.1, + "spawn_threshold": 0.8, + "pressure_anomaly_min": 15.0, + "temp_min": 0.7, + "humidity_max": 0.3, + "wind_speed_max": 0.3, + "sustain_turns": 3 + } + }, + "event_effects": { + "hurricane": { + "unit_damage_cat1": 5, + "unit_damage_cat5": 25, + "city_damage_cat1": 10, + "city_damage_cat5": 50, + "improvement_destroy_chance_cat1": 0.3, + "improvement_destroy_chance_cat5": 0.9, + "food_yield_penalty": 2, + "duration_min": 5, + "duration_max": 15 + }, + "tornado": { + "unit_damage": 15, + "city_damage": 20, + "improvement_destroy_chance": 0.8, + "all_yield_penalty": 1, + "quality_penalty": 1, + "path_hexes_min": 1, + "path_hexes_max": 3, + "duration_min": 1, + "duration_max": 3 + }, + "drought": { + "food_yield_penalty": 1, + "duration_min": -1 + }, + "flood": { + "unit_damage": 10, + "city_damage": 15, + "improvement_destroy_chance": 0.6, + "food_yield_after": 1, + "duration_min": 2, + "duration_max": 8 + }, + "monsoon": { + "improvement_flood_destroy_chance": 0.2, + "food_yield_bonus": 1, + "duration_min": 8, + "duration_max": 12 + }, + "blizzard": { + "unit_damage_per_turn": 3, + "duration_min": 3, + "duration_max": 6 + }, + "heat_wave": { + "unit_damage_per_turn": 2, + "food_yield_penalty": 1, + "happiness_penalty": 1, + "duration_min": 3, + "duration_max": 10 + } + } + }, + "moisture_relaxation": 0.04, + "ocean_evaporation_hops": 4, + "ocean_evaporation_hop_decay": 0.5, + "atmospheric_loss_rate": 0.0001, + "water_boil_threshold": 0.82, + "surface_runoff_rate": 0.3, + "deep_earth_water": { + "volcano_self": 0.008, + "volcano_neighbor": 0.004, + "hot_spring_self": 0.005, + "hot_spring_neighbor": 0.002, + "hot_spring_max_temperature": 0.60, + "high_elevation_self": 0.002, + "high_elevation_threshold": 0.8 + }, + "wind_conductivity": 0.1, + "energy_scale": 0.005, + "equilibrium_relaxation": 0.08, + "evaporation_rate": 0.05, + "moisture_transport": 0.15, + "precipitation_threshold": 0.7, + "moisture_decay": 0.995, + "quality_up_threshold": 10, + "quality_down_threshold": 5, + "lake_thermal_conductivity": 0.05, + "river_moisture_transport": 0.075, + "mountain_rain_shadow_block": 0.9, + "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.6, + "wind_speed_polar_front": 0.3, + "wind_speed_ferrel": 0.8, + "wind_speed_subtropical": 0.3, + "wind_speed_hadley": 0.7, + "wind_speed_itcz": 0.3, + "wind_friction_land": 0.7, + "wind_friction_mountain_downwind": 0.1, + "solar_min": 0.05, + "solar_max": 0.70, + "orbital_cycle_1_period": 400, + "orbital_cycle_1_amplitude": 0.015, + "orbital_cycle_1_phase": 0.0, + "orbital_cycle_2_period": 260, + "orbital_cycle_2_amplitude": 0.010, + "orbital_cycle_2_phase": 1.05, + "orbital_cycle_3_period": 1000, + "orbital_cycle_3_amplitude": 0.020, + "orbital_cycle_3_phase": 2.40, + "orbital_moisture_coupling": 0.5, + "sea_level_temp_sensitivity": 0.0008, + "sea_level_equilibrium_temp": 0.45, + "water_freeze_threshold": 0.12, + "aerosol_background": 0.002, + "aerosol_desert_dust": 0.005, + "aerosol_volcanic_outgas": 0.015 +} diff --git a/engine/src/worlds/earth/climate_spec.json b/engine/src/worlds/earth/climate_spec.json new file mode 100644 index 00000000..960f28da --- /dev/null +++ b/engine/src/worlds/earth/climate_spec.json @@ -0,0 +1,758 @@ +{ + "terrain_classification": { + "comment": "Ordered rule list \u2014 first match wins. Mirrors biome_classifier.gd _classify_land(). Water/volcanic/cave handled outside these rules.", + "rules": [ + { + "comment": "Wetland override: saturated moisture on lowland", + "and": [ + { + "field": "moisture", + "op": ">", + "value": 0.7 + }, + { + "field": "elevation", + "op": "<", + "value": 0.4 + }, + { + "field": "temperature", + "op": ">", + "value": 0.4 + } + ], + "terrain": "swamp" + }, + { + "and": [ + { + "field": "moisture", + "op": ">", + "value": 0.7 + }, + { + "field": "elevation", + "op": "<", + "value": 0.4 + }, + { + "field": "temperature", + "op": "<=", + "value": 0.4 + } + ], + "terrain": "bog" + }, + { + "comment": "Very high elevation: ice or alpine tundra", + "and": [ + { + "field": "elevation", + "op": ">", + "value": 0.85 + }, + { + "field": "temperature", + "op": "<", + "value": 0.1 + } + ], + "terrain": "ice" + }, + { + "and": [ + { + "field": "elevation", + "op": ">", + "value": 0.85 + } + ], + "terrain": "alpine_tundra" + }, + { + "comment": "High elevation (0.70-0.85): alpine meadow or alpine tundra", + "and": [ + { + "field": "elevation", + "op": ">", + "value": 0.7 + }, + { + "field": "moisture", + "op": ">", + "value": 0.3 + } + ], + "terrain": "alpine_meadow" + }, + { + "and": [ + { + "field": "elevation", + "op": ">", + "value": 0.7 + } + ], + "terrain": "alpine_tundra" + }, + { + "comment": "Mid elevation (0.55-0.70): montane forest, cloud forest, or alpine meadow", + "and": [ + { + "field": "elevation", + "op": ">", + "value": 0.55 + }, + { + "field": "canopy", + "op": ">", + "value": 0.4 + } + ], + "terrain": "montane_forest" + }, + { + "and": [ + { + "field": "elevation", + "op": ">", + "value": 0.55 + }, + { + "field": "moisture", + "op": ">", + "value": 0.7 + }, + { + "field": "temperature", + "op": ">", + "value": 0.3 + } + ], + "terrain": "cloud_forest" + }, + { + "and": [ + { + "field": "elevation", + "op": ">", + "value": 0.55 + } + ], + "terrain": "alpine_meadow" + }, + { + "comment": "Hot lowland (temp > 0.55): tropical biomes or desert", + "and": [ + { + "field": "temperature", + "op": ">", + "value": 0.55 + }, + { + "field": "moisture", + "op": ">", + "value": 0.7 + }, + { + "field": "canopy", + "op": ">", + "value": 0.6 + } + ], + "terrain": "tropical_rainforest" + }, + { + "and": [ + { + "field": "temperature", + "op": ">", + "value": 0.55 + }, + { + "field": "moisture", + "op": ">", + "value": 0.4 + } + ], + "terrain": "tropical_dry_forest" + }, + { + "and": [ + { + "field": "temperature", + "op": ">", + "value": 0.55 + }, + { + "field": "moisture", + "op": ">", + "value": 0.2 + } + ], + "terrain": "savanna" + }, + { + "and": [ + { + "field": "temperature", + "op": ">", + "value": 0.55 + } + ], + "terrain": "desert" + }, + { + "comment": "Temperate (temp 0.25-0.55): forest, grassland, or chaparral", + "and": [ + { + "field": "temperature", + "op": ">", + "value": 0.25 + }, + { + "field": "canopy", + "op": ">", + "value": 0.5 + } + ], + "terrain": "forest" + }, + { + "and": [ + { + "field": "temperature", + "op": ">", + "value": 0.25 + }, + { + "field": "moisture", + "op": ">", + "value": 0.7 + } + ], + "terrain": "temperate_rainforest" + }, + { + "and": [ + { + "field": "temperature", + "op": ">", + "value": 0.25 + }, + { + "field": "moisture", + "op": ">", + "value": 0.3 + } + ], + "terrain": "grassland" + }, + { + "and": [ + { + "field": "temperature", + "op": ">", + "value": 0.25 + } + ], + "terrain": "chaparral" + }, + { + "comment": "Cold (temp 0.10-0.25): boreal forest or tundra", + "and": [ + { + "field": "temperature", + "op": ">", + "value": 0.1 + }, + { + "field": "canopy", + "op": ">", + "value": 0.3 + } + ], + "terrain": "boreal_forest" + }, + { + "and": [ + { + "field": "temperature", + "op": ">", + "value": 0.1 + } + ], + "terrain": "tundra" + }, + { + "comment": "Extreme cold fallback", + "terrain": "polar_desert" + } + ] + }, + "terrain_transitions": { + "comment": "Hysteresis rules for _ideal_terrain(). Each terrain defines conditions to leave it. First match wins; if none match, terrain persists. 'classify' means re-run full classification.", + "tropical_rainforest": [ + { + "condition": "canopy <= 0", + "becomes": "classify" + }, + { + "condition": "moisture <= 0.70 OR canopy <= 0.60", + "becomes": "tropical_dry_forest" + }, + { + "condition": "temperature <= 0.55 AND canopy > 0", + "becomes": "forest" + } + ], + "tropical_dry_forest": [ + { + "condition": "canopy <= 0", + "becomes": "classify" + }, + { + "condition": "moisture <= 0.40 AND canopy > 0", + "becomes": "savanna" + }, + { + "condition": "moisture > 0.70 AND canopy > 0.60", + "becomes": "tropical_rainforest" + }, + { + "condition": "temperature <= 0.55 AND canopy > 0", + "becomes": "forest" + } + ], + "savanna": [ + { + "condition": "canopy <= 0", + "becomes": "classify" + }, + { + "condition": "moisture <= 0.20", + "becomes": "desert" + }, + { + "condition": "moisture > 0.40 AND canopy > 0", + "becomes": "tropical_dry_forest" + }, + { + "condition": "temperature <= 0.55", + "becomes": "chaparral" + } + ], + "desert": [ + { + "condition": "moisture > 0.20 AND temperature > 0.55 AND canopy > 0", + "becomes": "savanna" + }, + { + "condition": "moisture > 0.20 AND temperature <= 0.55", + "becomes": "chaparral" + } + ], + "forest": [ + { + "condition": "canopy <= 0", + "becomes": "classify" + }, + { + "condition": "canopy <= 0.30 AND canopy > 0", + "becomes": "grassland" + }, + { + "condition": "temperature > 0.55 AND canopy > 0", + "becomes": "tropical_dry_forest" + }, + { + "condition": "temperature <= 0.25 AND canopy > 0", + "becomes": "boreal_forest" + } + ], + "temperate_rainforest": [ + { + "condition": "canopy <= 0", + "becomes": "classify" + }, + { + "condition": "moisture <= 0.50 AND canopy > 0", + "becomes": "forest" + }, + { + "condition": "temperature > 0.55 AND canopy > 0", + "becomes": "tropical_rainforest" + }, + { + "condition": "temperature <= 0.25 AND canopy > 0", + "becomes": "boreal_forest" + } + ], + "grassland": [ + { + "condition": "canopy <= 0", + "becomes": "classify" + }, + { + "condition": "canopy > 0.50", + "becomes": "forest" + }, + { + "condition": "moisture <= 0.30", + "becomes": "chaparral" + }, + { + "condition": "temperature > 0.55 AND canopy > 0", + "becomes": "savanna" + }, + { + "condition": "temperature <= 0.25 AND canopy > 0", + "becomes": "tundra" + } + ], + "chaparral": [ + { + "condition": "moisture > 0.30 AND canopy > 0", + "becomes": "grassland" + }, + { + "condition": "temperature > 0.55 AND moisture <= 0.20", + "becomes": "desert" + }, + { + "condition": "temperature <= 0.25 AND canopy > 0", + "becomes": "tundra" + } + ], + "boreal_forest": [ + { + "condition": "canopy <= 0", + "becomes": "classify" + }, + { + "condition": "canopy <= 0.20", + "becomes": "tundra" + }, + { + "condition": "temperature >= 0.25 AND canopy > 0", + "becomes": "forest" + }, + { + "condition": "temperature <= 0.10", + "becomes": "classify" + } + ], + "tundra": [ + { + "condition": "canopy <= 0", + "becomes": "polar_desert" + }, + { + "condition": "canopy > 0.30 AND temperature > 0.10", + "becomes": "boreal_forest" + }, + { + "condition": "temperature >= 0.25 AND canopy > 0", + "becomes": "grassland" + }, + { + "condition": "temperature <= 0.10", + "becomes": "polar_desert" + } + ], + "polar_desert": [ + { + "condition": "temperature > 0.10 AND canopy > 0", + "becomes": "tundra" + } + ], + "swamp": [ + { + "condition": "canopy <= 0", + "becomes": "classify" + }, + { + "condition": "moisture <= 0.60", + "becomes": "classify" + }, + { + "condition": "temperature <= 0.40", + "becomes": "bog" + } + ], + "bog": [ + { + "condition": "canopy <= 0", + "becomes": "classify" + }, + { + "condition": "moisture <= 0.60", + "becomes": "classify" + }, + { + "condition": "temperature > 0.40", + "becomes": "swamp" + } + ], + "montane_forest": [ + { + "condition": "canopy <= 0", + "becomes": "classify" + }, + { + "condition": "canopy <= 0.30", + "becomes": "alpine_meadow" + }, + { + "condition": "elevation <= 0.50", + "becomes": "classify" + } + ], + "cloud_forest": [ + { + "condition": "canopy <= 0", + "becomes": "classify" + }, + { + "condition": "moisture <= 0.60 OR temperature <= 0.25", + "becomes": "alpine_meadow" + }, + { + "condition": "elevation <= 0.50", + "becomes": "classify" + } + ], + "alpine_meadow": [ + { + "condition": "canopy <= 0", + "becomes": "classify" + }, + { + "condition": "elevation <= 0.50", + "becomes": "classify" + }, + { + "condition": "moisture <= 0.20 AND elevation > 0.70", + "becomes": "alpine_tundra" + } + ], + "alpine_tundra": [ + { + "condition": "moisture > 0.30 AND elevation <= 0.85 AND canopy > 0", + "becomes": "alpine_meadow" + }, + { + "condition": "elevation <= 0.50", + "becomes": "classify" + } + ] + }, + "precipitation_latitude": { + "comment": "Latitude-dependent moisture adjustment in precipitation step. Models Hadley cell circulation.", + "polar_drying": { + "band_pct": 0.15, + "rate_per_turn": 0.005 + }, + "subtropical_drying": { + "center_pct": 0.3, + "half_width": 0.15, + "rate_per_turn": 0.008 + } + }, + "aerosol": { + "comment": "Stratospheric sulfate/ash aerosol physics. Injected by volcanic/impact events. Applied each turn to magic_heat_delta (cooling) and magic_moisture_delta (drying). Spreads downwind, decays per turn. 1 turn \u2248 10 years. Extinction (~20 turns), asteroid (~9 turns), supervolcano (~1-2 turns).", + "cooling_rate": 0.06, + "drying_rate": 0.03, + "wind_transport_rate": 0.12, + "decay_rate": 0.05 + }, + "reef_bleaching": { + "comment": "Coral reef health model. Coast tiles gain/lose reef_health per turn based on temperature.", + "bleach_temp_threshold": 0.75, + "damage_rate_per_turn": 0.01, + "recovery_rate_per_turn": 0.005, + "dead_threshold": 0.3 + }, + "anchor_decay": { + "comment": "Event-created ley anchors lose strength over time as the planet absorbs them.", + "rate_per_turn": 0.003 + }, + "ley_channeling": { + "comment": "Corruption spread multipliers based on receiving tile's ley state.", + "off_ley": 1.0, + "on_ley_generic": 2.0, + "death_ley": 3.0, + "nature_life_ley": 0.5 + }, + "ley_network": { + "comment": "Ley line connection rules between anchors. See also ley_line_params.json for anchor strengths and field density.", + "max_connection_distance": 28, + "max_connections_per_node": 3, + "school_affinity": { + "comment": "MTG color wheel: 1.0 = same school, 0.5 = allied neighbor, 0.0 = enemy", + "life": { + "life": 1.0, + "nature": 0.5, + "aether": 0.5, + "chaos": 0.0, + "death": 0.0 + }, + "nature": { + "life": 0.5, + "nature": 1.0, + "chaos": 0.5, + "aether": 0.0, + "death": 0.0 + }, + "aether": { + "life": 0.5, + "aether": 1.0, + "death": 0.5, + "chaos": 0.0, + "nature": 0.0 + }, + "chaos": { + "nature": 0.5, + "chaos": 1.0, + "death": 0.5, + "life": 0.0, + "aether": 0.0 + }, + "death": { + "aether": 0.5, + "death": 1.0, + "life": 0.0, + "nature": 0.0, + "chaos": 0.5 + } + } + }, + "atmospheric_chemistry": { + "starting_atmospheres": { + "modern": { + "o2_fraction": 0.21, + "co2_ppm": 420, + "ch4_ppb": 1900 + }, + "depleted": { + "o2_fraction": 0.1, + "co2_ppm": 2000, + "ch4_ppb": 5000 + }, + "lush": { + "o2_fraction": 0.3, + "co2_ppm": 200, + "ch4_ppb": 800 + }, + "primordial": { + "o2_fraction": 0.0001, + "co2_ppm": 300000, + "ch4_ppb": 100000 + } + }, + "photosynthesis": { + "land_canopy_rate": 4e-05, + "ocean_phyto_rate": 3e-05, + "algal_bloom_burst": 0.0008, + "aerosol_suppression": 0.6 + }, + "respiration": { + "fauna_rate": 1.5e-05, + "decomp_co2_rate": 8e-06, + "decomp_ch4_rate": 2e-06, + "wildfire_o2_cost": 0.0005, + "wildfire_co2_gain": 800 + }, + "greenhouse": { + "co2_temp_bias": [ + { + "co2_ppm_min": 0, + "co2_ppm_max": 1000, + "temp_bias": 0.0 + }, + { + "co2_ppm_min": 1000, + "co2_ppm_max": 5000, + "temp_bias": 0.05 + }, + { + "co2_ppm_min": 5000, + "co2_ppm_max": 50000, + "temp_bias": 0.15 + }, + { + "co2_ppm_min": 50000, + "co2_ppm_max": 999999, + "temp_bias": 0.3 + } + ], + "ch4_temp_multiplier": 5e-08, + "ch4_decay_rate": 0.02, + "permafrost_ch4_pulse": 5000, + "wetland_ch4_rate": 3e-06 + }, + "o2_thresholds": { + "safe": 0.18, + "thin": 0.15, + "dangerous": 0.1, + "critical": 0.05, + "lethal": 0.03 + }, + "ecological_collapse": { + "o2_trigger": 0.05, + "o2_sustained_turns": 10, + "dead_biome_fraction": 0.8, + "extinction_events_window": 20, + "extinction_events_threshold": 3, + "photosynthesis_tipping_multiplier": 0.1, + "recovery_rate_per_turn": 0.0001 + }, + "volcanic": { + "co2_per_aerosol_unit": 120, + "t6_co2_bonus": 8000, + "t7_co2_bonus": 40000, + "t8_co2_bonus": 200000 + }, + "fish_collapse": { + "critical_threshold": 0.15, + "collapse_threshold": 0.05, + "global_fish_check_interval": 5, + "trophic_cascade_delay_turns": 3, + "bloom_phase_duration": 8, + "anoxic_phase_duration": 15, + "toxification_phase_duration": 30, + "o2_production_loss_rate": 0.08, + "o2_loss_while_toxic": 0.0008, + "coastal_damage_radius": 3, + "recovery_fish_threshold": 0.25, + "recovery_turns_required": 20, + "ocean_toxicity_decay": 0.005, + "h2s_coastal_damage_per_turn": 2 + }, + "ocean_states": { + "healthy": { + "fish_floor": 0.3, + "o2_contribution": 1.0 + }, + "stressed": { + "fish_floor": 0.15, + "o2_contribution": 0.7 + }, + "anoxic": { + "fish_floor": 0.05, + "o2_contribution": 0.2 + }, + "toxic": { + "fish_floor": 0.01, + "o2_contribution": 0.0, + "coastal_damage": true + }, + "dead": { + "fish_floor": 0.0, + "o2_contribution": 0.0, + "coastal_damage": true, + "permanent": true + } + } + } +} \ No newline at end of file diff --git a/engine/src/worlds/earth/hydrology_params.json b/engine/src/worlds/earth/hydrology_params.json new file mode 100644 index 00000000..1887d028 --- /dev/null +++ b/engine/src/worlds/earth/hydrology_params.json @@ -0,0 +1,56 @@ +{ + "rainfall": { + "multiplier_tropical": 1.4, + "multiplier_temperate": 1.0, + "multiplier_cold": 0.5, + "multiplier_frozen": 0.2, + "multiplier_desert_terrain": 0.15 + }, + "source_bonuses": { + "snowmelt": { + "bonus": 0.8, + "terrain": ["mountains", "hills"], + "min_elevation": 0.65, + "max_temperature": 0.5 + }, + "spring": { + "bonus": 0.3, + "terrain": ["enchanted_forest"], + "min_moisture": 0.6 + }, + "hot_spring": { + "bonus": 0.5, + "terrain": ["tundra", "snow"], + "adjacent_terrain": ["volcano", "mountains"], + "max_temperature": 0.25 + }, + "glacial": { + "bonus": 0.4, + "terrain": ["snow", "ice"], + "min_elevation": 0.5 + } + }, + "depression_fill": { + "epsilon": 0.0001 + }, + "lakes": { + "depth_threshold": 0.02, + "inland_sea_min_tiles": 12 + }, + "rivers": { + "threshold_tropical": 20.0, + "threshold_temperate": 25.0, + "threshold_cold": 35.0, + "threshold_frozen": 50.0, + "threshold_desert": 30.0, + "width_thresholds": [2.0, 8.0, 20.0], + "width_labels": ["stream", "river", "major_river", "great_river"] + }, + "deltas": { + "accumulation_threshold": 15.0, + "max_branches": 3 + }, + "frozen_river_temperature": 0.10, + "lake_moisture_injection": 0.6, + "river_moisture_per_turn": 0.02 +}