Warptorio 3 (No Space Age)


Warptorio2 2.0.0 + Planetorio 0.2.0, as one mod. Space Age must be disabled.

Content
a day ago
2.0
448

Changelog

Version: 2.5.2
Date: 12.05.2026
  Bug fix: warp loaders with output filters now output matching items
  instead of stalling.
    - Root cause was a key-type mismatch in the warploader cache. The
      distribution path at control_main_helpers_warploader.lua looks up
      filtered outputs with the transport-line stack name string
      (`storage.warploaders.outputf[stack.name]`). The filter-registration
      path in control_main_helpers_caches.lua stored filtered output lanes
      under the raw value returned by LuaEntity.get_filter(i). In Factorio
      2.0 that value can be an item prototype object, not the item-name
      string, so a loader filtered to iron-plate registered under the
      prototype object while OutputWarpLoader searched for "iron-plate".
      The lane existed, but the lookup could never find it.
    - Fixed by normalizing loader filters to item names before indexing
      storage.warploaders.outputf. The helper preserves the old string
      return shape as well, so this stays compatible if the API or another
      context already provides a plain item name.
  Bug fix: researching an energy-tier upgrade such as warptorio-energy-5
  while harvester portals existed no longer breaks both harvester entry
  teleporters until the next planet.
    - Root cause was another direct-rebuild vs clone-lifecycle split in
      control_class_harvester.lua. Normal harvester deploy/recall clones
      the harvestportal entity and the tpharvCache.clone handler relinks
      cache.teleport_dest between the two endpoints. Energy upgrades do
      not clone: ResearchEffects.upgrade_energy calls
      HARV:CheckTeleporterPairs, which replaces the portal prototype in
      place when the energy suffix changes. The harvester override did
      not relink teleport_dest after that direct rebuild, leaving valid
      portal entities that the on_player_changed_position teleporter
      probe could see but could not use.
    - The same replacement path also destroyed old harvestportals with
      raise_destroy=true. For generic warp teleporters that only removes
      cache entries, but harvester portal destruction is special:
      tpharvCache.destroy treats a raised destroy as a player/mining
      action and calls HARV:Recall(). So researching the energy upgrade
      could make the mod interpret its own prototype replacement as a
      harvester recall, leaving the newly placed pair in stale state
      until a later warp/planet rebuild refreshed it.
    - Fixed by suppressing raised destroy events for HARV's internal
      prototype replacements and by giving HARV:CheckTeleporterPairs the
      same teleport_dest relink/clear step that normal TeleporterMeta
      already had.
  Bug fix: starting or completing a warp while in map mode no longer
  evaluates the map camera/control position as if it were the player's
  body position.
    - Root cause was the main-floor player collection in
      control_platform_classic.lua:GetWarpables using LuaPlayer.position
      and LuaPlayer.surface for the platform-area test. In normal
      character control those point at the character, but in map mode
      Factorio can move the player's controller/view center independently
      of the physical character. If the map view center was outside the
      platform footprint while the character was standing safely on the
      platform, the player was omitted from the warp teleport list. Since
      character entities are intentionally excluded from the generic
      entity clone pass, that omission stranded the body on the old
      surface and produced a death on warp.
    - Fixed by resolving a valid LuaPlayer.character first and using the
      character's surface and position for the platform-presence check
      and destination coordinate snapshot. Characterless controller
      states keep the old LuaPlayer fallback path.
    - The warp-button guard in control_main.lua now follows the same
      rule: when a valid character exists, PlayerCanStartWarp checks the
      character surface instead of the map/control surface. This keeps
      the same-platform UX gate aligned with the actual body that will be
      warped.
  Bug fix: placing a harvester while flying a spider-vehicle (e.g. the
  "Marvin" flying robot from Spidertron-tier mods) over the deploy area
  no longer teleports the player into a dark corner of the harvester
  floor.
    - Root cause was a two-step interaction. Step 1: the harvester
      Deploy() function at control_class_harvester.lua:535-540 collects
      every entity in the deploy area on the main floor whose type is
      not in {construction-robot, logistic-robot, character}, clones
      that set onto the harvester floor at offset
      (deploy_position - position), and then destroys the originals.
      The exclusion list did not cover vehicle types, so cars,
      spider-vehicles, locomotives, and wagons parked on the deploy
      footprint got swept along with terrain decoration. Step 2: the
      on_entity_cloned handler at control_main.lua:1760-1766 (a long-
      standing 1.x-era hook, refreshed in v2.4.9 for spidertron-remote
      relinking) unconditionally teleports the driver of any cloned
      spider-vehicle to the destination and re-seats them. Combined,
      placing a harvester on top of a player flying Marvin: cloned
      Marvin to the harvester floor, teleported the player to it, and
      destroyed the original Marvin on the main floor. The "far off
      place" matched the harvester's home-vs-deploy offset; the dark
      surroundings matched the largely-untiled harvester floor.
    - Fixed by adding {car, spider-vehicle, locomotive, cargo-wagon,
      fluid-wagon, artillery-wagon} to the type exclusion lists in
      both clone collections that cross main floor -> harvester floor:
      Deploy()'s ecs filter (control_class_harvester.lua:535-540) and
      Recall()'s ebs filter (control_class_harvester.lua:378-382). The
      symmetric Recall()'s ecs filter (line 402-407, harvester floor
      -> main floor) is intentionally unchanged: vehicles parked on
      the harvester floor while the harvester is deployed should still
      be carried back to the main floor on Recall, and the existing
      on_entity_cloned driver-follow correctly transports the driver
      with them in that direction.
    - The on_entity_cloned handler itself is left intact. Its driver-
      follow + spidertron-remote-relink behaviour is correct for warp
      cloning (warptorio.Warp via Warpout, where the source surface is
      destroyed and the player must follow) and for the
      harvester->main Recall direction. Gating it on storage.is_warping
      would have broken Recall pull-back.
    - Pattern reference: warp's GetWarpables at
      control_platform_classic.lua:893 already excludes
      {car, character, player} from generic cloning and opts in
      spider-vehicle explicitly. The fix brings Deploy/Recall in line
      with that established pattern.
Version: 2.4.18
Date: 08.05.2026
  Code-health pass — no behavior change, no balance change. Pure
  refactor + docs release. Splits control_main_helpers.lua (which had
  grown to ~1008 lines mixing 5+ concerns) into 4 focused sibling
  files matching the project's small-focused-file convention, and
  documents two Factorio 2.0 modding footguns in CLAUDE.md that
  surfaced during the v2.4.x sessions.
  Refactored:
    - control_main_helpers.lua reduced to ~218 lines (settings +
      blueprint blacklist + misc) with 4 require() lines pulling in
      the siblings. Function bodies are moved verbatim — no logic
      changes, no rewrites. The audit (docs/superpowers/audits/
      2026-05-08-v2.4.14-health-and-release-readiness.md §2c) had
      flagged this as the only refactor candidate; the audit
      recommended waiting until 1100 lines but this release overrides
      that wait while there's no time pressure.
    - Created control_main_helpers_loot.lua (~105 lines): GetPossibleLoot,
      LootTable, SpawnLootChest, ChunkLootChest, on_chunk_generated
      registration.
    - Created control_main_helpers_ticks.lua (~115 lines): ClockTick,
      ChargeCountdownTick, WarpAlarmTick, PollutionTick, BiterTick,
      the inline radar_ability on_tick, and their registrations.
    - Created control_main_helpers_caches.lua (~449 lines): 11 local
      cache tables (tpCache, tpgateCache, tpharvCache, tppadWestCache,
      tppadEastCache, loaderCache, pipeCache, gpipeCache, chestCache,
      comboCache, warploader) with their methods and cache.ent /
      cache.type registrations. GetTeleporterEntityNames moves with
      the cache block since it lives inside that section.
    - Created control_main_helpers_warploader.lua (~121 lines):
      InsertWarpLane, NextWarploader, DistributeLoaderLine,
      OutputWarpLoader, TickWarploaders, TickLogistics, and the
      TickLogs on_tick registration.
  Documented:
    - CLAUDE.md gains two new anti-pattern subsections covering the
      cross-surface connect_to(target, false) requirement (root cause
      of v2.4.17 hotfix) and the accumulator chest-fallback
      circuit_connector recipe (companion to commit 8e58f24).
  Verification:
    - Per-extraction grep invariants confirmed total `function ` (75),
      `events.on_tick(` (7), `events.on_event(` (1), `events.hook(` (1),
      `cache.ent(` (9), and `cache.type(` (4) counts equal pre-fix
      totals across the 5 resulting files.
Version: 2.4.17
Date: 08.05.2026
  Hotfix: cross-floor circuit-network bridge restored.
    - In 1.x, paired teleporters on different floors bridged their
      circuit networks: signals on one floor's network were visible on
      the other floor's network, allowing aggregate views of e.g. total
      power consumption across all floors. The 2.0 port translated
      `connect_neighbour({target_entity=..., wire=...})` to the 2.0
      `LuaWireConnector.connect_to(target)` API correctly, but dropped
      the cross-surface enabling parameter: in 2.0 the engine rejects
      wire connections between connectors on different surfaces unless
      `reach_check=false` is explicitly passed as the second argument.
      The default (`true`) silently rejected the call, so paired
      teleporters' wires never actually merged their networks. Player
      saw two separate circuit networks even with wires plugged in.
    - Fixed by passing `reach_check=false` to both `red1.connect_to(red2)`
      and `green1.connect_to(green2)` in
      control_class_teleporter.lua:ConnectCircuit. This matches the
      pattern already used correctly by the chest-swap wire-copy helper
      at lib/lib_control.lua:148.
    - The data-stage circuit_connector chest fallback added earlier
      today (commit 8e58f24) is the necessary precondition: it lets
      wires physically attach to the accumulator-based teleporter
      prototypes (warptorio-teleporter-0, warptorio-underground-N).
      Without that fallback, there's nothing to wire up; without this
      fix, wires attach but signals don't bridge. Both are needed.
    - The harvester combinator's ConnectCombo function uses the same
      `connect_to` API (control_class_harvester.lua:215, 218) but only
      fires when the harvester is NOT deployed -- combos[1] and
      combos[2] are then on the same surface, so reach_check=true is
      fine. No change needed there.
Version: 2.4.16
Date: 08.05.2026
  Uniform science pack consumption — modernise to Factorio 2.0 vanilla
  convention. Every research project that previously consumed asymmetric
  per-pack counts (e.g. 2 red + 1 green, or 5 red + 4 green + 3 blue +
  2 purple + 1 yellow) now consumes 1 of each required pack type per
  cycle. Tier expression moves entirely onto the cycle count, the cycle
  time, and the set of pack types required — exactly how vanilla 2.0
  expresses tier across its tech tree. The legacy 1.x asymmetric pattern
  was a holdover from when red science was much cheaper to produce than
  green, so 2-red + 1-green kept the cost ratio balanced; in 2.0 vanilla
  Wube unified everything to "1 of each" for clarity, and this release
  brings warptorio in line.
  Changed:
    - 75 uneven `ExtendTech` pack tables in data_warptorio.lua normalised
      to `1` per pack. The set of pack types required by each tech is
      preserved; only the per-cycle count drops from whatever-it-was to
      `1`. Out of 128 total `ExtendTech` calls, 59 were already uniform
      and stay byte-identical; the remaining 69 unique uneven entries
      (75 line-level occurrences once duplicate source strings are
      counted) were rewritten.
  Unchanged:
    - Already-uniform entries stay byte-identical, including
      uniform-high entries like `{ red = 5, black = 5 }` (reactor
      module). The user's intent was to eliminate **uneven** entries,
      not eliminate high counts.
    - `unit.time` and `unit.count` are NOT touched. Scaling them to
      compensate for the cost change would produce ugly fractional
      values (22.5s, 33.7s, etc.) that break the round-number aesthetic.
      Vanilla 2.0 keeps research time at round numbers (15/30/45/60s)
      and warptorio follows.
    - Crafting recipes (e.g. the warpspider recipe touched in v2.4.15)
      are NOT affected. Recipe ingredient counts can be uneven in
      vanilla 2.0 (electric mining drill = 3 iron gears + 5 iron plates
      + 3 circuits, etc.); the uniform-pack rule applies to research
      only.
  Balance impact:
    - Late-game research becomes noticeably cheaper. Examples:
      `{ red = 2, green = 1 }` -> 2 packs/cycle (-33%);
      `{ red = 5, green = 4, blue = 3, purple = 2, yellow = 1 }` ->
      5 packs/cycle (-67%); the highest-tier descending-count entries
      drop ~70%. This is by design — the user accepted the side effect
      as part of the modernise-to-2.0 move. If post-release feedback
      shows late-game progression is too cheap, a follow-up release
      can raise specific `unit.count` values, but that's a separate
      design problem.
