Rain, sandstorms, intensity, wind and lightning
Las guías de mods están en inglés, tal como vienen con el juego.
Weather is shared by the overhead board and cockpit. Visual rain, sand, wind and lightning stay cosmetic; combat reads weather.tower_effects so a storm can change live tower stats. Vanilla has one 20% chance of rain and 10% chance of sand per map seed, independently of wave/card randomness. The remaining 70% stay dry. (The shipping numbers live in tools/make_balance_experimental.py.) Rain and sand do not overlap. Each storm draws light, moderate or strong with equal probability, and that draw sets its CHARACTER — how heavy it is on average. Its strength then rises and falls while it lasts, wandering roughly a level either side, so a storm builds, peaks and eases instead of holding one setting from the first drop to the last. The swell drives rain and sand density, wind, puddle fill and lightning brightness together. Particle COUNTS stay budgeted by the drawn level and the graphics preset, so the swell can never push a preset past its cap. Rain starts 15–70 seconds into the active run, lasts 55–100 seconds, forms reflective puddles, then leaves wet ground that dries over 50 seconds. Pausing freezes weather. Continue restores its elapsed time instead of rolling again.
Menu replays also draw weather and intensity independently on every rotation, even when the same recording repeats, using these same mod settings. A preview skips start_delay_seconds and begins at the storm's fade-in so short replays can show it. Previous particles, fog and puddles clear when the recording changes. Replay weather never replaces the player's saved weather or consumes gameplay RNG.
Sandstorms last 40–85 seconds by default. Blowing dust, grains, warm haze and gusts share the real 3D world; the HUD and factory panel remain readable. Sand does not create puddles or lightning. All three intensities affect particle counts and wind; rain also changes cloud cover, fill rate and pool extent, while sand changes haze density. Intensity is separate from the graphics preset.
Night rain can produce brief lightning flashes. Wind smoothly changes direction and strength, bending both falling drops and their visible streaks. Wind itself never changes enemy movement, factory production or paths. Combat modifiers (damage, accuracy, range, rate of fire, turn speed, projectile speed) live in tower_effects, not in the wind vector.
Try the examples
- Open Options → Mods → Open Mods Folder.
- Copy
_example_weathertorainy_desert, without the leading underscore. - Restart and start a new game. The example guarantees rain, beginning with an eight-second fade-in, lasting two minutes. Choose the night difficulty to see lightning. Change the
idinmod.jsonbefore sharing your own version.
For sand instead, copy _example_sandstorm to desert_sandstorm, deactivate the rain example, and restart. This example guarantees two minutes of sand with a randomly chosen intensity. SANDSTORMS.md is the addendum also delivered to installations that already have the older weather guide.
Disable the mod and restart to restore the vanilla defaults. Existing saves keep their weather selection, intensity and timeline; use a new run to try changed probability, intensity weights or timing. Old version-1 weather saves retain their rain/dry selection at moderate intensity. enabled: false suppresses all weather even in an existing wet or sandy save.
balance.json
Both balance profiles support partial overrides under weather. Omitted keys inherit defaults. No scripts, GLBs or textures are required.
{
"weather": {
"enabled": true,
"rain_chance": 0.2,
"sand_chance": 0.1,
"intensity_weights": [1, 1, 1],
"intensity_multipliers": [0.55, 1.0, 1.5],
"start_delay_seconds": [15, 70],
"rain_duration_seconds": [55, 100],
"sand_duration_seconds": [40, 85],
"sand_density": 1.0,
"sand_haze": 0.38,
"sand_wind_multiplier": 2.4,
"fade_seconds": 8,
"puddle_fill_seconds": 18,
"puddle_dry_seconds": 50,
"puddle_coverage": 0.48,
"rain_density": 1.0,
"scenery_fx": {"enabled": true, "density": 1.0, "heat_haze": true, "pit_microfauna": 0.5},
"wind": [55, 12],
"wind_gust_strength": 90,
"wind_gust_interval_seconds": [4, 11],
"lightning": {
"enabled": true,
"interval_seconds": [12, 25],
"intensity": 1.5
},
"tower_effects": {
"rain": {
"Flame": {"damage": -0.2},
"Bolt": {"damage": 0.1}
},
"sand": {
"Gun": {"accuracy": -0.1},
"Cannon": {"accuracy": -0.1},
"Missile": {"accuracy": -0.1},
"MachineGun": {"accuracy": -0.1},
"Bolt": {"accuracy": -0.1},
"Frost": {"accuracy": -0.1},
"Laser": {"accuracy": -0.1},
"Sniper": {"accuracy": -0.1},
"Tesla": {"accuracy": -0.1},
"Blizzard": {"accuracy": -0.1},
"Railgun": {"accuracy": -0.1}
}
}
}
}
| Setting | Meaning and supported bounds | |
|---|---|---|
rain_chance | Probability from 0 (never) to 1 (every new map). | |
sand_chance | Sand probability, 0–1. If rain + sand exceeds 1, rain takes priority and sand uses the remainder. | |
intensity_variation | How far the storm wanders from its drawn level while it lasts, in level steps: 0 holds one strength for the whole storm, 1 lets it travel about a level either way, up to 2. Default: 1. | |
intensity_weights | Three nonnegative relative weights [light, moderate, strong], each 0–100. [1,1,1] is equal probability; [0,0,1] always chooses strong. All-zero/invalid arrays fall back to equal weights. | |
intensity_multipliers | Strength of the three levels, each 0.25–2. Defaults are [0.55,1,1.5]. | |
start_delay_seconds | Random minimum/maximum delay, 0–3600 seconds. | |
rain_duration_seconds | Random minimum/maximum duration, 5–1800 seconds. | |
sand_duration_seconds | Random minimum/maximum sand duration, 5–1800 seconds. | |
sand_density | Dust/grain count multiplier, 0.1–2. | |
sand_haze | Haze amount per intensity multiplier, 0–0.6, capped at 0.72 total opacity. | |
sand_wind_multiplier | Extra wind multiplier during sand, 0.5–4. | |
fade_seconds | Rain/cloud fade, 0.5–60 seconds, capped at 40% of duration. | |
cloud_lead_seconds | How long the rain's cloud bank gathers before the first drop and lingers after the last, 0–600 seconds (default 35), never longer than the storm's start delay. | |
puddle_fill_seconds | Time to full puddles, 1–300 seconds. Short storms leave smaller pools. | |
puddle_dry_seconds | Drying time after rain ends, 1–1800 seconds. | |
puddle_coverage | Relative extent, 0–1; 0 keeps wet soil without standing pools. Not a literal percentage of floor area. | |
rain_density | Particle count multiplier, 0.1–2. | |
scenery_fx.enabled | Enable the living-desert layer: drifting sand, footsteps, cliff grit, nest dust, impact residues, rain contacts and lamp dust. Default: true. Independent of the storm switch. | |
scenery_fx.density | Ambient emission frequency, 0.15–2; default 1. Fixed pool limits still apply. Does not change combat or weather probability. | |
scenery_fx.heat_haze | Local heat refraction on High/Ultra; default true. Low/Medium always omit it. | |
scenery_fx.tower_effort | Workload-driven vent puffs, cold condensation and local heat shimmer on stock towers; default true. The effect builds through actual firing/collection and cools gradually. Reuses the existing particle budget, culls unresolved/offscreen vents and respects heat_haze. Does not add overheating penalties or change tower stats. Creature/replacement mod models do not inherit stock vent positions. | |
scenery_fx.wind_fronts | Passing spatial gusts on calm days and during weather; default true. Vegetation, banners, smoke and airborne dust respond as the front reaches their world position. A private cosmetic seed leaves the saved storm forecast unchanged. This switch also controls passing gusts when ambient particles are disabled. | |
scenery_fx.pit_microfauna | Wildlife colonies (ants, beetles, crickets, butterflies) in the pit, as a share of the plain's, 0–1; default 0.5. 1 gives the pit as many as the plain; 0 leaves the pit empty. The plain's count follows the graphics preset and microfauna.json's colonies (MICROFAUNA.md). | |
wind | Base horizontal [X, Z] velocity, each −150…150 world units/second. | |
wind_gust_strength | Maximum extra random horizontal velocity, 0–180. Set 0 for steady wind. | |
wind_gust_interval_seconds | Random time between smoothly blended wind targets, 2–60 seconds. | |
lightning.enabled | Enable occasional flashes during night rain only. | |
lightning.interval_seconds | Random gap between flashes, 5–300 seconds. | |
lightning.intensity | Flash strength, 0–3. | |
tower_effects | Combat modifiers while rain or sand is active. Nested as `tower_effects.<rain\ | sand>.<Tower>.<stat> with a signed fraction: -0.20 is 20% less, 0.10 is 10% more. Stats the game reads: damage, accuracy, range, rof (fire *rate*, so +0.10 shoots faster), turn_speed, projectile_speed. A fused tower uses its fused name first, then its base type, then "*". Default: rain Flame.damage -0.20, Bolt.damage +0.10; sand -0.10` accuracy on Gun, Cannon, Missile, MachineGun, Bolt, Frost, Laser, Sniper, Tesla, Blizzard and Railgun. The storm envelope scales the effect (full in the middle, fade at the edges). Intensity swell does not. Omitted towers and stats stay at 1.0. |
Intervals are [minimum, maximum]; use equal values for a fixed duration. Invalid numeric inputs fall back to safe defaults, and out-of-range values are clamped. A fixed seed reproduces the event, pool layout and gust schedule without consuming gameplay RNG. Changing lightning frequency does not change the wind.
The plain's dry shrubs lean and rock with this wind (its direction, and harder with speed), sway further in rain and furthest in a sandstorm, and hold still while the game is paused. scenery_fx does not switch them off. Passing fronts share one envelope with particle drift; they strengthen the quiet wind audio bed by at most 2.5 dB near the listener. Dry gusts may briefly lift loose grit; wet ground and water scenes do not emit that extra dust. The thermal and wind clocks freeze on pause and reset with their owning run/model.
Rain scales with Low/Medium/High/Ultra: 350/700/1200/1800 drops at moderate intensity and density 1. Sand uses 100/180/300/450 particles. Multiply those counts by the chosen intensity multiplier and density; the result is bounded at every preset. A strong storm remains visually strong when Low reduces particle counts. Puddles use the actual floor material, with animated ripples and static scenery/ sky reflections. They do not mirror moving insects or projectiles. Low skips lightning shadows; higher presets retain them. This uses Compatibility rendering and does not require screen-space reflections or ray tracing.
Living-desert detail
These effects share the local arena between the overhead camera and cockpit. They follow actual movement, muzzle sockets, impact positions and worm emergence. Stationary insects do not emit steps; flyers create downwash instead of walking marks. Explosions disturb nearby dust and can dislodge small cliff fragments. Fragments have real 3D volume but never change cliff geometry or pathfinding. Footprints, scorch, acid, frost and electrical traces expire rather than accumulate. Rain contacts use the terrain's puddle mask; cliff faces darken and develop thin runoff streaks. The nest breathes dust and emits small night spores, with extra activity on boss waves. High/Ultra add local heat shimmer and short analytical light cones around existing building lamps. The cones do not add shadow maps.
At Low/Medium/High/Ultra, hard pool limits are respectively 36/48/120/176 dust wisps, 16/24/56/80 solid fragments or droplets, 20/28/64/88 ground traces and 6/8/16/24 pressure or water rings. High/Ultra allow up to 10 local heat patches and six lamp cones. A small shadowless light stays inside the nest entrance. No fence lights are added. Particles pause with gameplay and clear on replay/run replacement. Their random stream is independent of weather and combat, and their transient state is not saved. The radar spectator world does not borrow the local arena's weather/effects; it requires its own presentation state.
Cloud shadows reuse the existing cross-driver noise shader. Gusts now integrate movement incrementally, so a wind turn late in a run cannot teleport the cloud pattern. No extra cloud texture, full-screen pass or shadow map is introduced.
