Kyle Pericak

"It works in my environment"

Stellaris: 3x Bigger Worlds

Last verified: 2026-05-24

3x Bigger Worlds thumbnail

What the mod does

  • 3x planet & moon size. Habitable planets spawn at sizes 36–75 (vanilla 12–25); habitable moons at 30–45 (vanilla 10–15). Because vanilla awards one district per planet size point (NUM_DISTRICTS_FROM_PLANET_SIZE = 1, unchanged), every habitable world has ~3x district slots from generation.
  • 3x deposit max-district adds. Every planetary feature that grants district_mining_max_add, district_farming_max_add, district_generator_max_add, etc. now grants N * 3. Same for habitat deposits (district_hab_*_max_add) and the planet_max_districts_add modifier used by features like Crystalline Highlands.
  • 3x orbital deposit yields. Every numeric resource value inside a produces = { … } block on uncolonizable bodies is multiplied by 3 (d_minerals_3 produces 9 minerals/mo instead of 3, etc.).
  • 3x strategic resource district contribution. @DISTRICTS_FROM_SR_DEPOSITS (3 → 9) and @DISTRICTS_FROM_SR_DEPOSITS_SMALL (1 → 3) for the zone-district lines that use the variable instead of a literal.

Why it stays at 3x and doesn't compound

Each axis is multiplied independently of the others:

Axis Vanilla Mod Ratio
Planet size (= district slots) 25 75 3x
d_mineral_fields planetary feature +1 max mining district +3 max mining district 3x
d_minerals_3 orbital deposit produces 3 minerals/mo produces 9 minerals/mo 3x
Per-district per-pop output (untouched) (untouched) 1x

A planet has 3x slots × 1x per-slot output = ~3x total resource production, not 9x. The feature line that reads +3 max mining instead of +1 max mining keeps the proportion of feature-contributed slots constant; it doesn't add output on top of the size tripling.

Negative values (blocker penalties like district_farming_max_add = -1) are preserved at vanilla magnitude on purpose. On a planet that's 3x larger, blockers become proportionally less painful, which fits the "fewer, bigger, richer worlds" feel.

upkeep = { … } blocks are also left at vanilla magnitude — a deposit that vanilla defined as produces = { energy = 4 } upkeep = { energy = 1 } becomes produces = { energy = 12 } upkeep = { energy = 1 }, so net energy skews ~4× on that axis instead of 3×. Few vanilla deposits use upkeep, so the aggregate impact is small; symmetric upkeep scaling would be a separate behaviour change.

How it works

Two override surfaces — no events, no on_actions, no logic, just data:

  • mod/common/scripted_variables/zz_bworlds_planet_sizes.txt — redefines the six size / SR-deposit variables. The zz_ prefix sorts after vanilla's 100_scripted_variables_zones.txt, so the redefined values win when Paradox last-write-wins the constants.
  • mod/common/deposits/*.txt — same-named overrides for all 24 vanilla deposit files. Generated by scripts/build.py with regex multiplication of positive district_*_max_add and every numeric value inside produces = { … } blocks. @VAR references are left untouched (they get their tripling from the scripted_variables override above), and negatives are byte-preserved.

When Stellaris patches, re-run scripts/build.py and scripts/preflight.py. The regex transformations re-apply to the new vanilla files; preflight's exact-multiplier check catches any sequence drift.

  • Repo: apps/mods/stellaris/3x-bigger-worlds/
  • Steam Workshop: (not yet uploaded)

Build

python3 apps/mods/stellaris/3x-bigger-worlds/scripts/build.py

Reads from ~/Library/Application Support/Steam/steamapps/common/Stellaris/common/. The multiplier is a single constant at the top of build.py (MULTIPLIER = 3); change it for a 2x or 5x variant and re-run.

Pre-game verification

python3 apps/mods/stellaris/3x-bigger-worlds/scripts/preflight.py

Nine automated checks against the local vanilla install: brace balance, vanilla key coverage per deposit file, scripted-variables completeness at the expected multiplier, exact-multiplier verification of every generated district modifier and produces value, negative-value preservation, localisation BOM, descriptor sanity, deploy symlink integrity, and Workshop thumbnail validity (real PNG bytes, 512×512, no alpha, <1 MB — the same failure class that broke the first Multi-Megastructures Workshop upload). Full test plan in apps/mods/stellaris/3x-bigger-worlds/TESTING.md.

Deploy

apps/mods/stellaris/3x-bigger-worlds/scripts/deploy.sh

Creates a symlink ~/Documents/Paradox Interactive/Stellaris/mod/3x-bigger-worlds → repo's mod/ folder, plus the outer 3x-bigger-worlds.mod launcher descriptor with an absolute path= line. Idempotent. Because the deployed copy is a symlink, re-running build.py is picked up by the launcher with no re-deploy.

Test in-game

  1. Launch Stellaris → Paradox Launcher → Mods → enable 3x Bigger Worlds → Play.
  2. Planet size. Open the home planet — size should read 75 (vanilla starting capital is 25). Survey neighbour systems; habitable planets should be in the 36–75 range, moons 30–45.
  3. Planetary deposit district adds. Click a planetary feature ("Mineral Fields", "Bountiful Plains", "Geothermal Vent"…). The tooltip should show +3 Max Mining Districts, not +1. Spot-check across at least two planets.
  4. Orbital deposit yields. Find an uncolonizable body with a deposit shown in the system view. Vanilla d_minerals_2 yields 2/mo; under the mod the same deposit yields 6/mo.
  5. Strategic resource districts. Build a zone on a planet with an SR deposit; the unlocked district adds 9 max instead of 3.
  6. Tail ~/Documents/Paradox Interactive/Stellaris/logs/error.log after starting the game. Any new [ERROR] mentioning the override files is a regression — most likely a vanilla key the override accidentally drops (preflight C2 would catch it pre-game).

Known caveats

  • Balance. 3x resources trivializes the early-mid game; pop growth, upkeep, and AI weights are untouched, so empires will outgrow their pop base. Intentional for the "fewer, bigger, richer worlds" feel. Drop MULTIPLIER to 2 in build.py for a tighter variant.
  • AI. Vanilla AI weights assume vanilla sizes. AI empires build, but under-utilize the new slots.
  • Save compatibility. Planet size changes only affect newly generated galaxies. Deposit yield changes apply immediately on load (modifiers re-evaluate).
  • Mod conflicts. Any other mod that overrides common/deposits/*.txt or redefines the same @habitable_planet_*_size variables will conflict — last-loaded wins.
  • Hard-coded planet_size checks. A few scripted events have planet_size <= 25 conditions; behaviour around those events on size-75 planets is not characterized. Sample a quick game before committing to a long run.

Steam Workshop upload (when ready)

  1. (Optional) node scripts/generate-thumbnail.mjs to regenerate mod/thumbnail-src.png via Gemini, OR drop your own source image at mod/thumbnail-src.<ext> (PNG / JPEG / WebP / TIFF). The shipped thumbnail is the Gemini-generated one.
  2. scripts/process-thumbnail.sh — re-encodes the source to canonical 512×512 8-bit RGB PNG at mod/thumbnail.png (avoids the "JPEG bytes with .png extension" trap that broke the first Multi-Megastructures upload) and syncs the blog companion image.
  3. scripts/preflight.py — C9 verifies the thumbnail is real PNG, 512×512, no alpha, under 1 MB.
  4. Launcher → Mods → Mod Tools → Upload Mod.
  5. Select "3x Bigger Worlds", add description, upload.
  6. Change visibility from Private to Public on the Workshop page.