Version: 2.4.15
Date: 08.05.2026
  Audit-driven bundle release — resolves 14 of the 16 §3 recommendations
  from the v2.4.14 health + release-readiness audit. Two items deferred
  per the audit's own recommendations: item 13 (find_non_colliding_position
  fallback, parked because 2.0 is already strictly better than 1.x at the
  flagged site) and the control_main_helpers.lua refactor (deferred until
  the file passes 1100 lines). Full audit report at
  docs/superpowers/audits/2026-05-08-v2.4.14-health-and-release-readiness.md.
  HIGH:
    - Removed 1.x harvester circuit-connector APIs
      (`circuit_connector_definitions`, `get_circuit_connector_sprites`)
      from prototypes-updates/data_warptorio-harvester.lua. Both removed
      in Factorio 2.0; harvester wiring already disabled by
      circuit_wire_max_distance=0. Also dropped the dead `cc0()` helper
      and the `circuit-connector-sprites` require that referenced them.
    - Initialised storage.modtbl in on_init at control_main_remotes.lua.
      Fresh install triggers on_init before any on_config event; external
      mods calling InsertModTable from their own on_init handler crashed
      because storage.modtbl was nil.
    - Renamed warptorio.IsWarping field-clobber to storage.is_warping.
      The function at control_main.lua:1691 was overwritten with a boolean
      inside Warpout(), making any post-warp invocation crash. Remote
      interface captures by-reference at load time so external callers
      via remote.call were unaffected; the field is nevertheless
      inconsistent. Semantic note: pre-fix, the function meant
      'warp-charging active'; post-fix, it means 'Warpout function
      executing'. The boolean override was always tracking the latter;
      the rename collapses both reads to that semantic.
  MEDIUM:
    - Guarded warpspider tech space-science-pack prereq with
      mods["space-age"] check. No-Space-Age (the mod's target audience)
      could not research warpspider before this fix.
    - Fixed proto.UsedRecipes cache-bust argument scoping in
      lib/lib_data.lua. Function accepted a refresh flag but the
      parameter was missing from the signature; passing true silently
      no-op'd.
    - Guarded lib/lib_planets.lua's planetorio remote.calls with an
      interface check (early-return when absent). Bundled mod always
      provides the interface, but the file is also published standalone
      for third-party mod use.
    - Switched warptorio_planet_engine.lua's SimpleTemplateRoll from
      pairs to table.RankedPairs across all three iteration loops.
      pairs over a hash table is non-deterministic across Lua
      hash-bucket layouts; in MP this could desync the template roll
      between clients.
    - Pointed UpdateTemplate's deepmerge target at storage.templates
      (was planets.templates, the in-memory cache). Changes via remote
      callers now persist across reload.
    - Routed on_runtime_mod_setting_changed through events.hook instead
      of bare script.on_event at require time, matching the rest of the
      mod's event-registration discipline.
  LOW:
    - Removed six dead warpspider-weapon locale keys from
      locale/{en,de}/config.cfg (mirrors v2.4.9's beacon-11-15 cleanup).
    - Local-scoped combinator sprites table at
      prototypes/data_warptorio-combinator.lua:6 (was bare global).
    - Capped warptorio_autowarp_time at maximum_value=600 (10 minutes
      in seconds — the setting unit, confirmed by usage-site math) in
      settings.lua to prevent integer overflow in downstream tick math.
    - Removed abandoned `entTbl` + `entIgnore` scaffolding tables from
      data-updates.lua. Tables were defined in v2.4.1 baseline import
      but never referenced anywhere; intent was a planned data.raw
      iteration pass that never got implemented.
    - Deleted unused lib/lib_hide.lua. File contained a __recursive_assign
      utility (not hide logic) and was not loaded by lib.lua; grep
      confirmed zero callers.
  Balance fix (outside the audit list, surfaced during pre-ship test):
    - Reduced warpspider recipe's power-armor-mk2 ingredient from 8 to 1.
      In Factorio 2.0 most other spidertron-recipe ingredients
      (spidertron, satellite, fission-reactor-equipment) fill to 10+ in
      an assembler input slot, but power-armor-mk2 still has stack_size=1
      with no engine-side bump, so its slot caps at 1. With the recipe
      asking for 8, the assembler could never accumulate enough to craft
      the warpspider -- the recipe was effectively hand-craft-only, which
      was not the intent. 1.x had the same issue but it was never
      surfaced. The other six ingredient quantities stay at the v2.4.13
      restored 1.x values; only power-armor-mk2 changes, on the assembler-
      slot constraint.
Version: 2.4.14
Date: 08.05.2026
  Generalize the v2.4.12 Cat 2 defensive fix.
    The v2.4.12 audit identified six pmods that wrote to the noise-
    expression-referenced property family (moisture, aux, temperature,
    elevation, cliffiness, water_level) via the same `tostring(value)`
    pattern that caused the v2.4.10 cliffiness=0 -> AB lava-decal-blue
    compile crash. The Cat 2 finding fixed only the val=1 corner case
    in pmods.water; the other five direct setters (pmods.water_level,
    pmods.moisture, pmods.aux, pmods.temperature, pmods.elevation,
    pmods.cliffiness) were left exposed on the rationale that no
    current template passes 0 to them. Same justification, asymmetric
    application -- so this release closes the gap.
  Added:
    - `planets.SetPropertyExpression(g, key, value)` helper. Coerces
      value to string, but skips the write entirely when value
      coerces to numeric zero. Named noise-expression strings
      ("elevation_island", "warptorio_ocean_moisture") are
      unaffected because tonumber("name") -> nil; only literal-zero
      pins are suppressed.
  Changed (no behavior change today, defensive against future
  template authors):
    - All six property-family pmods now route through the helper:
      pmods.water (water_level + the val=0/val>=5 elevation
      overrides), pmods.water_level, pmods.moisture, pmods.aux,
      pmods.temperature, pmods.elevation, pmods.cliffiness. A
      future template author writing `{ "moisture", { value = 0 } }`
      or similar to mean "Nauvis default" gets the default they
      meant rather than a constant-zero pin that would compile-crash
      under AB or any mod that references the property in a
      multioctave_noise(octaves=...) chain.
    - Templates that genuinely need to pin a property to literal
      zero (no current template does, and the cliffiness=0 case was
      already converted to cliff_settings.richness=0 in v2.4.10) can
      still bypass via the gen.property_expression_names = { foo = "0" }
      direct-write path; that route does not run through the helper.
Version: 2.4.13
Date: 06.05.2026
  Deferred-list cleanup pass.
  Removed:
    - Dead feature stub `warptorio.CountPlatformEntities` (always
      returned a hardcoded 5 with `-- todo`). The function was used in
      the warp-charge-time formula via `(cot / sgFactor)`, which with
      the hardcoded 5 collapsed to a constant 0.071 (below the noise
      floor of warp timing). The companion runtime setting
      `warptorio_warp_charge_factor` is also removed, along with its
      en/de locale entries. Saves that toggled the setting away from
      default will see it silently revert; the behaviour change is
      below the noise floor so this is acceptable.
  Restored (1.x parity, balance change):
    - Warpspider recipe quantities restored to 1.x values. The 2.0
      port silently dropped spidertron / power-armor-mk2 / satellite
      from 8 to 1, and raw-fish from 9 to 8. Restored to 1.x's
      values: spidertron=8, power-armor-mk2=8,
      fission-reactor-equipment=8, raw-fish=9, satellite=8,
      artillery-turret=8, rocket-silo=1. (`fission-reactor-equipment`
      is the 2.0-renamed equivalent of 1.x's
      `fusion-reactor-equipment`; that rename stays.) NOTE: this is a
      significant balance change. Players mid-progression toward a
      warpspider will need 7 extra spidertrons, 7 extra power armors,
      7 extra satellites, and 1 extra fish vs. the 2.0.0-2.4.12
      recipe. Existing crafted warpspider entities in saves are
      unaffected.
  Implemented:
    - `warptorio.PlayerCanStartWarp(ply)` now actually does
      something. Previously a no-op stub returning unconditional true,
      leaving the `else ply.print({ "warptorio.same-planet-error" })`
      branch in the warp-button click handler unreachable. Restored
      the 1.x-implied semantic from the locale text "You must be on
      the same planet as the platform to warp": clicking warp while on
      the homeworld surface or a deployed harvester surface now shows
      the error and blocks the warp. Vote-warp branches still don't
      call this guard (intentional -- votes are aggregated, the
      player who completes the threshold can be on any surface). The
      function remains a public override hook for third-party mods.
  Confirmed (no code change):
    - Win condition stays homeworld-only. The 2.0 port's
      `set_no_victory(true)` call to silo_script + `HomeSweetHome()`
      victory trigger remains the canonical victory path. Rocket
      launch does nothing; setting your homeworld is the win
      condition. Documented here so future audits don't re-flag it.
Version: 2.4.12
Date: 06.05.2026
  1.x -> 2.0 latent-bug sweep — bundle release
    Three audit passes proactively scanning for the same class of
    bug that produced v2.4.10 (constant-pinned noise expression) and
    v2.4.11 (type-gated property access). Audit reports under
    docs/superpowers/audits/ and design + plan under
    docs/superpowers/specs/ and docs/superpowers/plans/.
  Cat 1 (type-gated property access): zero findings.
    Codebase scan of every LuaObject property read showed all
    type-gated reads are guarded by data flow, cache.ent prototype
    filters, universal LuaObject properties, or existing nil/valid
    guards. The v2.4.11 connected_entity fix appears to have been the
    only such bug.
  Cat 2 (constant-pinned noise expressions): one defensive fix.
    Zero HIGH findings. One MEDIUM (defensive) — pmods.water at val=1
    (Nauvis-default water level) wrote `water_level = "0"` to
    property_expression_names, the same anti-pattern that caused the
    v2.4.10 cliffiness=0 -> AB lava-decal-blue compile crash. No
    current template uses val=1, but a future template author writing
    `{ "water", { value = 1 } }` to mean "Nauvis-default water"
    explicitly would hit the foot-gun. Fixed: skip the water_level
    write entirely when (1-val)*0.5 == 0, so Factorio applies its own
    default water_level expression (which is what "Nauvis default"
    means anyway).
  Cat 3 (renamed/removed APIs and behavior changes): zero findings.
    Checklist-driven scan against eight suspicious patterns
    (events, data.raw types, prototypes tables, defines.X enums,
    rendering API, find_entities_filtered shapes, MapSettings paths,
    blueprint methods, victory API, force methods) found everything
    already using the canonical Factorio 2.0 API. The 2.0 port was
    done methodically and the residual bugs through v2.4.11 were
    narrow runtime crashes that hotfix releases handled.
Version: 2.4.11
Date: 06.05.2026
  Hotfix: spidertron-remote re-link crashed on the first non-remote stack
    - The 2.4.9 spidertron-remote re-link (the 1.x 1.3.5 fix restoration)
      crashed on its first call: `LuaItemStack doesn't contain key
      connected_entity` while iterating any player's main inventory that
      held items other than spidertron remotes. Root cause: the 1.x
      port read `stack.connected_entity` directly without a prototype
      type guard. In Factorio 1.1 reading that property on a non-remote
      item returned nil; in Factorio 2.0 it raises "doesn't contain
      key" because the property only exists on spidertron-remote items.
      So the very first iron-plate or transport-belt stack iterated by
      the relink loop killed the warp event.
      Fixed by adding `stack.prototype.type == "spidertron-remote"` as
      a guard before reading `.connected_entity`. Ordinary inventory
      items now pass through the relink loop without touching the
      property; only actual spidertron remotes are checked and rewritten.
Version: 2.4.10
Date: 06.05.2026
  Hotfix: ocean-template warp crashed on Alien Biomes saves
    - Warping to the ocean template with Alien Biomes loaded crashed
      `create_surface` with `MultioctaveNoise::octaves must be > 0 and
      can't be infinite` while compiling
      `decorative:lava-decal-blue:probability`. Root cause: the ocean
      template pinned the cliffiness noise expression to the constant 0
      (via `{ "cliffiness", 0 }`, written to
      property_expression_names["cliffiness"] as the string "0"). AB's
      `lava-decal-blue:probability` references `cliffiness` inside a
      `multioctave_noise(octaves=...)` call; the derived octaves count
      came out as 0 (or infinity through a 1/cliffiness branch), and the
      engine refused to compile the expression -- on every roll of the
      ocean template. Fixed by replacing the cliffiness pin with a
      `cliff_settings.richness=0` configuration via the `cliffs`
      modifier, which achieves the same "no cliffs" gameplay outcome
      via the proper Factorio 2.0 API and leaves the cliffiness noise
      expression untouched, so AB's downstream expressions compile
      normally.
    - Updated docs/planet-modifiers.md to flag the same pattern for
      authors of third-party templates: don't pin moisture, temperature,
      aux, elevation, or cliffiness to the constant 0; use the proper
      knob (cliff_settings, water value, or a small nonzero constant)
      instead.
Version: 2.4.9
Date: 06.05.2026
  "Round" release -- closing the remaining 1.x parity gap and removing
  dead-stub surface area that has been sitting in both 1.x and 2.0
  unimplemented. A 1.x -> 2.0 audit (spec at
  docs/superpowers/specs/2026-05-06-v2.4.9-round-release-design.md)
  found that 2.4.8 was already substantially at parity with warptorio2
  1.3.10; this release closes the one regression and cleans up the
  visible dead-stub items.
  Restored regression:
    - Spidertron remotes now stay bound across warps. 1.x's
      control_main.lua:829-838 (the 1.3.5 fix) walked every player's
      main inventory and cursor stack on each spider-vehicle clone and
      rewrote stack.connected_entity from the old spidertron to the
      new one. The 2.0 port lost this -- the on_entity_cloned handler
      only re-seated the driver. Result: every warp left players
      holding remotes that had to be re-aimed by hand to re-bind to
      the cloned spidertron. Restored in control_main.lua's
      on_entity_cloned, with a single relink helper that valid_for_read
      guards each stack and works for offline players' stored
      inventories too. Spidertrons left behind on abandoned warpzones
      (i.e. NOT cloned because they sat outside the warp area) are
      not handled -- same behaviour as 1.x.
  Implemented:
    - warptorio_no_blueprint setting now actually does something. It
      was registered in settings.lua and exposed in the locale, but
      the handler was commented out in 1.x's control_main_helpers.lua:9-16
      and entirely absent from 2.0; toggling the setting was a no-op.
      Now: when the setting is on and a player creates or edits a
      blueprint, warptorio platform entities (teleporter portals,
      undergrounds, harvestpads, harvestportals, warploaders,
      warpstation, warpport, warpspider, reactor) are stripped from
      the blueprint at setup time. Non-platform warptorio items
      (carebear chest, lootchest, combinator, logistics-pipe,
      heatpipe, town/home portals, warpnuke ammo, warponium fuel,
      warp armor) are NOT blacklisted -- those are ordinary craftable
      goods players legitimately want in blueprints.
  Cleanup (no behaviour change):
    - Removed dead locale entries warptorio-beacon-11 through
      warptorio-beacon-15 from locale/en/config.cfg and locale/de/config.cfg.
      The beacon prototype loop in data_warptorio.lua only generates
      tiers 1 through 10, so locale slots 11-15 had been dangling
      since the loop's upper bound was last lowered.
    - Updated a leftover docstring in control_main.lua's warp button
      handler that referenced the old warptorio.remote.event_warp_started
      name (deprecated in 1.x, removed in 2.4.8). Now points at the
      canonical remote.call("warptorio", "get_event", "warp_started").
  Note on 1.x saves:
    - Saves from Warptorio 1.x (Factorio 1.1) cannot be loaded into
      Factorio 2.0. This is enforced by the Factorio engine's
      factorio_version constraint, not by warptorio. Start a new save
      in Factorio 2.0 to use warptorio3_2.
Version: 2.4.8
Date: 04.05.2026
  CRITICAL FIX -- entire planets engine event flow was dark:
    - planets.GetBySurface(luasurface) returned nil on every call since the
      Factorio 2.0 port. The function used `istable(f)` to extract f.index
      from a LuaSurface ref, but in Factorio 2.0 LuaObjects are `userdata`,
      not `table` -- so istable returned false, the index variable stayed
      false, and the storage.worlds[false] lookup always returned nil.
      Cascading consequences:
      * Every per-planet event hook was silently no-op'd. Templates that
        defined on_chunk_generated, on_surface_created, on_pre_surface_cleared,
        on_pre_surface_destroyed, or on_biter_base_built never fired their
        callbacks, because the engine couldn't resolve the planet record
        for the surface the event came from.
      * GetMainPlanet always returned nil. Anything using
        remote.call("warptorio","GetMainPlanet") -- including the warp
        roller's lookup of the previous template's flags -- saw nothing.
      * As a direct result, the back-to-back planet rejection rule (no two
        rest / resource / aggressive planets in a row, introduced in 2.4.0
        and "fixed" in 2.4.6) was actually broken every single warp the
        whole time -- 2.4.6's fix made the caller pass the right key, but
        the lookup itself silently failed inside GetBySurface, so the
        rule never received a non-nil prevplanet template and never
        rejected anything. Sequences like resource -> resource -> resource
        could (and did) come up freely.
      * planets.OnChunkGenerated's enemy-force reassignment (which moves
        biters in newly-generated chunks onto the planet's force, when
        the template defines one) never fired, so any custom-force biter
        planet was using the vanilla enemy force.
      Fix is a rewrite of GetBySurface that handles `number`, `string`,
      `table`-typed and `userdata`-typed LuaSurface refs explicitly via
      direct `.index` access, with a short-circuit nil return when no
      index can be resolved. With the fix in place, all of the above
      dark-feature classes light up correctly: the back-to-back rule
      actually filters resource/resource pairs, GetMainPlanet returns
      the current planet, and per-template event callbacks fire as
      designed.
  Bugfixes from a baseline audit pass:
    - Carebear runtime setting toggle no longer crashes when fired
      before the platform is fully initialised (or during a teardown /
      migration window). The handler now nil-and-valid-checks
      storage.floor.main.host before create_entity, and rolls back
      storage.carebear if the chest creation itself doesn't return a
      valid entity. Previously a misclick on the setting at the wrong
      moment could throw on_runtime_mod_setting_changed, which on
      multiplayer would leave the toggling client unable to interact
      with the rest of the mod's settings until the next reload.
    - Train rail logistics no longer crashes when a chest reference in
      self.chests[1] becomes invalid mid-tick. SplitItem,
      UnloadLogistics, and LoadLogistics now isvalid-guard each chest
      and wagon they touch, matching the pattern BalanceChests already
      used. Same file: TickLogistics's `local f = storage.floor.main.host`
      is now reordered so the validity check happens before the
      dereference -- previously the .host index would error before the
      `if not f.valid` guard ran, on the rare tick where storage.floor.main
      was nil during a teardown.
    - The provider/requester chest setting (warptorio_loaderchest_provider
      and warptorio_loaderchest_requester) now actually does something
      when toggled at runtime. The handler was an empty stub since the
      2.0 port -- toggling the chest type silently did nothing until the
      next teleporter rebuild. Fixed: the handler now rebuilds logistics
      on every active teleporter, the same pattern LoaderSideChanged
      already used. Affects only logistics tier 4 (the highest tier in
      ChestBeltPairs); lower tiers don't read the setting.
    - NewGamePlus integration no longer skips its handler registration
      on the very first session of a save. The HookNewGamePlus call was
      commented out in on_init, leaving on_load as the only registration
      path, which meant the first session of a NewGamePlus save ran
      without the hooks (only subsequent reloads picked them up). The
      on_init call is restored, on_configuration_changed now also calls
      it (so adding NewGamePlus to an existing save takes effect), and
      the on_load path is preserved for the standard re-registration
      role. The module-level newgameplus flag is what guards against
      double-registration within a session; behaviour after the first
      tick of any session is unchanged.
  Performance:
    - The on_position teleporter probe (every player, every position
      update) used to scan find_entities_filtered{type="accumulator"}
      and then ask cache.get_entity to discard non-warptorio results.
      Now it name-filters at the engine level against a list of actual
      portal prototypes (warptorio-teleporter-N, warptorio-teleporter-gate-N,
      warptorio-underground-N, warptorio-harvestportal-N). The list is
      built lazily on first call and filtered against prototypes.entity
      so unregistered candidate names (e.g. tier slots beyond what the
      data stage actually defines) don't trip find_entities_filtered's
      "Unknown entity name" check. Walking near a vanilla solar farm no
      longer fires a cache lookup per accumulator; only real warptorio
      portals come back from the engine.
    - WarpFinished's per-surface character-emptiness scan is now
      deferred onto the same one-surface-per-tick drainer that already
      handled the actual delete (introduced in 2.4.5). Previously the
      scan still ran synchronously in WarpFinished -- meaning each
      warp tick paid for an unbounded find_entities_filtered{type="character"}
      on every abandoned warpzone, even though the deletion itself was
      paced. On saves that have accumulated a lot of warpzones with
      many generated chunks, this trims a few ms off the warp tick
      itself.
  Cleanup (no behaviour change):
    - Removed dead helpers in lib/lib_control.lua: surfaces.BlankSurface
      (empty stub, unreferenced) and surfaces.spawnbiters (broken in
      multiple ways since import: undefined local at line 416,
      math.random(0, 2*math.pi) returning ints, set_multi_command
      targeting a player character; unreferenced).
    - Removed empty warptorio.ValidateWarpBlacklist function and its two
      call sites. It was a stub left over from when the warp-blacklist
      lived in storage.warp_blacklist; that bucket was replaced by
      storage.modtbl years ago and the validate function was never
      reimplemented for the new layout.
    - Removed three never-defined remote exports
      (PlanetEntityIsPlatform, EntityIsPlatform,
      BlueprintEntityIsBlacklisted). The fields they pointed at on the
      warptorio module never existed, so any external mod calling them
      through the remote interface was hitting "Unknown remote
      function" errors. Better to not advertise an API that doesn't
      exist; if these are needed in future, write the implementation
      first and re-register at that time.
    - Removed initialisation of storage.Turrets (never read or written
      anywhere else; vestigial) and storage.warp_charge reset in
      WarpPreBuildPlanet (set but never read; only warp_charging and
      warp_charge_time are consumed elsewhere).
Version: 2.4.7
Date: 04.05.2026
  Bugfix:
    - on_init no longer crashes with "Unknown interface: freeplay"
      when the loaded scenario isn't freeplay (custom scenarios,
      mod-shipped maps that run their own scenario, etc.). The
      "set custom intro message" call is now guarded with
      `if remote.interfaces.freeplay then ... end` -- matching the
      guard already in place on the silo_script call right below
      it. The two other freeplay calls (set_disable_crashsite,
      set_skip_intro) were already pcall-wrapped, so this brings
      the third one into line with the existing pattern.
Version: 2.4.6
Date: 03.05.2026
  Same-category-twice-in-a-row really doesn't happen now:
    - The "no two rest planets in a row, no two resource planets
      in a row, no two aggressive planets in a row" rule that
      2.4.0 introduced has been silently broken since 2.4.0.
      WarpBuildPlanet was passing the previous planet's full
      object table where the roll function expected a template
      key string, so the lookup that determines "what category was
      the last warp?" returned nil and the rejection branch was
      skipped on every roll. As of this release the right value is
      passed and the rule actually filters candidates again --
      back-to-back ocean -> ocean (or any other same-category
      pair) won't roll unless the candidate pool legitimately
      collapses to a single category.
Version: 2.4.5
Date: 03.05.2026
  Multiplayer warp lag:
    - The connecting player's post-warp freeze is shorter now,
      especially on saves where several abandoned warpzones have
      accumulated. Cleanup of those abandoned surfaces used to run
      synchronously at the end of every warp; on a save with three
      or four old warpzones it could add 5-15 seconds to the
      post-warp lag the connecting player experiences. The actual
      deletion now happens in the background, one surface per
      second, outside the warp's host-blocking window. Same end
      state, just without the freeze.
    - Same pass tightened the surface scan in WarpFinished -- the
      check now skips non-warpzone surfaces (platform floors,
      boiler, factory, harvester, homeworld) up front instead of
      running find_entities_filtered on them only to discover they
      weren't deletable anyway.
Version: 2.4.4
Date: 03.05.2026
  Ocean planet -- shoreline beach restored on Alien Biomes saves:
    - The ocean island's sandy beach disappeared on AB-loaded saves
      after the 2.4.3 cleanup. The cleanup had removed the
      autoplace_settings.tile.settings pre-population from ocean's
      gen field (intended as a redundant defense after engine fixes
      made it technically unnecessary). Removing it changed how
      sand-1 and grass-2 ended up in autoplace_settings: instead of
      empty {} entries (which let each tile's prototype probability
      expression fire unchanged), the settings now came in via
      pmods.nauvis's tile lookup, which copies the source surface's
      autoplace_settings overrides for that tile name. On AB saves
      that meant copying AB's biome-system overrides on
      mineral-brown-sand-1 -- which suppress vanilla sand-1's
      shoreline-firing term -- and the beach silently stopped
      forming. The empty-{} pre-population in gen is restored.
Version: 2.4.3
Date: 03.05.2026
  Other planets get the same Alien Biomes treatment ocean got:
    - Jungle now varies its biome rather than forcing every tile
      into the same wet-tropical mix. The previous version pinned
      moisture/temperature/aux to flat constants, which on Alien
      Biomes saves locked out almost every AB tree variant (each
      AB tree gates on a per-variant noise window). The new jungle
      biases the noise toward "lush wet" instead of pinning it,
      so AB picks tree variants that fit the biome -- and on
      vanilla saves the dense forest still reads as a jungle.
    - Barren now has dry decoration on the ground (sand decals,
      dry vegetation patches) instead of being completely bare
      between the rocks. Previously barren only allowed rock
      decoratives, so on Alien Biomes saves nothing else placed.
      Each decorative still decides whether to fire based on the
      biome, so barren stays visibly dry; it just stops looking
      sterile.
    - Rogue's small ground decoration finally appears too. The
      template wanted "sparse non-rock decoration" all along but
      a bug in the decoration helper was silently giving the
      sparse setting to ROCKS instead, then having it overwritten
      by the explicit rock-density modifier two lines later. End
      result was no small decoration on rogue at all. Fixed at
      the helper level (see below); rogue's own template didn't
      need to change.
  Engine fixes (relevant to anyone authoring planet templates):
    - planets.lookup() now uses literal-substring matching instead
      of Lua's pattern-matching. Lua treats `-` as a "0 or more"
      quantifier in patterns, so e.g. matching the name "sand-1"
      against the cache name "sand-1" actually returned no match,
      which silently dropped every hyphenated tile / entity /
      decorative name out of every whitelist. Tile names like
      grass-2, sand-1, vegetation-green-grass-2,
      mineral-brown-sand-1, tree-grassland-c, etc. now match
      correctly. (Templates that previously listed bare names like
      "tree" or "rock" still work the same way -- those are
      substrings that match anything containing them, exactly the
      behaviour they had before.)
    - The decoratives helper's "all non-rock decoratives" default
      selection actually returns non-rock decoratives now. The
      previous version had a quiet bug where the inversion flag
      was ignored when the pattern was a plain string; the helper
      ended up returning rock decoratives instead. Templates like
      rogue that asked for "sparse non-rock decoration" were
      therefore inadvertently scaling rocks. Both Path 2 templates
      that depend on this default (rogue and the new barren
      modifier) work as intended.
    - pmods.nauvis Path 1 (the full-Nauvis-copy variant used by
      most templates) now merges property_expression_names from
      Nauvis with whatever the template's gen field set up,
      instead of replacing wholesale. Templates that declare
      noise overrides via gen (e.g. control-setting biases) now
      keep them through the Nauvis copy. Path 2 already worked
      this way; this aligns Path 1.
Version: 2.4.2
Date: 03.05.2026
  Quality of life:
    - The chat message after a warp now always shows the world's
      name first, with the description below it. Previously the
      name was hidden until you researched Charting, so on early
      warps you only saw the description and had to guess which
      planet you'd landed on.
  Ocean planet -- sandy beaches and a lived-in island:
    - The ocean island now has a sandy beach where land meets
      water (sand patches along the shoreline rather than a
      uniform band -- matches how vanilla Nauvis shorelines look),
      grass tufts and small bushes scattered across the grass
      interior, and visible tree clusters across the island.
    - Works with Alien Biomes loaded, too. The previous template
      flattened the underlying noise variables (aux pinned to a
      single value), which gated out almost every AB tree variant
      and most AB ground decoratives. The new template biases the
      noise instead of pinning it, so AB's biome system sees the
      variation it expects and picks tree variants and biome-
      specific decoratives the way it does on any other surface.
Version: 2.4.1
Date: 03.05.2026
  Planet rotation:
    - "Normal" worlds now lose 1-2 random resources per warp, so
      back-to-back normal warps feel different from each other. The
      "uncharted" planet stays as the only template that gives you
      your exact starting resource set.
    - Jungle has biters again (was peaceful in 2.4.0). The flavour
      text -- "trees might be enough to conceal your location from
      the natives" -- only makes sense with hostile natives present.
      Jungle stays in the peaceful-weight rotation tier, so it still
      appears as often as ocean and barren.
    - Ocean's 8x ambient fish are back. The small island felt
      lifeless without the swirling fish around it.
  World generation fixes:
    - Trees no longer come out as the dead-tree variants on Nauvis-
      style worlds. The bug was that pmods.nauvis was building tree
      autoplace settings from scratch instead of inheriting Nauvis's
      own moisture/aux-aware tuning. "Normal" planets used to look
      empty (sparse trees, no rocks, no cliffs); they now match what
      you'd expect from a fresh Nauvis.
    - Templates can now layer custom elevation expressions on top of
      a high water level without the water modifier overwriting
      them. Previously {"water", value=6} silently flattened any
      island terrain you'd configured.
    - Cliffs, water-frequency, rocks, starting_area, and the noise
      that drives tree variant selection are no longer accidentally
      stripped from worlds (a leftover from the Factorio 1.x ->
      2.0 port).
  Settings:
    - Category-weight sliders (peaceful, resource, aggressive)
      widened from 0.0-1.0 to 0.0-2.0. You can now UPSCALE a
      category (e.g. resource = 2.0 makes resource planets roughly
      twice as common) instead of only downscaling. Default still
      1.0; existing saves unaffected.
  Locale:
    - Mod-setting tooltips were silently invisible since the
      Factorio 2.0 port (~30 settings affected). Tooltips now show
      correctly when you hover the setting in the mod settings
      menu, in both English and German.
  For modders:
    - New file docs/planet-modifiers.md documents the public
      modifier API for third-party planet packs.
Version: 2.4.0
Date: 02.05.2026
  Major changes -- planet rotation:
    - New mod settings let you control how often each category of
      planet appears:
        warptorio_peaceful_weight    rest planets (ocean, barren,
                                     jungle)
        warptorio_resource_weight    resource planets (iron, copper,
                                     coal, stone, oil, uranium, rich)
        warptorio_aggressive_weight  hostile planets (midnight,
                                     polluted, biter, rogue)
      Default 1.0 = unchanged. Set to 0.0 to ban a category outright,
      or anywhere in between to dial it down.
    - Warps no longer pick two planets from the same category in a
      row -- no two rest planets back-to-back, no two resource
      planets back-to-back, etc. Falls back gracefully if only one
      category is available at your current warp zone.
    - Per-planet weight settings (planet_normal, planet_ocean, ...)
      are still configurable but no longer clutter the startup
      menu (14 entries hidden).
  Ocean planet rewritten:
    - Replaces the old all-water ocean (which often came out as a
      flooded Nauvis with whatever islands the noise happened to
      throw up). The new ocean is a small focused grass island in
      endless deep water, transcribed from Factorio 2.0's in-game
      "Island" map preset. Same warp zone (3) and weight as before.
  Other planet tweaks:
    - Jungle: biters removed -- jungle is now genuinely peaceful.
      (See 2.4.1 -- this was reverted.)
    - Dwarf: scaling restored to the original "you are a giant"
      intent. Resources back to 0.35x and biters back to 0.5x;
      the small map size and tight starting area are kept.
    - Barren: warp-zone unlock pushed from 12 to 21 (late mid-game).
      New rest-planet progression: ocean (3) -> barren (21) ->
      jungle (27).
  Locale:
    - All planet names and descriptions restored to the original
      Planetorio 0.1.5 flavour text (the pun-heavy / Undertale-
      referencing in-character lines). Examples: ocean's "the
      nearby fish that greet you fills you with determination",
      stone's "stuck somewhere between a rock and a hard place".
      German translations added (the original mod was English-only).
  New game start (intro cinematic):
    - Custom 3-phase opening replaces freeplay's native intro:
        Phase 1: platform-on-void close-up with siren and screen
                 shake (~5s).
        Phase 2: terrain restored, warp-reactor wreckage spawns
                 south-west of you, big-explosion plays.
        Phase 3: camera zooms out to reveal the full surroundings,
                 hands control to the player.
      Total ~7s. Esc skips. Surrounding terrain (rocks, trees,
      decoratives) is preserved through the void/restore cycle.
Version: 2.3.4
Date: 30.04.2026
  Cleanup (no visible behaviour change):
    - Removed several obsolete Factorio 1.x patterns -- deprecated
      "hidden" item flag, 8-step direction helper, no-op nil
      assignments. Item visibility, direction handling, and
      circuit wires keep working exactly as before.
    - Quality is now propagated explicitly when chests are seeded
      with starting items (carebear / loot chests). The engine
      defaulted to "normal" anyway, but consistent code is easier
      to audit.
Version: 2.3.3
Date: 30.04.2026
  Bugfixes (Quality):
    - Harvester loader belts no longer duplicate items when the
      source belt carries non-normal-quality stacks. The forwarding
      code was dropping the quality field, so the destination got
      a freshly-spawned normal-quality item every tick while the
      source was unchanged -- silent infinite duplication on any
      harvester pulling uncommon/rare/epic/legendary materials.
    - Teleporter chest tier upgrades no longer silently downgrade
      every non-normal-quality item to normal quality. When a
      logistics tech swapped the chest prototype (e.g. steel-chest
      to passive-provider), the chest contents were rebuilt
      without forwarding their quality.
  Bugfixes (Fluids):
    - Heated fluid temperature is now preserved across warp pipes
      for any heat-bearing fluid, not just steam. Modded thermal
      loops (alternate steam variants, etc.) used to silently
      reset to base temperature on every transfer.
Version: 2.3.2
Date: 30.04.2026
  Changes:
    - Reverted changes from 2.3.1.
Version: 2.2.10
Date: 29.04.2026
  Bugfixes (Factorio 2.0 sweep):
    - Heat actually flows between adjacent warp-heatpipes again.
      The connection edges were rotated 45 degrees (a leftover
      from Factorio 1.x's 8-step direction system in 2.0's 16-step
      world), so heat-pipes connected on diagonal edges no
      orthogonal pipe could ever touch. Existing placed
      warptorio-heatpipes may need to be mined and re-placed for
      the fix to take effect.
    - Teleporter warp-pipe orientation no longer drifts every time
      the pipes are destroyed and recreated.
    - Teleporter pipes no longer drain entire fluid networks. The
      "clear orphan pipe" logic was matching paired pipes too,
      which in Factorio 2.0's segment-based fluid model meant
      emptying every pipe connected to it.
    - The /research-cheat remote now actually completes research
      (was a silent no-op).
  Tech tree:
    - Cleared 14 redundant prerequisites Factorio 2.0 was warning
      about on load. No tech-tree shape change -- the prereqs were
      duplicate, not load-bearing.
Version: 2.2.9
Date: 29.04.2026
  Intro cutscene:
    - End-of-cutscene zoom changed from 0.31 (extreme far-out) to
      1.0 (normal character view). The cinematic now hands control
      back at the same zoom level you'd be at on a fresh game
      start, instead of a tiny dot.
Version: 2.2.8
Date: 29.04.2026
  Intro cutscene:
    - Removed the visible camera bounce when the cutscene ends and
      control hands back to the player.
Version: 2.2.7
Date: 29.04.2026
  Bugfixes:
    - Warp pipes no longer silently delete ~95% of the fluid pumped
      through them. A 1200 water/s pump on the ground floor used to
      produce only 1-2 water/s in boiler-room storage tanks; now
      throughput is bounded by source supply and destination demand
      as expected.
Version: 2.2.6
Date: 29.04.2026
  Intro cutscene:
    - Replaced the two-stage zoom with a single continuous zoom-out.
      Camera holds during the void/alarm phase, then after impact
      zooms straight out over 3 seconds.
    - Lengthened the void/alarm hold from 3s to 5s so the buildup
      reads with more weight.
Version: 2.2.5
Date: 29.04.2026
  Intro flow polish:
    - Phase 1 cutscene zoom widened from 3.0 to 1.8 -- you now see
      enough surrounding blackness for the screen-shake to register.
    - "CRITICAL MACHINE ERROR" alarm now renders as a framed red
      panel pulsing in sync with the siren horn, instead of plain
      flying-text.
    - Speech bubble copy rewritten with red-bold lede ("Your warp
      went wrong."), white body, yellow-bold objective for
      readability parity with vanilla tutorial bubbles.
    - Alarm uses the standard siren horn sound.
    - Speech bubble auto-closes after 15 seconds (was 10).
  Locale:
    - 13 missing planet RNG settings now have proper labels in the
      mod settings menu (were "Unknown key: ..." entries).
    - "Planet Clock" -> "Time on Planet" (Planeten-Uhr -> Zeit auf
      dem Planeten).
Version: 2.2.4
Date: 29.04.2026
  Intro flow / new game start:
    - Custom 3-phase opening cinematic replaces freeplay's native
      intro.
        * Phase 1 (~1.5s): close-up of the platform alone in a
          black void, alarm siren, offscreen explosions for
          screen-shake.
        * Phase 2 (instant): terrain reappears around you, warp-
          reactor wreckage spawns south-west, big-explosion plays
          for the moment of impact.
        * Phase 3 (~4s): camera zooms out to reveal everything,
          hands control to the player.
      Esc skips. Total ~7s.
    - Intro popup is the standard Compilatron speech bubble
      floating over your character. Auto-closes after 10s; Tab
      also dismisses.
  Bugfixes:
    - Custom GUI handlers no longer crash when one handler
      destroys the GUI element another handler is about to act on.
Version: 2.2.2
Date: 29.04.2026
  Worldgen:
    - "Basic" planet templates use Factorio's vanilla starting-area
      size again, instead of being forced to 0.5x. Templates that
      explicitly set their own starting_area (ocean, jungle, dwarf,
      biter, rogue) are unchanged.
  Cleanup:
    - Removed two never-used helpers from the new-game flow.
Version: 2.2.1
Date: 28.04.2026
  Lore / new game start (thanks to Shadow_Man):
    - Vanilla crashsite (ship + debris + repaired entities + loot
      chests) replaced with a "failed warp" opening that fits
      Warptorio's lore -- you arrived via warp, not via spaceship.
      Scene south-west of spawn: a destroyed warp reactor with
      smoke, ~10 platform wreckage pieces in a wide arc, 3 active
      fires. A big-explosion plays once at scene-spawn time so
      you see the impact bang during the cutscene.
      The reactor remnants are mineable but yield nothing -- you
      can clear the impact site to tidy up. Wreckage pieces are
      mineable with their normal loot.
  Worldgen:
    - Starting resource patches now sit closer to spawn on basic
      templates. Trade-off: smaller biter-free zone, biters spawn
      closer too.
Version: 2.2.0
Date: 28.04.2026
  Worldgen:
    - Jungle planet finally looks like a jungle. Tree clusters are
      now 16x larger and overlap to actually cover the map; the
      previous setup produced thinly scattered patches.
  Cleanup:
    - Removed four library files that hadn't been loaded since
      Factorio 1.x (~700 lines of dead code). No behaviour change.
    - Stripped block-comment dead code carried since pre-2.0.
    - De-duplicated the platform's empty-surface and turret-corner
      helpers (the bodies were byte-for-byte identical).
  Bugfixes:
    - Enemy entities inside platform corner-turret radius are now
      warped along when biter_warping is enabled. A scoping bug had
      been silently dropping them.
  Performance:
    - Heat balancing moved from per-tick to every 6 ticks (0.1s) on
      saves with many warptorio reactors. Power balancing stays
      per-tick because it drains accumulator energy for active
      abilities.
    - Platform tile-laying is faster on retiles (no longer
      allocates a substring per entity check; uses a memoised
      hash table).
  Locale:
    - "Warptorio2" -> "Warptorio 3" in the mod description and
      victory text. The "Warptorio 2.0.0" version reference in the
      description stays (that's the upstream mod version this build
      merges).
  Known limitations:
    - Resource patches can still spawn directly under the platform
      on freshly-warped planets. Three different fix attempts were
      explored during 2.2 development but none of them worked
      against Factorio 2.0's autoplace internals; living with it
      for now.
Version: 2.1.5
Date: 27.04.2026
  Bugfixes:
    - /cheat all no longer destroys warptorio buildings or kills
      the player. Platform tile-laying is back to "clear neutral
      clutter, lay concrete on top" -- player buildings, warptorio
      entities, and resources under the platform are all preserved.
      Biter spawners on the platform are still cleaned up.
Version: 2.1.4
Date: 27.04.2026
  Bugfixes:
    - Heat balancing no longer crashes when heatpipes or reactors
      are destroyed mid-tick.
    - Researching multiple Warptorio platform-size techs at once
      (e.g. via /cheat all) no longer wipes the entire base and
      kills the player. Only newly-added platform area is voided
      now; the previous footprint is left intact.
    - Corner-turret retile only clears the new annulus instead of
      the full disk every research effect.
Version: 2.1.3
Date: 26.04.2026
  Locale:
    - Mod settings menu rewritten for clarity. Every setting now
      has a short action-oriented label and a tooltip with concrete
      defaults and example values. Setting names, types, and
      defaults are unchanged so existing saves keep working.
    - Removed an orphan setting locale entry.
    - German labels and tooltips rewritten to match.
Version: 2.1.2
Date: 26.04.2026
  Bugfixes:
    - Hotfix for 2.1.1: a missing local variable was crashing every
      warp ("value for required field 'name' is missing").
Version: 2.1.1
Date: 26.04.2026
  Bugfixes:
    - Biter spawners no longer end up sitting on the warptorio
      platform after warping to a planet.
  Changes:
    - Platform construction now wipes its area by briefly converting
      it to out-of-map tiles before laying concrete on top. This is
      a clean sweep -- resources, biters, trees, rocks, decoratives
      all gone in one shot. Trade-off: if you research a platform-
      size upgrade while standing on a planet, anything you built
      within the new footprint that didn't fit in the old one will
      be wiped. In practice nobody builds into an area that doesn't
      exist yet, so this is effectively safe.
Version: 2.1.0
Date: 26.04.2026
  Major release rolling up the 2.0.3 - 2.0.28 fixes:
    - Factorio 2.0 compatibility: on_load crashes fixed, miniloader/
      accumulator data crash fixed, dozens of API fixes.
    - World generation: iron / copper / coal / stone / oil / uranium
      worlds finally have water on them. Ocean is finally an ocean.
      Dwarf is a real bounded mini-world with cliffs and dense
      resources.
    - Resource exclusion: when the platform sits on a resource
      patch, that resource isn't lost any more. The cleared zone
      scales with warp count so warp-50 iron won't be eaten by a
      future platform-size upgrade.
    - HUD: warpzone counter refreshes correctly, autowarp countdown
      shows the right time, single-player warp button raises the
      warp_started event, respawn doesn't crash.
    - Variety: same template never lands twice in a row.
    - German translation: full pass against an explicit glossary,
      lore rewritten into natural prose, HUD buttons normalised.
Version: 2.0.28
Date: 26.04.2026
  Changes:
    - Resource exclusion radius around the platform now scales with
      your warp count instead of the current platform-research
      level. Below warp 5, only the current platform area is
      cleared (same as before). From warp 5 to 100 the cleared
      radius grows linearly up to the maximum possible platform
      footprint. So future research-driven platform expansions can
      no longer bury (and lose) resource patches you could already
      see.
Version: 2.0.27
Date: 26.04.2026
  Bugfixes:
    - Resources buried under the warptorio platform are now removed
      when the platform tiles are laid down. Previously a generic
      "clear all entities in this area" call was missing resource
      entities, so as the platform grew with research it would
      silently sit on top of iron / copper / coal patches.
Version: 2.0.26
Date: 26.04.2026
  Changes:
    - Dwarf planet enlarged from 192x192 to 384x384 (12x12 chunks).
      At 192x192, biter nests refused to spawn -- between the
      starting-area exclusion and the placement algorithm's minimum
      chunk requirements there wasn't enough room. 384 keeps the
      planet visibly bounded (you walk across it in under 30
      seconds) but gives biters enough chunks outside the safe zone
      to actually place nests.
Version: 2.0.25
Date: 26.04.2026
  Changes:
    - Removed back-to-back planet category rejection (was added when
      peace and resource planets came out waterless and unusable; no
      longer needed now that water generation is fixed). Same-
      template-twice-in-a-row guard is kept.
Version: 2.0.24
Date: 26.04.2026
  Changes:
    - Dwarf no longer overrides biter strength. Biters are at full
      Nauvis density again -- the small map is the gimmick on its
      own.
Version: 2.0.23
Date: 26.04.2026
  Changes:
    - Dwarf shrunk to its practical minimum: 192x192 (6x6 chunks).
      Resource frequency increased from 0.6 to 1.5 so on a tiny map
      all six resource types reliably appear. Safe-zone radius
      dropped to 0.1 so biters still get spawn room.
Version: 2.0.22
Date: 26.04.2026
  Changes:
    - Dwarf shrunk to 256x256 -- 8 chunks across, 4 from spawn. With
      the platform on its own surface, dwarf becomes more of an
      "extraction outpost": land a few harvesters, grab what you
      can, warp away.
Version: 2.0.21
Date: 26.04.2026
  Changes:
    - Dwarf shrunk further: 1024x1024 (~32 chunks across). The map
      edge is now reachable on foot in a reasonable amount of time.
Version: 2.0.20
Date: 26.04.2026
  Changes:
    - Dwarf redesigned. The previous version was just Nauvis with a
      few stat tweaks; the description "compact, claustrophobic"
      had nothing in the world to back it up. Dwarf now generates
      with a real 2048x2048 bounded surface -- you can see the edge
      of the world in any direction. Inside that small space:
      denser resources, more frequent cliffs, smaller terrain
      features, cramped starting area. Biters are kept at half
      strength because there's nowhere to retreat to.
Version: 2.0.19
Date: 26.04.2026
  Bugfixes:
    - Dwarf no longer comes out 98.8% water. The previous water
      formula forced binary results (all water or all land) for
      every non-default value, which was fine for ocean and barren
      but way too aggressive for "compact world with lakes." Dwarf
      should now be Nauvis-style terrain with slightly more lakes
      than default.
Version: 2.0.18
Date: 26.04.2026
  Bugfixes:
    - Built-in planet templates re-sync on every load now, not just
      when Factorio detects a configuration change. Saves that
      previously migrated under a buggy older version of the
      migration logic would otherwise stay frozen on the same
      template definitions forever.
Version: 2.0.17
Date: 26.04.2026
  Bugfixes:
    - Existing saves now actually receive planet template updates.
      Until now, changes to dwarf, ocean, etc. only applied to
      brand-new games; old saves kept whichever template
      definitions were stored the first time they loaded. Mod-
      version bumps now refresh every built-in template. Third-
      party templates from other mods are left alone.
Version: 2.0.16
Date: 26.04.2026
  Bugfixes:
    - Ocean is finally an ocean. Water amount is now controlled
      through the elevation noise expression (the one Nauvis-style
      tile selection actually reads). Side effect: planets that
      explicitly request a non-default water amount (ocean, barren,
      rogue) get flatter terrain. That's intentional -- water-or-
      not is the gimmick on those, not hills.
Version: 2.0.15
Date: 26.04.2026
  Bugfixes:
    - First attempt at strengthening ocean water generation. Wasn't
      enough on its own -- see 2.0.16 for the actual fix.
Version: 2.0.14
Date: 26.04.2026
  Code quality:
    - Audited every planet modifier for Factorio 2.0 compatibility;
      cliff settings, daytime, and pollute are now hardened against
      malformed input. Day/night convention is documented (0 =
      noon, 0.5 = midnight). No observable change for normal play.
Version: 2.0.13
Date: 26.04.2026
  Bugfixes:
    - Ocean now writes the water_level expression Factorio 2.0
      actually consumes (the legacy "water" field was silently
      ignored on surface creation).
    - Dwarf finally feels compact: smaller terrain features,
      cramped starting area, lots of small lakes. Previously it was
      just Nauvis with weaker biters.
Version: 2.0.12
Date: 26.04.2026
  Bugfixes:
    - Fixed a crash on player respawn (and a few other call sites)
      that reported "bool expected, got number". A few legacy calls
      passed the number 1 where Factorio 2.0 strictly wants `true`.
Version: 2.0.11
Date: 26.04.2026
  Bugfixes:
    - More world-generation fixes. Several map settings need string
      values where the old code wrote numbers (which 2.0 silently
      drops). Affected: starting_area, terrain_segmentation,
      jungle's moisture/temperature/aux. Those modifiers now
      actually take effect.
Version: 2.0.10
Date: 26.04.2026
  Bugfixes:
    - The real fix for "iron worlds (and others) had no water." The
      internal cache used to look up tile/entity/decorative names
      was reading from the wrong tables (runtime settings instead
      of prototypes) and silently coming up empty -- so the nauvis
      modifier dropped water, grass, dirt, and several other tiles
      from generated planets. Cache now reads from the canonical
      2.0 prototype tables.
    - Existing saves with broken caches will rebuild themselves on
      first load after this update.
Version: 2.0.9
Date: 26.04.2026
  Bugfixes:
    - Ocean had 0 water. The template was asking for water=100000
      and Factorio 2.0 silently clamped that to 0. Lowered to value
      6 (very-high). (Note: this was an early attempt -- full ocean
      fix landed in 2.0.10/2.0.13/2.0.16.)
Version: 2.0.8
Date: 26.04.2026
  Changes:
    - More variety on consecutive warps. Two new planet-roll flags:
        * "peace" prevents two calm worlds (uncharted, average,
          barren, ocean, dwarf) back-to-back, so combat is regular
          between them.
        * "resource" prevents two resource-rich worlds (rich, iron,
          copper, coal, stone, oil, uranium) back-to-back.
Version: 2.0.7
Date: 26.04.2026
  Code quality:
    - Removed a large amount of dead commented-out code left over
      from Factorio 1.x. No behaviour change.
Version: 2.0.6
Date: 26.04.2026
  Locale:
    - Full German translation pass: HUD buttons, mod-setting
      descriptions, planet names and descriptions, and the in-game
      lore rewritten into natural German with consistent
      terminology (Loader -> Lader, Beacon -> Modulträger, Etage/
      Deck -> Ebene, Taschendimension -> Erweiterter Stauraum).
Version: 2.0.5
Date: 25.04.2026
  Bugfixes:
    - Initialisation typo that left the warp-time-left value
      uninitialised.
    - Inverted votewarp validation that wiped valid players' votes
      on init.
    - Single-player warp button now fires the warp_started custom
      event, so other mods listening for it actually receive it.
    - Auto-warp countdown displays the correct time right after a
      warp, instead of an absolute tick value for ~1 second.
Version: 2.0.4
Date: 25.04.2026
  Bugfixes:
    - Warpzone HUD counter no longer goes stale; it refreshes every
      tick.
  Changes:
    - Two consecutive warps will no longer pick the same planet
      template.
Version: 2.0.3
Date: 23.04.2026
  Bugfixes:
    - on_load no longer crashes ("attempt to index global 'game'").
      The planet engine was doing too much work during on_load;
      storage writes, events, and game access are now restricted
      to on_init and on_configuration_changed, as Factorio
      requires.
    - Data-stage crash when loaded alongside mods like miniloader
      that modify accumulator circuit connectors.
  Changes:
    - Internal mod id renamed to `warptorio3_2` to match info.json.
      Requires a new game.
Version: 2.0.0
Date: 09.05.2025
  Major changes:
    - Updated to Factorio 2.0 (thanks to Shadow_Man).
    - Space Age is not supported. Elevated Rails and Quality are
      supported.
    - New game recommended. No migration support for previous
      savegames.
  Changes:
    - Added custom Warptorio2 intro text and victory screen.
    - Some technologies' research costs adjusted to better match
      similar vanilla techs.
    - Some recipes with non-stacking ingredients now require only 1
      of those ingredients.
Version: 1.3.11
Date: 18.2.2024
  Changes:
    - Added a mod setting to disable stair sprites.
    - Changed default provider chest to passive provider by popular demand
    - Slightly increased the chance for loot chests to spawn and added a setting for it
    - Changed warp reactor specific heat from 10MJ to 1MJ to address heat distribution issues
    - Updated heat related code to better respect specific heats (Thanks chingis_khagan!)
Version: 1.3.10
Date: 8.5.2023
  Changes:
    - Fixed crash when setting warp target to homeworld or nauvis.
    - Fixed the Charting ability where the button wasnt adding to the hud and wasnt spawning invisible radars on the factory and boiler floors when the research finishes.
    - Fixed two Typ"};o's in the Warptorio Lore messages (Thanks Honktown!)
    - Fixed Warp Armor and Warp Accumulator tech icons (Thanks Knofbath!)
    - Removed incompatibility flag with Rampant because Rampant now has multi-surface compatibility.
    - Removed placeable-by on warp pipes to prevent accidental placement of them.
    - Buffed Warponium Fuel Cells, they are now more accurately 4x more powerful than a typical uranium fuel cell as originally intended (Thanks Knofbath!)
    - Buffed Stabilizer ability and rephrased its description for clarity
    - Updated to Factorio 1.1.80
Version: 1.3.9
Date: 5.7.2022
  Changes:
    - Fixed a bug with warp pre-charge speed upgrades where upgrading made pre-charging slower
    - Fixed the harvester loaders bug + migration with help from community (Thank you!)
Version: 1.3.8
Date: 8.4.2022
  Changes:
    - Typo
Version: 1.3.7
Date: 7.4.2022
  Changes:
    - Lib bugfix related to cloning spider legs
Version: 1.3.6
Date: 7.3.2022
  Changes:
    - Fixed green wire circuits not connecting between stairs + migration
    - Fixed void tiles not being placed if the platform warps away without you
    - Added fix for crashes related to warp loaders & filters with help from community (Thank you!)
    - Teleporter gate now has flying text when logistics cannot be placed instead of a global message.
Version: 1.3.5
Date: 13.3.2021
  Changes:
    - Fixed multiplayer crash, missing nil check on updating ownership and connection of cloned spidertrons to the remotes in players inventories between warps.
Version: 1.3.4
Date: 30.12.2020
  Changes:
    - Factorio 1.1.6
Version: 1.3.3
Date: 3.12.2020
  Changes:
    - Factorio 1.1
Version: 1.3.2
Date: 4.11.2020
  Changes:
    - Spidertron can now travel through stairs (cloning method)
    - Fixed decoupling of spidertron remotes when warping/cloning
    - You now remain in your spidertron when warping.
Version: 1.3.1
Date: 25.8.2020
  Changes:
    - Basic fixes for warp loaders
    - Fixed spidertron being lost between warps
    - Fixed a crash when using steel loader chests
Version: 1.3.0
Date: 8.8.2020
  Changes:
    - Fixed rails not being affected by logistics upgrades
    - Made hazard tiles accurate and fixed hazard clearing crash
    - typo causing crash on warp
Version: 1.2.9
Date: 2.8.2020
  Changes:
    - Fixed invisible radars & homeworld/platform teleport capsules
    - e (typo)
    - v (typo)
    - Buffed stabilizer to 5% of regular platform pollution
    - Fixed ability drain % texts and added setting
    - Turned on warp blacklists for harvesters (fixes some mod compatabilities)
    - Factorio 0.18.40
Version: 1.2.8
Date: 12.5.2020
  Changes:
    - Fixed a few bugs
Version: 1.2.7
Date: 7.5.2020
  Changes:
    - Warptorio Expansion Update
    - Large changes to remote interfaces
    - Moved planet rng settings to planetorio
    - Fixed changing loader directions mid-game (top/bottom halves)
    - Fixed a bunch of harvester bugs
Version: 1.2.6
Date: 13.4.2020
  Changes:
    - Factorio 0.18
    - Added /kill command to suicide (if you get stuck on ocean planet)
    - Added biter warping difficulty setting
    - Added Nauvis to warp target list
    - Added warp pipes to the Harvesters
    - Full rework of platform tileing/upgrading system enabling the creation of multiple platform layouts.
    - Full rework of planets system, exported to standalone library mod Planetorio enabling other mod makers to create new planets and use the planets/surfaces system for their own mods.
    - Reworked Abilities: All abilities now use platform electricity (kept in the stairs) to function. Abilities are toggleable and drain energy over time. The amount drained is the same for all abilities, and it increases the longer abilities remain active. The amount of energy drained, and energy drain growth is applied for all abilities active at once (1x for 1 ability active, 3x for 3 abilities active). Drain amounts are based on a % of the total electrical storage capacity.
    - Added a Platform Energy bar to the HUD showing electricity balance to help with using the new ability mechanics.
    - Reworked Stabilizer Ability: Platform pollution, and pollution growth reduced to 25% while active.
    - Reworked Radar Ability: Scans an outer ring every few seconds while active (takes longer each successive scan)
    - Fixed a bug with warpchance setting not applying to homeworld rolls
    - Fixed a bug with pollution not being removed from harvester floor
    - Broke warp loaders
    - Broke the Accelerator ability (it does nothing for now)
    - Broke the warptorio remote interface (affects cross mod compatabilities)
    - Broke functionality related to changing loader directions (top/bottom halves) upon the settings being changed mid-game
    - Broke "unstuck" on platform entities, e.g. you can become trapped in teleporters as you unlock them.
    - Broke hazard tile accuracy
    - Probably broke more things.
Version: 1.2.5
Date: 13.11.2019
  Changes:
    - Harvester deploy typo x2 (?)
    - Harvesters now ignore planet-side logistics/construction robots when deployed
Version: 1.2.4
Date: 13.11.2019
  Changes:
    - Fixed a divide by zero error
    - Harvester deploy typo (?)
Version: 1.2.3
Date: 13.11.2019
  Changes:
    - Made "invisible" radars unminable
    - Removed warpstation, warppipe and harvesters from circuit signals menu
    - Added blacklists to harvesters
    - Vehicles are now teleported between surfaces instead of cloned (AAI vehicles compatability). Not yet added to harvesters.
    - Players are no longer teleported through platform teleporters if they are in a vehicle.
    - Optimized teleporter code to save frames
    - 10,000 Downloads Special: Compatibility with NewGamePlus courtesy of Bilka <3
Version: 1.2.2
Date: 31.10.2019
  Changes:
    - Added ability_used and ticktime to remote events
    - Added remote functions to recall the harvesters and teleporter gate
    - Added robots outside of platform carry between warps difficulty setting (disabled by default).
    - Fix for harvesters being permanently lost
    - Added Home Portal item that teleports you to homeworld
    - Buffed warp module productivity bonus for consistency
    - Added new remotes for mod managed tables
    - Warp pipes are now automatically emptied if neither side is connected to another pipe
    - Added sprite overlays to stairs to reduce confusion on where it will send you (alt-mode only)
Version: 1.2.1
Date: 10.10.2019
  Changes:
    - Harvesters now prevent players getting stuck when being deployed.
    - Another loot chest typo
Version: 1.2.0
Date: 10.10.2019
  Changes:
    - Typos with loot chests
    - Fixed harvesters "moving" players when recalled on warp
    - Attempted fixes of harvester deploy bug
Version: 1.1.9
Date: 10.10.2019
  Changes:
    - Fixed votewarp bug
    - Updated logistics research descriptions
    - Fixed warp pipe temperature bug
    - Added SpawnLootChest to remote interface
    - Added setting to turn on/off loot chests
    - Fixed a crash related to clearing mod composite entities (eg. mini-loaders)
    - Added some missing modifiers to the reach distance research
    - Added Warp Striders research
    - Made a few early researches require the reactor reassembly project
    - Made a few other small research tweaks
    - Added steel chest to Requester chest type settings
Version: 1.1.8
Date: 2.10.2019
  Changes:
    - Attempted fixes of sound stacking problem
    - Fixed platform turret warping alignment x2
Version: 1.1.7
Date: 30.09.2019
  Changes:
    - Reduced cost of Warponium Fuel Cells
    - Fixed teleporter sounds
    - Fixed warp beacon (?)
    - Changed warp pipe pipette
    - Fixed player leave/join affecting votewarp
    - Increased default votewarp fraction to 0.51 and now rounds up. (2 players in MP requires both players to vote before warping)
    - Fixed platform turret warping alignment issue
    - Fixed factory floor early research tile alignment issue
Version: 1.1.6
Date: 30.09.2019
  Changes:
    - Fixed nauvis map gen settings not applying to uncharted planets and added copy_nauvis planet modifier.
    - Fixed hazard tile indicator accuracy for stairs
    - Fixed a bug with harvester recall and overlapping belts/entities being destroyed
Version: 1.1.5
Date: 30.09.2019
  Changes:
    - Made rotation checks more efficient
    - Fixed Warp Rail logistics not being removed from blueprints.
    - Fixed blueprints created from hotbar not being affected by blueprint checks.
    - Mod Compatability attempted AAI Vehicles fixes
    - Added toolbar and relating research for easy harvester and mobile gate pickup by popular demand
Version: 1.1.4
Date: 29.09.2019
  Changes:
    - Added "P" Planet Clock timer to Warp Combinator
    - Added separate setting to disable biter waves (previously disabled under base expansion rate tickbox)
    - Fix for harvester migration issue x3
Version: 1.1.3
Date: 29.09.2019
  Changes:
    - Fixed red X's in power statistics
    - Made factory beacon research a bit more expensive
    - Nerfed platform solar power by popular demand and added a difficulty setting
    - Fix for harvester migration issue x2
Version: 1.1.2
Date: 29.09.2019
  Changes:
    - Fixed bug with abilities not resetting on warp
    - Attempted more fixes of multiplayer votewarp
    - Added some locale to Warp Reactor research level 6 and 8
    - Fixed planet target dropdown unlocking early.
    - Fix of harvester loaders migration issue
    - Picking up harvesters now prevents inventory duplicates
    - Tweaked sorting of harvester items and research (left is now on the left)
Version: 1.1.1
Date: 29.09.2019
  Changes:
    - Migration error x2
Version: 1.1.0
Date: 28.09.2019
  Changes:
    - Migration error
Version: 1.0.9
Date: 28.09.2019
  Changes:
    - Attempted fix of loader and boiler floor access migration issues
Version: 1.0.8
Date: 27.09.2019
  Changes:
    - Cleaned entity spam from circuit signals menu
    - Mod compatability with Spell Pack
    - Fixed Warp Loaders (old saves may need to rotate them to refresh/update)
Version: 1.0.7
Date: 26.09.2019
  Changes:
    - Planet API bugfix
    - Removed some debug code
    - Fixed migration power bug
    - Fixed Warp Combinator alignments and bug with offset setting not applying
    - Fixed Harvester alignment bug + tile migration
    - Fixed bug with Harvester Combinators not moving for size upgrades
Version: 1.0.6
Date: 25.09.2019
  Changes:
    - Removed unused hazard tiles
    - Moved Harvester Floor between boiler and factory, and adjusted research to match.
    - Fixed Warp Accumulator recipe and item
    - Fixed "Invisible" Radar being hidden by factory beacon/boiler substation upgrades
    - Fixed minor factory floor misalignments + tile migration
Version: 1.0.5
Date: 22.09.2019
  Changes:
    - Fixed crash related to new blueprints thing
    - Added Warp Combinators and related research
    - Added Harvester Combinators and related research
    - Fixed factory giga floors alignments + tile migration
Version: 1.0.4
Date: 22.09.2019
  Changes:
    - Fixed bug with teleporter gate not receiving power upgrades if logistics is blocked when it's placed
    - Planet teleporter gate must now be rebuilt for logistics and loader upgrades to apply (prevents problems related to clearing space)
    - Added fix for loader filters being lost between logistics and loader upgrades
    - Fixed bug with players being moved between warps
    - Fixed clearing bug with platform turrets
    - Platform Structures are now removed from blueprints. This is potentially conflicting so there is a setting to disable this.
    - New warptorio event handling. See remote.get_events() and remote.get_event(name).
Version: 1.0.3
Date: 21.09.2019
  Changes:
    - Added a bunch of remote api events for future implementation and slightly adjusted naming of existing ones.
    - Fixed harvester logistics research crash
    - Fixed boiler floor, water and giga alignment issues + tile migration.
    - Mod Compatability bugfix for ModMash
    - Fixed tile migrations clearing harvesters
Version: 1.0.2
Date: 18.09.2019
  Changes:
    - Fixed west harvester bugs
    - Fixed east harvester loaders research bug
    - Fixed boiler giga floor bridge alignment bugs
    - Fixed bug with level 0 (entry) platform turret research not placing tiles on planet
    - Fixed bug with harvester logistics not clearing space for loaders correctly
    - Fixed boiler water alignment bugs
    - Added tile migration. Saves may take a while to load.
Version: 1.0.1
Date: 17.09.2019
  Changes:
    - Fixed beacon issues
    - Fixed carebear chest
    - Attempted fix of logistics research occasional crash
    - New thumbnail.png
Version: 1.0.0
Date: 15.09.2019
  Changes:
    - Fixed clearing alignment bug of platform circles
    - Added migration to recall harvesters aiming to fix loader and alignment issues
Version: 0.9.9
Date: 15.09.2019
  Changes:
    - Fixed issue with reactor upgrade destroying teleporter
    - Fixed bug with planet teleporter gate not using energy upgrades
Version: 0.9.8
Date: 15.09.2019
  Changes:
    - Fixed sizing bug for platform circles
Version: 0.9.7
Date: 15.09.2019
  Changes:
    - Fixed typos with carebear chest
    - Adjusted size of harvester platform borders
    - Added (up to) 3 loaders to the harvester platforms which are always connected to harvester floor.
    - Harvesters are now recalled when the interior portal is mined (if deployed)
Version: 0.9.6
Date: 13.09.2019
  Changes:
    - Fixed harvester pickup portal bug
    - More typos
Version: 0.9.5
Date: 12.09.2019
  Changes:
    - More typos
    - Attempted fix of harvester recall crash
Version: 0.9.4
Date: 12.09.2019
  Changes:
    - Fixed typos with pipe logistics and warpout
Version: 0.9.3
Date: 12.09.2019
  Changes:
    - More typos
Version: 0.9.2
Date: 11.09.2019
  Changes:
    - Fix for pipe logistics issue
    - More typo fixes
Version: 0.9.1
Date: 11.09.2019
  Changes:
    - (Hopefully) fixed a crash relating to fluids
    - Added fix for migration bug relating to power between floors
Version: 0.9.0
Date: 11.09.2019
  Changes:
    - Harvester Platforms now spawn on top of resources instead of transferring them to the harvester floor
    - Harvester Platforms will now recall players on them if they're deployed when warping.
Version: 0.8.9
Date: 11.09.2019
  Changes:
    - Fixed typos breaking planet packs and alien biomes.
    - Fixed typo with boiler research
    - Fixed typo with autowarp timer
    - Added a bunch of various functions to the remote interface.
    - Attempted fixes to votewarp for multiplayer (untested)
    - Fixed homeworld button
Version: 0.8.8
Date: 10.09.2019
  Changes:
    - Massive re-write and code cleanup
    - Fixed bugs related to multiple planets (eg. homeworld plus platform) with special chunk generation functions interfering with eachother, particularly for multiplayer.
    - Tri-loader now adds an extra belt pair to ALL stairs, making the central stairs have 6 belts instead of 4.
    - New Harvester Floor below the boiler and a new relating gameplay mechanic.
    - Made a bunch of things use locale for translation later
    - Fixed the teleporter logistics blocked message on warp
    - Moved first boiler room water research to blue science
    - Fixed water placement bugs
    - Made platform "turrets" research a bit cheaper, and moved the first level to green science.
    - Broke Warp Loaders
    - Slightly adjusted alignment of warp rails
    - Made warp charge timer (entity counter thing) ignore surface/planet entities
Version: 0.8.7
Date: 26.08.2019
  Changes:
    - Added sound to warp button and a message for multiplayer
    - Fixed a bug with planet selector
Version: 0.8.6
Date: 24.08.2019
  Changes:
    - More pollution nerfs
    - Added pollution exponent multiplier setting
    - Added pollution tick rate setting
Version: 0.8.5
Date: 22.08.2019
  Changes:
    - Teleporter hitbox adjustments
Version: 0.8.4
Date: 22.08.2019
  Changes:
    - Mod Compatability: Von Neumann Mod. Please use v0.0.3 that i have posted if you wish to play that mod with this one: https://github.com/abaines/Von-Neumann/issues/1
Version: 0.8.3
Date: 22.08.2019
  Changes:
    - Leftover test code
Version: 0.8.2
Date: 22.08.2019
  Changes:
    - Full mod compatability: Force Fields 2 - https://mods.factorio.com/mod/ForceFields2
Version: 0.8.1
Date: 22.08.2019
  Changes:
    - Fixed a bug with the Stone planet
    - Review for multiplayer planet selection drop-down bug
    - Mod Compatability: Added remote interface for other mods to prevent certain entities from being cloned by name
Version: 0.8.0
Date: 21.08.2019
  Changes:
    - Fixed a bug with circuits and loader chests
Version: 0.7.9
Date: 21.08.2019
  Changes:
    - New Planet: Smog Planet
    - New Planet: Mirror Planet
Version: 0.7.8
Date: 21.08.2019
  Changes:
    - Mod Compatability: Alien Biomes - bug fixing
    - More pollution nerfs (reset settings in existing saves)
Version: 0.7.7
Date: 20.08.2019
  Changes:
    - Nerfed Pollution Factor
    - Fixed a bug with autowarp on/off
    - New Planet Expansion Pack: DangOreus Planet
Version: 0.7.6
Date: 19.08.2019
  Changes:
    - Waterless, Biter, and "Rest" Planets can no longer occur twice in a row respectively.
    - Moved the first teleporter research into it's own research
    - Mod Compatability: Big Brother radars
    - Mod Compatability: Alien Biomes - Fixed a bug with water not spawning on planets
    - Mod Compatability: Alien Biomes - Fixed a multiplayer desync issue
Version: 0.7.5
Date: 17.08.2019
  Changes:
    - Fixed a bug with the warp target dropdown in multiplayer
Version: 0.7.4
Date: 17.08.2019
  Changes:
    - Added more mod remote commands
    - Added tile overrides to disable certain tiles unless otherwise enabled.
Version: 0.7.3
Date: 17.08.2019
  Changes:
    - migration issues
Version: 0.7.2
Date: 17.08.2019
  Changes:
    - More bug fix
Version: 0.7.1
Date: 17.08.2019
  Changes:
    - Progress on mod compatability Alien Biomes
Version: 0.7.0
Date: 17.08.2019
  Changes:
    - Fixed gui not updating on autowarp settings changes
    - Added a fix to make spawn area resources spawn further away from the platform as it gets bigger (this apparently did nothing)
Version: 0.6.9
Date: 17.08.2019
  Changes:
    - Mod setting for %chance of landing on selected planet
    - Added Warp Portal item
Version: 0.6.8
Date: 17.08.2019
  Changes:
    - Fixed a bug with the warp charge timer
    - Fixed a bug with the planets gui dropdown
    - Fixed missing ocean planet description
    - Planets API tweaks
    - Fixed player corpse between warps
Version: 0.6.7
Date: 15.08.2019
  Changes:
    - Added fix for dropped items being lost on warp
    - More 0.6.5 typos
Version: 0.6.6
Date: 15.08.2019
  Changes:
    - Added missing multiplier for original map settings starting_area and water
    - 0.6.5 typo
Version: 0.6.5
Date: 15.08.2019
  Changes:
    - Fixed a big with picking up warp heatpipes
    - Fixed a bug with the early boiler room water setting not working when starting a new map with it enabled (migration for this is done too)
    - Added checks to ensure resource specific planets are not spawned if a mod is added that removes base game resources.
    - Fixed a bug with modded ores not appearing on any planets
    - Fixed interactions with Factorissimo2
    - More progress on Alien Biomes compatability (trees and such should spawn now). It should only spawn nauvis-like planets currently.
Version: 0.6.4
Date: 12.08.2019
  Changes:
    - Fixed typos in 0.6.3
Version: 0.6.3
Date: 12.08.2019
  Changes:
    - Temporarily disabled loader mod detection
    - Re-wrote the planet generator with improved mod compatability and improved api
    - Tweaked a bunch of planet generation settings
    - Added Uncharted planet
Version: 0.6.2
Date: 12.08.2019
  Changes:
    - Added mod compatability: Mods that introduce new/faster loaders will replace the existing platform loaders at logistics level 4. Exception: miniloaders
    - Prep for mod compatible planet generator update
Version: 0.6.1
Date: 11.08.2019
  Changes:
    - Fixed a crash related to Alien Biomes
Version: 0.6.0
Date: 10.08.2019
  Changes:
    - Bug Fix
    - More progress on mod compatability: Alien Biomes
Version: 0.5.9
Date: 10.08.2019
  Changes:
    - Completed Mod Extendable Planets.
    - Official Warptorio2 Planet Pack: https://mods.factorio.com/mod/warptorio_planet_pack
    - Progress on mod compatability: Alien Biomes.
    - Progress on mod compatability for modded ores
Version: 0.5.8
Date: 10.08.2019
  Changes:
    - Added Biter Waves, ensuring biter attacks always happen
    - Added Biter Wave difficulty settings
    - Added a tiny bit of pollution to everything (such as chests, inserters)
Version: 0.5.7
Date: 10.08.2019
  Changes:
    - Adjusted spawn settings of the Barren planet
    - Added Rogue planet
Version: 0.5.6
Date: 10.08.2019
  Changes:
    - Added votewarp multiplier mod setting
Version: 0.5.5
Date: 10.08.2019
  Changes:
    - Added nauvis_override to the modded planet api
    - Added votewarp for multiplayer (untested)
    - Reversed direction of logistics on north half of platform.
    - Added mod settings allowing you to set the direction of platform logistics (north and south halves)
Version: 0.5.4
Date: 10.08.2019
  Changes:
    - Full factorissimo mod support
    - Fixed a bug with the southeast and southwest warp rails
    - Fixed a bug with corner stairs not benefiting from stairs energy research
    - Known Issue: Multiplayer Desync related to cloning accumulators. This is a factorio bug: https://forums.factorio.com/viewtopic.php?f=7&t=74363
Version: 0.5.3
Date: 09.08.2019
  Changes:
    - Minor bug fixing
Version: 0.5.2
Date: 09.08.2019
  Changes:
    - Minor bug fix
Version: 0.5.1
Date: 09.08.2019
  Changes:
    - Minor bug fix
Version: 0.5.0
Date: 09.08.2019
  Changes:
    - Added expert difficulty mod setting: autowarp is always on
    - Added more mod settings for pollution factor and biter expansion rates
    - Small nerf to biter expansion rates
    - Added auto warp time mod setting
Version: 0.4.9
Date: 09.08.2019
  Changes:
    - More work on remote interface for other mods to expand the warptorio planets table. Please refer to FAQ.
Version: 0.4.8
Date: 09.08.2019
  Changes:
    - Mod compatability with Dirt Path
    - Added remote interface for other mods to expand the warptorio planets table
Version: 0.4.7
Date: 09.08.2019
  Changes:
    - Added mod settings weighted planet probability of occurrence
    - Fixed a crash related to loot chests
Version: 0.4.6
Date: 09.08.2019
  Changes:
    - Added carebear difficulty mod setting: Early boiler room water
Version: 0.4.5
Date: 08.08.2019
  Changes:
    - Added carebear difficulty mod setting: spawns a loot chest of items you'll need to get you through the first few planets alive for those that need help.
    - Reduced base autowarp timer to 20 mins to better match biter evolution in the early game.
Version: 0.4.4
Date: 08.08.2019
  Changes:
    - General code cleanup and organising
    - Added mod setting to turn off autowarp earlier than reactor level 6.
    - Added mod settings to change warp charge time calculations and ability cooldowns.
Version: 0.4.3
Date: 06.08.2019
  Changes:
    - Fixed mp issue
    - Added more provider chest options
Version: 0.4.2
Date: 06.08.2019
  Changes:
    - Miniaturized the "invisible" radar.
    - Added mod settings allowing selection of requester/provider chests used with teleporter and stairs loaders.
Version: 0.4.1
Date: 06.08.2019
  Changes:
    - Fixed a bug with warp rail loaders and chests not switching direction
Version: 0.4.0
Date: 06.08.2019
  Changes:
    - Reduced warp charge time growth
    - Fixed a bunch of sizing and alignment issues
    - Big code cleanup intended for improved mod compatability, performance and reliability.
    - Reactor research tweaks
    - Invisible radar to factory and boiler floors (requires charting).
    - Fixed a multiplayer crash
Version: 0.3.9
Date: 06.08.2019
  Changes:
    - Fixed missing beacon levels
    - Fixed some lag issues when staying on a planet for too long
Version: 0.3.8
Date: 05.08.2019
  Changes:
    - Added crash protection for mods that remove base game resources
Version: 0.3.7
Date: 04.08.2019
  Changes:
    - Fixed a bug with reactor removing itself between warps
    - Fixed factory beacon placement issues
    - Added changelog formatting for in-game viewing
Version: 0.3.6
Date: 04.08.2019
  Changes:
    - Slightly reduced final platform size upgrade
Version: 0.3.5
Date: 04.08.2019
  Changes:
    - More research tweaks
    - Fixed a crash caused by even distribution mod
Version: 0.3.4
Date: 2019.08.03
  Changes:
    - Added homeworld
    - Tweaked beacon research
Version: 0.3.3
Date: 03.08.2019
  Changes:
    - Pumps are now correctly removed from platform between warps
    - Removed additional stairs belts, max is now 4.
    - New space science: Warp Loaders.
Version: 0.3.2
Date: 03.08.2019
  Changes:
    - Fixed bug with giga boiler floors unlocking early
    - Reduced cost of research
Version: 0.3.1
Date: 01.08.2019
  Changes:
    - Added caching for warp accumulators and heatpipes to save frames
    - Added missing purple science packs to logistics research
    - Fixed sizing and alignment of boiler giga floors
Version: 0.3.0
Date: 01.08.2019
  Changes:
    - Tweaked occurrence rate and zones of planets
    - More pollution tweaks
    - Tweaked axe speed, physical damage and warp beacon research
    - Fixed random deaths when warping while you're standing on the edge of the platform
    - Planets will now correctly copy settings from original map generation.
Version: 0.2.9
Date: 31.07.2019
  Changes:
    - Added Warp Accumulators
    - Further tweaks to pollution settings
    - Added alarm to auto-warp
    - fixed logistics bots between warps
Version: 0.2.8
Date: 30.07.2019
  Changes:
    - Added some vanilla bullet damage upgrades
    - Tweaked initial and stabilizer pollution settings
Version: 0.2.7
Date: 29.07.2019
  Changes:
    - Tweaked the Polluted planet
    - Added Dwarf Planet
    - Changed some planet descriptions
    - Fixed a bug with logistics chests not functioning correctly between floors
Version: 0.2.6
Date: 29.07.2019
  Changes:
    - Reduced warp multipliers for end game planets
    - Tweaked resource spawning on specialized planets and disabled spawn area resource removal
Version: 0.2.5
Date: 27.07.2019
  Changes:
    - Fixed a bug with placing the teleporter gate causes the platform teleporter chests to empty
    - Slightly reduced warp robot speed bonus
    - Fixed a bug with dual loader research not applying to boiler floor
Version: 0.2.4
Date: 27.07.2019
  Changes:
    - Fixed a bug with upgrading energy causing loss of logistics in boiler room.
    - Made early game research slightly more expensive
Version: 0.2.3
Date: 27.07.2019
  Changes:
    - Mic Drop
Version: 0.2.2
Date: 27.07.2019
  Changes:
    - Major Branch split from warptorio_0.2.1. Credit to Nonoce https://mods.factorio.com/mod/warptorio
    - Updated everything
    - Fixed everything
    - Finished everything
    - Polished everything