Card Tech Draft (卡牌科技抽卡原型)


An experimental prototype that replaces the linear tech tree with a mining-triggered card draft: weighted odds and pity protection decide which technologies you're allowed to research next, while drill heat builds up alongside it and throttles how efficiently that mining converts into progress — deliberately paired with the draft, not meant to be balanced or modded separately. Tuned against Space Age progression; no full gameplay validation performed for either configuration.

Tweaks
a month ago
2.0
47

Changelog

Version: 0.2.27
Date: 2026-08-22
  IMPORTANT:
    - The "Spell Card Reissue" setting for established/old players has
      also been reversed and renamed to "Block Old Fairy (experimental)",
      to match the "New Fairy" fix below and use the same opt-in-to-block
      pattern. Its old key (card-tech-draft-late-join-deal-enabled) let
      established players get their hand reissued on reconnect only when
      a server owner opted in; the new key
      (card-tech-draft-late-join-deal-block-old-players) flips this:
      default off means established players are reissued a hand
      immediately on reconnect; turning it on is the opt-in action, for
      owners who specifically want returning players to wait for the
      next round instead.
    - The "New Fairy (experimental)" setting has been reversed and renamed
      to "Block New Fairy (experimental)". Its old key
      (card-tech-draft-late-join-deal-include-new-players) let brand-new
      players draft mid-round only when a server owner opted in; that
      turned out to be an unfriendly default for the vast majority of
      server owners who never touch this setting, since it silently
      blocked every new joiner by default. The new key
      (card-tech-draft-late-join-deal-block-new-players) flips this:
      default off means new players are dealt in immediately, same as
      always-known players; turning it on is now the opt-in action, for
      owners who specifically want to keep newcomers out of the current
      round.
    - Both settings work the same way now: opt-in to block, for a single
      round's worth of card-pack access -- not a persistent restriction.
      A blocked player still gets their pack normally starting the very
      next round; the setting only delays that one initial "you get to
      draft this round" moment, giving new or returning players a chance
      to get their bearings before facing an irreversible tech-card
      choice. It isn't a tool for gatekeeping who gets to play the mod.
    - This is a real, intentional default-behavior change for every
      existing save -- regardless of what either old setting was
      previously set to, both old and new players are no longer blocked
      by default unless the corresponding new setting is explicitly
      turned on. Both old settings have been removed; any values they
      held are simply unused going forward.
    - Turning either "Block Old Fairy" or "Block New Fairy" off (from on)
      now immediately grants a hand to any already-connected player who
      was being held back by it, instead of making them wait to
      reconnect again. Turning either one on does not retroactively take
      back any hand already dealt.
    - "Block Old Fairy" now targets anyone who has connected before, not
      just players who've actually drafted a card -- it's meant as a
      lighthearted switch for messing with friends on your server, not a
      strict newcomer check. A player only counts as an "Old Fairy" from
      their second connection onward; their very first-ever connection
      is still governed by "Block New Fairy".
    - Fixed a real bug: "Block Old Fairy" and "Block New Fairy" only
      affected players reconnecting mid-round; a player who stayed
      connected and simply waited for the next round to deal naturally
      was never blocked, since the normal per-round dealing loop never
      checked either setting. Both settings now apply consistently
      whether a blocked player is already online when a new round starts
      or reconnects mid-round -- as long as the setting stays on, they
      won't get dealt in either way.
    - "Block Old Fairy" and "Block New Fairy" now take effect
      immediately the moment you turn them on, even for a player who
      already has this round's pack or eligibility -- their access to
      the current round is revoked on the spot (with a heads-up message)
      instead of only affecting future rounds or reconnects. Turning
      either one off immediately restores access the same way.
    - Fixed another gap in the same area: if either setting was already
      on *before* upgrading the mod (or before a save was reloaded), the
      revoke described above never ran, since it only fires in response
      to the setting actually changing value. Loading a save (or
      upgrading the mod) now re-applies both settings immediately,
      including to players who happen to be offline at that moment.
    - Fixed a third gap: a blocked player who already had a leftover
      pack or eligibility from before they were blocked (e.g. they went
      offline holding a legitimately-dealt pack, and the host blocked
      them while they were away) would still briefly see that old pack
      the moment they reconnected, before anything caught up with them.
      Reconnecting now clears any such leftover access immediately, and
      the on-screen HUD is only built after that check runs, so a
      blocked player never sees so much as a flash of a pack they
      shouldn't have.
    - Added a final safety net: opening, selecting, or confirming a pack
      now always re-checks "Block Old Fairy" / "Block New Fairy" at the
      moment of the action itself, regardless of how any underlying
      pack data got there. This closes the loop against any
      not-yet-discovered path that might otherwise let a blocked player
      slip through -- being blocked now means blocked everywhere,
      checked at the single point every part of the mod already reads
      pack data from.
  Bugfixes:
    - N/A (this is a design correction, not a code defect -- see IMPORTANT
      above; the old defaults were working exactly as coded, just in the
      wrong direction).
Version: 0.2.26
Date: 2026-08-21
  Features:
    - New experimental setting "Frog Points spread to whole factory"
      (off by default). When enabled, every producing building (not
      just mining drills) contributes Frog Points and heat, and --
      if the optional "thermal-debt" mod is also installed -- its
      heatsinks work alongside the built-in Waste Heat Exchanger
      (not instead of it) to dissipate that heat, with quality and
      building-adjacency both increasing the effect.
    - Waste Heat Exchanger and thermal-debt's heatsinks now boost each
      other when placed adjacent to each other (previously only
      same-type adjacency counted), so mixed layouts of both building
      types are rewarded, not just clusters of one or the other.
    - Waste Heat Exchanger now cools itself down gradually over time
      even when this setting is off, and never takes damage or is
      destroyed from overheating.
    - Waste Heat Boiler gains a quality-scaled bonus to its steam
      output when the whole-factory setting above is active.
  Changes:
    - Waste Heat Exchanger and Waste Heat Boiler max health raised
      (200 -> 600 and 200 -> 300) and their crafting costs reduced.
    - Various balance numbers for the new whole-factory heat/dissipation
      system were tuned based on testing (decay rates, generation
      rates, fluid conversion ratios); see notes/design_notes_8.md for
      the full derivation history if curious.
    - The "Thermal Debt compatibility mode" setting was renamed to
      "Frog Points spread to whole factory" and its description
      simplified.
  Compatibility:
    - Added "? thermal-debt" as an optional dependency. Nothing changes
      for players who don't have it installed.
    - Added notes/thermal-debt-api-request.txt documenting the remote
      interfaces this mod can use from thermal-debt when present
      (cool_building, get_heatsink_info, get_heatsink_summary), all
      used defensively -- their absence never breaks anything.
  Bugfixes:
    - Fixed a real multiplayer desync caused by summing floating-point
      values in an order that isn't guaranteed identical across
      machines in several of the new heat/coverage calculations.
    - Fixed existing player characters on upgraded saves sometimes
      being unable to open card packs (two separate save-migration
      gaps, one of which could permanently lock a force out of ever
      opening packs again until fixed).
    - Fixed the Waste Heat Exchanger having no effect on thermal-debt's
      own separately-tracked mining-drill overheat while the
      whole-factory setting was on.
    - Fixed several formula and unit-conversion mistakes in the
      whole-factory heat dissipation math found during testing.
    - Fixed a stale, inaccurate in-game description and an incorrect
      changelog format that broke this very changelog viewer for all
      versions.
    - Fixed the whole-factory setting's own description, which
      incorrectly claimed both the Waste Heat Exchanger and Waste Heat
      Boiler pause while it's on. Confirmed final: the Exchanger never
      pauses under either mode (it keeps generating physical heat into
      the network the whole time); the Boiler's own throttle depends
      entirely on the shared network reaching a minimum temperature,
      and under this setting the Exchanger's heat output is split with
      thermal-debt's heatsinks rather than going to the Exchanger
      alone, so in practice the network often doesn't clear the
      Boiler's threshold and it sits idle -- confirmed by testing, not
      an explicit "pause the boiler" rule in the code.
    - Fixed a crash (attempt to index a nil value) in the exchanger/
      heatsink mutual-adjacency check, reported from an actual game
      session. Root cause: Factorio 2.0's runtime API can return a
      prototype's selection_box using named fields (left_top/
      right_bottom) instead of the older numeric-index array format
      this code assumed; now supports both.
    - Fixed a second, more severe multiplayer desync source: two
      helper functions (recipe-weighting for mystery-pack rewards)
      picked "whichever recipe pairs() happened to find first" when
      multiple recipes produce the same fluid/item as a byproduct, then
      cached that choice permanently for the session. If different
      machines' internal table iteration order picked a different
      recipe, the cached weight diverged permanently and fed into
      reward calculations -- a discrete, immediate divergence rather
      than a slow rounding drift, matching a report of desyncing much
      faster (within ~12 minutes, then again ~17 seconds after
      reconnecting -- the cache isn't persisted, so reconnecting
      redoes the same ambiguous search) than the round-22 fix
      addressed. Now collects all matching candidates and deterministically
      picks the alphabetically-first one by recipe name, regardless of
      iteration order.
    - Found and fixed the most severe desync source yet, during a
      requested conservative full-file audit: get_available_pool()
      built its tech pool by iterating force.technologies with pairs(),
      an order that isn't guaranteed consistent across machines. That
      pool's order then flowed into both card-drawing paths' weighted
      cumulative-sum selection (walk candidates in order, accumulate
      weight, stop when a random roll falls within the running total)
      -- for the exact same random roll and the exact same set of
      weights, a different candidate order can select a completely
      different technology card. This directly affects which card a
      player is offered on every single pack, not an edge case. Fixed
      at the source: the pool is now sorted by technology name before
      being returned, so every downstream consumer (both drawing modes)
      automatically gets a machine-independent order.
Version: 0.2.25
Date: 2026-08-13
  Features:
    - New debug command /draft-tech-check <tech id> -- looks up a
      single technology's current enabled/hidden/researched state
      and whether it's currently eligible for the draft pool, with
      the specific reason why or why not. Mainly useful for
      verifying that another mod's deliberately-hidden technologies
      (e.g. The Cave's fluid-wagon under Train Interiors) are
      correctly excluded, without having to open dozens of packs
      and eyeball the results.
  Optimizations:
    - Replaced four separate per-second "scan every surface for
      mining drills / waste heat boilers / waste heat exchangers"
      loops with a single event-driven entity cache that's updated
      only when those entities are actually built or removed.
      Previously each of those loops re-scanned every surface on
      every tick interval; with mods that create many additional
      surfaces at runtime, the fixed per-surface call overhead
      could add up noticeably. Existing saves get the cache
      backfilled once on load; new games start with an empty cache
      that fills in as things get built.
  Changes:
    - The mystery card (⑨) can now resolve into a mix of real tech
      unlocks and item rewards in a single pick, instead of the
      whole outcome always being one type or the other. The total
      number of things it unlocks is still capped by how many cards
      were shown that round, with one long-standing exception: when
      ⑨ is the only card in the round, it can still resolve into
      1-3 outcomes as before. The ❄ item-rewards setting still
      controls whether items can show up at all; turning it off now
      falls back to a real tech unlock for that specific outcome
      slot rather than removing the possibility of that slot
      entirely, so turning ❄ off or on no longer changes how many
      total things a given ⑨ pick can unlock -- only what kind of
      things fill those slots.
    - Spell Card Reissue now stays in effect for as long as its
      setting is on, instead of only firing once at the moment you
      flip the switch. An eligible player who reconnects while the
      setting is on now gets a hand dealt automatically the moment
      they join, on top of the existing one-time catch-up for
      whoever's already connected when you turn the setting on.
    - Spell Card Reissue and its "New Fairy" companion setting are
      now fully independent instead of the latter only mattering
      when the former is on. Any combination now works, including
      "established players wait for the next round, new players get
      dealt in immediately" -- previously impossible since the two
      were coupled. Existing saves with the specific combination of
      Spell Card Reissue off + New Fairy on will see a real behavior
      change here: that combination used to do nothing, and now
      enables reissue for new players only.
    - IMPORTANT, affects Shared mode by default: both settings above
      now also apply to Shared mode, not just Independent hands.
      Shared mode previously had no eligibility concept at all -- any
      connected player could always see and pick from the shared
      pack, regardless of when they joined. That's no longer true.
      With both settings at their off-by-default value, a player who
      is offline when a round is dealt and reconnects later will now
      see a "not eligible for this round yet" message instead of the
      shared pack, exactly like Independent hands has worked since
      0.2.21 -- they'll be eligible again starting next round. This
      changes the out-of-the-box experience for every Shared-mode
      game, not just testers of the two experimental settings; if you
      want the old "anyone connected can always open the pack"
      behavior back, turn Spell Card Reissue on (nobody has been
      through a "New Fairy"-only scenario tested yet, so treat that
      specific combination as less proven than the rest).
  Bugfixes:
    - `/draft-heat-debug` crashed with "Entity is not heat-interface"
      when run on a waste heat boiler, because it unconditionally
      called an exchanger-only API method. Selecting a boiler now
      shows its own active/PWM-throttle state instead.
    - `/draft-reveal-all` (the uninstall-prep command) didn't skip
      technologies another mod deliberately marks hidden, so running
      it could permanently un-hide something like The Cave's
      fluid-wagon -- fighting that mod's own design even after this
      one is removed. It now leaves those alone and reports how many
      it skipped.
    - Technologies that another mod deliberately marks as hidden
      (used for internal, obsolete, or intentionally unreachable
      tech) could still be pulled into the tech draft pool, letting
      players unlock things the other mod never intended to expose.
      The draft pool now skips hidden technologies, and a hidden
      technology's downstream techs no longer count toward a card's
      "how many follow-up cards does unlocking this open up"
      weighting.
    - Manual mining progress only ever counted vanilla resource
      entities. Some mods (The Cave, specifically) build their core
      digging gameplay around non-resource entities that are still
      minable by hand -- those never contributed anything, so
      playing through that content earned zero tech-draft progress
      no matter how long you dug. There's now an extensible
      allow-list for exactly this situation (currently covers The
      Cave's cave-wall dig/rubble entities), using its own separate
      weight from ordinary resource mining rather than assuming the
      same conversion rate applies.
    - The optional Discord bridge notification (see 0.2.24) now
      sends the picking player's own tech/item names instead of
      internal identifiers, translated into that player's own
      client language. It's also no longer limited to real tech
      picks -- picking the mystery card (⑨) or an item reward (❄)
      now notifies the bridge too.
    - The waste heat exchanger's highlight box (shown when you
      select it, marking which nearby drills are actively
      contributing) now uses the game's own selection-box artwork
      tinted to this mod's colors, instead of a hand-drawn
      rectangle, so it looks closer to native cursor highlights.
Version: 0.2.24
Date: 2026-08-11
  Features:
    - When a real tech card is picked, the mod can now optionally
      notify an external Discord bridge mod (open-discord-bridge-v1)
      if you have one installed, sharing the picking player's name
      and which tech was unlocked. This requires both the bridge mod
      to be installed AND a new server setting
      (card-tech-draft-discord-bridge-enabled, off by default) to be
      turned on -- having the bridge mod installed alone is not
      enough to send anything.
    - Added a server-admin setting for Independent hands mode
      (card-tech-draft-late-join-deal-enabled, off by default). This
      is a manual, on-demand tool, not a background process: the
      instant you switch it on, every currently connected, eligible
      player in that round who doesn't have a hand yet gets one dealt
      immediately. "Eligible" specifically excludes brand-new players
      who haven't received a hand through the normal dealing process
      before, so newcomers on public servers aren't swept into an
      in-progress round they don't understand yet -- a separate
      setting (card-tech-draft-late-join-deal-include-new-players,
      also off by default) lets you include them too if you'd rather
      not draw that distinction. Neither setting keeps watching for
      future arrivals -- turn late-join-deal off and back on again to
      catch up anyone who becomes eligible later. Off by default,
      matching the mod's behavior since 0.2.21 (a player who was
      offline when hands were dealt just sees a clear "no hand this
      round" message and waits for the next round).
  Bugfixes:
    - Fixed the waste heat exchanger's built-in settings GUI briefly
      flashing open and immediately closing when non-admin players
      clicked it in multiplayer. The entity's built-in GUI is now
      disabled entirely (gui_mode = "none") since its temperature is
      fully script-controlled and was never meant to be manually
      adjusted; current temperature is still visible via the
      entity's info panel as before.
  Changes:
    - Renamed several settings' display names and descriptions
      (internal setting IDs are unchanged, so existing per-server
      configuration carries over): "Tech point threshold" is now
      "Frog Points", "Pack count difficulty" is now "Spell Card"
      (with a shorter, more mysterious description to match), and
      "Deal-in reconnecting players" is now "Spell Card Reissue".
      The mystery-pack-rate option labels (Off/Low/High) are now
      Flower/Dragonfly/Fairy.
    - The mystery pack's low-rate option is back to its original,
      lower value (it was briefly raised in 0.2.22, and is now
      reverted by request). The high-rate option is unchanged. As
      always, exact odds are intentionally not published here --
      see the in-game setting description.
Version: 0.2.23
Date: 2026-08-09
  Features:
    - Added a "Masochist Mode" toggle
      (card-tech-draft-dou-m-enabled, off by default). This is
      independent from the difficulty threshold slider below --
      the slider sets the starting cost, this switches which growth
      curve formula gets applied to it. On, it brings back the
      original 0.2.18-0.2.22 curve (the steep one being replaced this
      version); off, it uses the new gentler curve. If you want to
      fully recreate the old version's default feel, you'll want to
      combine this with setting the threshold slider back up as well
      -- the in-game description spells out the specific combination.
      Switching it mid-game is reconciled the same way a difficulty
      change is: any resulting surplus or shortfall gets settled
      immediately rather than silently carried forward.
  Changes:
    - The tech point threshold difficulty setting
      (card-tech-draft-difficulty-threshold) keeps its familiar
      1-200 range, but the underlying growth curve itself has been
      replaced rather than just adjusted -- the early-game ramp-up is
      noticeably gentler than before. This is a full replacement, not
      an additional option alongside the old curve: the previous
      steep curve was tuned for players who rush mining expansion
      hard from the start, and it created a real difficulty spike for
      anyone playing at a more relaxed pace, especially early on. The
      new curve keeps the same overall shape (a faster ramp for the
      first ~20 packs, then a long steady stretch afterward) but
      scales down substantially, so players who want a gentler ride
      now have real room to dial it in, not just a narrow band at the
      low end of the old range. (If you specifically want the old
      steep curve back, see Masochist Mode above.) The default value
      has also moved down accordingly. If you were previously running
      at a high difficulty value expecting the old steep curve, note
      that the same slider value now behaves differently -- the
      settings screen shows the current valid range and default going
      forward. Existing saves are handled automatically: on first
      load under this version, any save that had already accumulated
      progress under the old curve gets reconciled against the new
      one, and any resulting surplus is refunded as
      immediately-available packs, the same way a manual difficulty
      change already gets reconciled today. You shouldn't need to do
      anything for this to happen.
  Bugfixes:
    - Fixed an edge case where very low difficulty values could get
      stuck: under certain conditions the threshold calculation could
      round down to the same number it started from, permanently
      halting the difficulty curve's progression for the rest of a
      playthrough. This no longer happens across the supported range.
    - Fixed a save-migration edge case: saves created before this
      version's threshold history tracking existed now correctly
      backfill their historical totals using the curve that was
      actually in effect when those packs were purchased, instead of
      the current one -- this only matters for older saves updating
      through this version for the first time, and has no effect on
      saves that already have this history tracked.
  Notice:
    - Versions 0.2.18 through 0.2.22 all shipped with the same tech
      point growth curve, and that curve had a fundamental design
      flaw: it compounds into an unplayable number by the late game.
      0.2.22 is being kept on the mod portal going forward purely as
      a historical reference -- it will not be pulled, but it is no
      longer a recommended starting point for new games, and future
      releases do not guarantee migration support from any save on
      0.2.22 or earlier. If you're on one of these versions, this is
      the version to update from.
    - The migration path for saves from 0.2.18-0.2.21 has been
      verified through code review and simulation (the growth curve
      formula is confirmed identical across all four versions), but
      has not been tested against an actual save file from any of
      them. If you're updating from one of these and hit something
      that looks wrong, please report it -- this is a known gap in
      test coverage, not a known issue.
Version: 0.2.22
Date: 2026-08-09
  Features:
    - Added a "Pack count difficulty" runtime-global setting
      (card-tech-draft-pack-count-difficulty, three tiers: easy/
      normal/hard), replacing the previously fixed three-card hand.
      Each time a pack opens, how many card options you see (1-5) is
      now rolled from a bell-shaped distribution tied to this
      setting -- rarer at the extremes, most common in the middle.
      This is a separate axis from the existing tech point threshold
      setting: it changes how many choices you get, not how often a
      pack opens. In Independent hands mode, each connected player
      rolls their own count independently, so different players in
      the same round can end up with different-sized hands, not just
      different cards.
    - Added an experimental mystery pack setting
      (card-tech-draft-mystery-pack-rate, off by default). When on,
      each card slot has a chance of resolving to a special mystery
      card ("⑨") instead of a real technology, competing directly in
      the same weighted draw as the real candidates rather than being
      a separate roll layered on top -- so it doesn't dilute or
      inflate the odds of anything else. Never displaces a
      pity-guaranteed pick. The setting has three tiers -- off, low,
      and high -- for players who want a bigger dose of chaos. At
      most one mystery card can appear in a given hand.
      Picking it triggers a random payout whose strength and variance
      scale with how many real cards accompanied it that round: fewer
      real cards means a steadier, more guaranteed outcome; more real
      cards means higher variance, anywhere from nothing at all to
      unlocking a wide swath of technologies at once, and now also a
      chance of a straight-up item windfall instead of a tech unlock
      (see the item reward pool below). A brand new, still-experimental
      mechanic -- feedback especially welcome.
    - Added an item reward pool setting
      (card-tech-draft-mystery-item-rewards-enabled, off by default).
      When on, card draws (and the mystery card's payout above) can
      also resolve into a bundle of items dropped straight into your
      inventory instead of a technology -- one item pulled from each
      of four rarity bands (common through epic; the rarest band is
      reserved for other purposes), shown side by side so a single
      pick isn't just one repetitive item. Quantities are pulled from
      a curated pool spanning common materials all the way up to
      end-game and Space Age items, and scale with how rare each item
      is, how long it's been since that item last showed up, and how
      involved its crafting recipe is, so the payout leans generous
      rather than token. If your inventory can't hold it all, the
      overflow spills on the ground at your feet instead of vanishing.
      Turning this on also softens the tech point threshold for a
      stretch afterward, refunding any packs you'd overpaid for under
      the old threshold; turning it back off raises the threshold
      again and settles the books the same way, so switching it on
      and off isn't a way to game the threshold curve.
  Changes:
    - The hub-based "tiered draw" used in Independent hands mode
      (each hand structurally spans a mix of high- and low-impact
      technologies, instead of leaving diversity entirely to chance)
      now scales to match however many cards a hand contains, instead
      of assuming a fixed three. This is what makes the pack count
      difficulty setting above actually produce varied, non-repetitive
      hands in Independent hands mode regardless of hand size.
Version: 0.2.21
Date: 2026-08-08
  Graphics:
    - Opening a pack now uses a dedicated window centered on screen
      instead of a row of small buttons tacked onto the bottom of the
      HUD. Each of the three cards shows the technology's icon and
      localized name, how many of its prerequisites are researched,
      its science pack cost (as pack icons with counts, plus the
      research cycle count), a short summary of what it unlocks, and
      how many follow-up technologies it would open up. Previously the
      only information on a card was its icon and a tooltip with its
      name, which meant picking largely came down to recognizing the
      artwork.
    - The new window is registered as the player's open GUI, so Escape
      closes it and opening any other interface dismisses it, matching
      how vanilla windows behave. Closing it this way only closes the
      window: the pack is not consumed, the hand is kept, and the pack
      button reopens the same cards.
    - Opening a pack no longer force-expands a collapsed HUD. The cards
      used to live inside the HUD, so revealing them required expanding
      it first, overriding the player's own collapse preference; the
      cards are no longer in the HUD, so this side effect is gone.
    - The Standard HUD size now carries a detail panel: Tech Points as
      current / threshold with a progress bar, heat efficiency, working
      drills out of total, how many of those working drills are covered
      by a Waste Heat Exchanger, the resulting coverage ratio, idle
      ratio, and the eligible exchanger count. The Compact size is
      unchanged and shows none of this -- it stays deliberately minimal.
      The figures are read from a snapshot the existing once-per-second
      heat loop already computes, so the twice-per-second HUD refresh
      adds no entity scanning of its own.
    - All of the above uses stock Factorio frames, styles, fonts and
      sprites (inside_shallow_frame, bordered_frame, slot_button,
      progressbar, frame_action_button). No new prototypes or styles
      were added for cosmetic purposes.
  Features:
    - Added a "Pack presentation style" per-player setting
      (card-tech-draft-pack-ui-style, allowed values: window/simple).
      "Window" is the new centered Draft window described above, with
      full detail and two-step confirmation. "Simple list" restores
      the pre-0.2.21 inline HUD card row -- one click and it's picked,
      no confirmation step. Both share the same underlying data and
      unlock logic; this is not a full/stripped-down pair, just two
      ways to interact with the same system. Default: window.
    - Added a "Tech point threshold (difficulty)" runtime-global
      setting (card-tech-draft-difficulty-threshold, range 50-200,
      default 100), replacing the previously hardcoded starting value.
      Can be changed anytime, including mid-game -- this isn't meant
      to punish players, it's meant to let each group pick its own
      pace. The mod tracks how many tech points a force has actually
      spent opening packs so far, and compares that against what the
      new setting says should have been spent to reach the same pack
      count. Lowering the setting mid-game refunds the difference as
      tech points, immediately opening as many packs as that refund
      now qualifies for. Raising it instead adds the difference as a
      one-time surcharge tracked separately from the normal threshold;
      the very next pack must cover the surcharge on top of its usual
      cost, and once that's paid off the surcharge is cleared and the
      threshold resumes its normal decay from where it already was,
      untouched by the surcharge. The refund/surcharge accounting
      itself has gone through several rounds of logic review but has
      not yet been exercised in a live game -- feedback on whether the
      numbers come out right in practice is especially welcome. This refund/surcharge accounting has
      only been verified through logic review and offline simulation
      of the same formulas, not by actually exercising it in a running
      game -- feedback on how it behaves in practice, especially
      around raising/lowering the setting repeatedly, is particularly
      welcome.
    - Picking a technology is now a two-step action: clicking a card
      selects and highlights it and shows a confirmation row, and only
      Confirm actually unlocks it. Cancel, or clicking the selected
      card again, clears the selection. Unlocking is irreversible and
      the cards were previously small, easily mis-clicked buttons, so a
      single stray click could spend the round with no recourse. The
      force-wide unlock announcement is unchanged.
    - In a multiplayer round where several players have the window open,
      whoever confirms first ends the round, and everyone else's window
      is replaced with a notice naming who picked which technology
      rather than silently vanishing. The same line is also printed to
      chat, because a queued backlog pack can immediately start the
      next round and overwrite the notice before it can be read.
    - With Independent hands enabled, a player who was not connected at
      the moment the round was drawn now gets an explicit message
      explaining that hands are only dealt to players online at draw
      time and that they will be included from the next round. It
      previously returned silently, leaving the HUD showing a pending
      pack that appeared to do nothing when clicked.
  Bugfixes:
    - Fixed a case where a single round could unlock two technologies in
      multiplayer. A pack window is a static element and does not
      update itself when the game state changes, so after one player
      confirmed, another player's leftover window was still clickable.
      Each round now carries an incrementing token (per force, bumped
      only when a genuinely new hand is drawn, not when a backlog pack
      is queued), and every select and confirm re-validates that a pack
      is still pending, that the window's round token still matches,
      that the technology is in that specific player's current hand,
      and that it exists and is not already enabled. A click failing
      any of these is rejected with a message instead of taking effect.
    - The mining statistics behind the heat mechanic (idle ratio,
      exchanger coverage) were only recalculated while heat was above
      zero, so once heat decayed to zero they stayed frozen at whatever
      they were in that last second. Harmless while the numbers were
      only visible via a debug command, but they are now shown on the
      Standard HUD, where a permanently stale idle ratio would actively
      mislead. Statistics are now refreshed every second regardless of
      heat; only the decay arithmetic itself remains conditional on
      heat being above zero, exactly as before. The heat formula, the
      exchanger eligibility rule and its force filtering are unchanged.
    - Fixed the 0.2.18 Waste Heat Boiler 2x2-to-3x3 migration
      indiscriminately destroying correctly-built 3x3 boilers on any
      force experiencing its first mod update, regardless of whether
      that force ever actually had old 2x2-era boilers. The migration
      now checks that the save's old_version is actually no later than
      0.2.18 before running, in addition to its existing per-force
      one-time guard.
    - Fixed the tech point threshold setting's refund/surcharge math
      being based on an incorrect assumption about how many points a
      force had already spent, which produced wrong results (usually
      no refund at all when lowering the setting) for any force whose
      history predates this setting, most notably saves updated from
      0.2.19 or earlier. The mod now tracks each force's actual
      cumulative spending and, for forces that predate that tracking,
      mathematically reconstructs it from the force's current state
      instead of assuming it always used today's configured value.
      This reconciliation no longer depends solely on Factorio
      detecting a mod version change between saves; it also runs the
      first time a save is loaded under the new logic regardless of
      version history, so it is not skipped by an in-place mod file
      update that does not change the declared version.
  Changes:
    - The /draft-pack debug command now adds tech points via the same
      code path real mining uses, instead of forcing a pack open
      directly -- this lets the difficulty threshold setting actually
      be exercised and tested through the command, including its decay
      curve and backlog accumulation. Optional parameter to specify how
      many points to add (e.g. /draft-pack 500); defaults to just
      enough to cross the current threshold.
Version: 0.2.20
Date: 2026-08-07
  Features:
    - Added an experimental, off-by-default setting: "Independent hands"
      (card-tech-draft-independent-hands, runtime-global). When enabled,
      each connected player on a force draws their own independent hand
      each round instead of the whole force sharing one hand -- useful
      for comparing picks and discussing which one to spend the team's
      shared research slot on. Tech unlocks remain force-wide (as they
      always have been in vanilla); whichever player picks first ends
      the round, and everyone else's still-unpicked hand is discarded.
      Known trade-off, not yet addressed: the draft pool and its pity/
      cooldown counters are still shared at the force level, not split
      per player, so within the same round a player who draws later
      sees a pool already shifted by earlier draws in that same round.
      Untested in an actual multiplayer session -- feedback welcome.
      Since this is a runtime-global setting, only admins can change it
      mid-game (server owner discretion). Safe to flip at any time,
      including while a pack is currently pending: each round now
      locks in whichever mode was active at the moment it was drawn
      (storage.pack_mode), so toggling the setting only affects the
      *next* round -- it can no longer orphan a round already in
      progress.
  Changes:
    - Waste Heat Exchanger no longer opens any GUI when clicked. Its
      underlying vanilla type (heat-interface) ships with a debug panel
      meant for manual heat testing, not player-facing interaction; a
      custom read-only temperature window was previously substituted
      in its place (since 0.2.16), but this is now removed entirely so
      the building behaves like any other non-interactive entity (belts,
      pipes, etc). The per-second heat_setting reset loop that prevents
      cheating via the circuit network is unaffected and remains active.
    - Waste Heat Boiler's entity description clarified: previously
      stated the 465°C steam is "for ordinary steam engines," which
      undersold its actual capability -- that temperature already
      clears the threshold turbine generators require. Description
      updated across all three locales to state it works with both.
    - Fixed Waste Heat Recovery technology's effect icon ordering.
      Waste Heat Boiler's recipe-unlock effect was appended to the end
      of the effects list via an unindexed table.insert, landing it
      after Heat Pipe and Steam Turbine. Now inserted at index 2, so
      the display order is Waste Heat Exchanger -> Waste Heat Boiler ->
      Heat Pipe -> Steam Turbine, matching the intended build sequence.
  Bugfixes:
    - Fixed a fatal, unrecoverable error on load for any save still
      containing an old 2x2 Waste Heat Boiler pending the 0.2.18 size
      migration. The migration's call to LuaSurface::spill_item_stack
      still used the pre-2.0 positional-argument syntax; Factorio 2.0
      changed this to a single named-parameter table, so the call was
      being rejected with "Expected 1 argument but 4 were given."
      Updated to the 2.0 table syntax. Thanks to Lobelia for catching
      this on an actual affected save.
Version: 0.2.19
Date: 2026-08-06
  Balancing:
    - Waste Heat Exchanger's stage-1 heat extraction (the flat 83.9%
      cut introduced in 0.2.15) previously ignored how many exchangers
      were actually built -- a single exchanger got the same cut as
      ten. It's now scaled by an achievement ratio: the number of
      eligible exchangers (an exchanger with a working miner nearby)
      divided by the force's current count of working mining drills,
      capped at 1. Building enough exchangers to match your mining
      scale (1 exchanger per working drill) is required to reach the
      full 83.9% cut; falling short scales the cut down proportionally.
      With zero working drills, the ratio is treated as 0.
    - Waste Heat Recovery technology now additionally requires Lamp
      and Repair Pack as prerequisites, on top of the existing Steam
      Power, Logistic Science Pack, and Steel Processing. This pushes
      the tech further out along the normal research path instead of
      it being reachable as an early, disproportionately powerful pick.
      Note: on saves upgrading from 0.2.18, if this technology was
      already drafted (enabled) but not yet researched, it will
      require researching Lamp and Repair Pack before research can
      continue, even though those weren't required when it was drawn.
    - Waste heat exchanger temperature rise was far too slow to be
      useful in practice -- even with heat maxed out and full
      coverage, 10 exchangers would only gain about 1.17°C/second,
      taking nearly 400 seconds to reach the boiler's 465°C working
      temperature under the best-case scenario. WASTE_HEAT_JOULES_PER_
      UNIT raised from 100 to 2000 (20x), bringing that same scenario
      to roughly 23.5°C/second -- reaching working temperature in
      about 20 seconds. This is a deliberate shift toward the waste
      heat system being an immediately rewarding, incentive-driven
      building rather than a barely-functional decoration; it's fine
      if recovered power now exceeds what the mining drills themselves
      consume. Not a precisely calibrated number, just a starting
      point meant to be responsive -- can go higher if still too slow.
    - INITIAL_THRESHOLD (first pack's ore requirement) raised from 80
      to 100. 80 was calibrated back in 0.2.18 against an observed
      heat range of 18000-28000, with an explicit note at the time
      that it would need revisiting once waste heat recovery matured
      and effective efficiency improved. After this update's fixes
      (achievement-ratio numerator corrected, temperature rise rate
      raised 20x), best-case play now keeps heat under 20000 -- the
      predicted efficiency improvement arrived, so the threshold is
      raised to compensate, rather than leaving players with an
      unintended difficulty reduction. Same as before, this is a
      testing starting point, not a final calibrated value.
  Changes:
    - Added a one-time in-game notice (shown once, whether starting a
      new game or updating an existing save) explaining that Waste
      Heat Recovery now requires Logistic Science Pack, Repair Pack,
      Steel Processing, and Lamp before it can appear in the draft
      pool or be researched, so players aren't left confused about why
      the tech won't show up or won't research.
    - Waste Heat Exchanger: stack size 20 -> 50 (matching Solar panel /
      Accumulator, and because the achievement-ratio mechanic requires
      building roughly one per working mining drill). Recipe now
      requires 25 steel plates (was 20) and 6 heat pipes (was 4,
      reflecting its 8 active heat-pipe connections); pipe requirement
      unchanged at 10; crafting energy 10 -> 12. Weight manually set to
      40kg (rocket capacity ~25/launch, previously auto-calculated) --
      these two buildings are materially light but physically bulky,
      and weight is the only lever Factorio's rocket-capacity system
      exposes for that (per Wube's own FFF: item weight is chosen for
      balance, not realism), so this isn't a workaround, it's the
      intended use of the field. Vanilla character inventory is
      slot-limited, not weight-limited, so this doesn't make either
      building awkward to carry by hand.
    - Waste Heat Boiler: stack size 20 -> 30. Recipe now requires 15
      steel plates (was 10), 8 pipes (was 5, for its three fluid
      connections), 3 heat pipes (was 2); crafting energy 6 -> 8.
      Weight manually set to 60kg (rocket capacity ~16/launch), same
      reasoning as the exchanger above.
      Footprint stays 3x3 (not reverted to 2x2 -- that size was chosen
      specifically to fix pipe congestion from too many connections in
      a 2x2 footprint). Water/steam buffer volumes (200 each) and power
      draw (2MW) are unchanged, as neither showed evidence of being out
      of proportion with the new material cost.
    - Internal refactor: all 42 top-level tuning constants (previously
      scattered as individual `local` declarations throughout
      control.lua) are now centralized in a new constants.lua file, a
      plain data table with no game/script/data:extend references, so
      it can be required from both the data stage (prototypes/*.lua)
      and the control stage (control.lua) -- these are separate Lua
      environments in Factorio that couldn't previously share a single
      source of truth for a constant, requiring manual "remember to
      update both places" comments (e.g. the waste heat exchanger's
      15-tile detection radius was duplicated between control.lua and
      its prototype file). control.lua's existing constant names and
      every place that uses them are unchanged; only their declarations
      now read from the shared table, keeping this refactor's surface
      area to 42 mechanical one-line edits rather than touching
      call sites throughout the file. waste-heat-exchanger.lua's
      radius_visualisation_specification now reads the same shared
      constant instead of a duplicated literal.
    - Added a reusable migration-registry pattern (a `migrations` array
      plus a `run_migration_once` helper, tracked under
      storage.completed_migrations) for future one-off save migrations
      to register against, instead of each hand-rolling its own flag.
      The existing 0.2.18 waste-heat-boiler 2x2->3x3 migration is left
      exactly as-is on its own dedicated flag rather than retrofitted
      into this system, to avoid any risk of already-migrated saves
      being mistakenly re-triggered.
    - Fixed a miscommunication in the waste heat achievement-ratio
      calculation: its numerator (E) was implemented as the count of
      eligible exchanger buildings, but the intended design was the
      count of distinct currently-working mining drills actually
      captured within any eligible exchanger's detection range (its
      15-tile radius is meant to cover a wide area, so counting
      buildings instead of captured drills defeated the point of that
      radius -- a handful of exchangers could already capture dozens
      of drills, yet the ratio was being computed against building
      count, not drill count). achievement_ratio is now min(1, captured
      working drills / total working drills for the force), still
      guarding against covering only a small pocket of a larger mining
      operation (uncovered drills still count against the denominator).
      Building count is still used separately to split heat output
      across exchangers for temperature purposes, unrelated to the
      ratio itself. /draft-heat-ratio-debug was updated to report the
      corrected E and now shares the same counting function as the
      real calculation instead of duplicating the logic.
    - Added a new debug command, /draft-heat-ratio-debug, that prints
      the exact E (eligible exchanger count) and W (force-wide working
      mining drill count, across all surfaces) used by the waste heat
      achievement-ratio calculation, plus a "W_local" count of working
      drills actually covered by an eligible exchanger's range, for
      comparison. Added in response to a report that the 83.9% cap
      wasn't being reached at E/W=1 in practice -- the likely cause is
      that W counts every working drill belonging to the force across
      all surfaces, not just ones near an exchanger, so any working
      drills outside every exchanger's range will keep the ratio below
      1 even when local coverage looks complete. Whether to change W's
      scope to match E's local proximity (with the tradeoff of
      reopening the small-coverage exploit this force-wide scope was
      chosen to prevent) is still an open decision pending test
      numbers from this command.
    - Waste Heat Exchanger's item moved to the "energy" subgroup
      (alongside Waste Heat Boiler, both parts of the same waste-heat
      recovery pipeline), instead of the plain heat-pipe network parts
      subgroup it was in before. Both buildings' order strings were
      also changed to share a common prefix ("dz[waste-heat]-") so
      they always sort next to each other, landing right after Solar
      panel and before Accumulator in the crafting menu -- matching
      how far into the tech tree this recovery method actually reaches
      (its prerequisites never touch chemical science, unlike the
      accumulator's battery ingredient, which does).
Version: 0.2.18
Date: 2026-08-04
  Changes:
    - Waste Heat Exchanger's "nearby working miners" check now uses a
      square area (matching how vanilla substations judge their supply
      area) instead of a center-to-center radius. A mining drill now
      counts if any part of its footprint overlaps the square, even by
      a single tile, rather than requiring its center point to fall
      within the range. This affects both the actual heat-distribution
      eligibility and the debug/highlight tooling — all three internal
      lookups (eligibility calculation, on-hover highlight boxes, and
      the /draft-heat-debug command) now share the same square-area
      logic.
    - Waste Heat Boiler is now 3x3 (up from 2x2), with one pipe/heat
      connection per side instead of the old layout's 5 connections
      crammed onto 4 sides (the heat input alone used to take 2). The
      cramped 2x2 layout could cause the water input/output to jam in
      practice. New layout: steam out on one side, heat in on the
      opposite side, water in on each of the remaining two sides.
      A one-time migration automatically removes any existing 2x2
      Waste Heat Boilers on update and drops them as items on the
      ground, since their collision box is read live from the
      prototype and would otherwise jump straight to 3x3 in place.
      This migration is temporary and is planned for removal in a
      future update once older saves have had time to update.
    - Waste Heat Boiler's output now ramps up gradually with the
      connected heat-pipe network's temperature instead of switching
      instantly from 0 to full output the moment the network crosses
      20°C. Every 30 ticks, each boiler's current temperature is
      converted to a 0-1 ratio between its 20°C minimum and 465°C
      target, and a sigma-delta accumulator decides whether that
      boiler runs at full rate for the next 30 ticks or sits idle,
      averaging out to the correct ratio over time. This is a script
      workaround: vanilla's boiler simulation only supports all-or-
      nothing output once enough energy is available, so a true
      continuous curve isn't natively possible.
  Balancing:
    - First pack threshold reduced from 200 to 80 ore. The original
      200 was calibrated against raw ore totals from a rocket +
      science-pack ship + spaceship launch, without accounting for
      the drill overheat efficiency penalty, which measured 26%-44%
      effective output across the 18,000-28,000 heat range typically
      observed in play. 80 (40% of the original) is a starting point
      for retesting, not a final calculated value — actual effective
      efficiency changes over the course of a playthrough as Waste
      Heat Recovery comes online, which can't be captured by a single
      static number.
  Bugfixes:
    - Restored the cursor/selection range indicator on Waste Heat
      Exchanger, which had briefly been removed while its underlying
      shape was misdiagnosed as circular. It uses the same square-area
      logic as the eligibility check itself.
    - When selecting a placed exchanger, the range is now marked by
      both the native translucent fill (for consistency with the
      held-item preview) and a solid orange-red outline drawn on top
      of it, matching the mod's existing waste-heat theme color. The
      native fill alone was hard to see against Nauvis' brown dirt /
      green grass terrain, so the outline exists specifically to stay
      legible regardless of terrain color. Only the per-miner
      working-status highlight boxes stay purely script-drawn, since
      that information has no native equivalent.
    - Waste Heat Boiler's heat buffer could climb to 500°C even though
      its steam output was capped at 465°C, since
      energy_source.max_temperature had been left at 500 instead of
      being aligned to target_temperature. The displayed temperature
      no longer disagrees with the actual steam output — both are
      465°C now.
    - Waste Heat Boiler's water and steam fluid boxes were both
      missing production_type and pipe_covers, unlike vanilla's own
      Boiler and Heat exchanger prototypes which set both. The water
      connections' flow_direction was also changed from "input" to
      "input-output" to match those two vanilla references exactly.
      This is the most likely cause of water not transferring through
      the connection points at all.
  Locale:
    - Waste Heat Exchanger's in-game description now states its max
      power (10MW) directly, instead of requiring players to check
      the mod's source. Phrased as "Max power" to match vanilla's own
      terse convention for stating entity power figures in flavor
      text, rather than engineering terms like "throughput cap."
Version: 0.2.17
Date: 2026-08-04
  Bugfixes:
    - Fixed a save-compatibility issue from 0.2.16: removing the extra
      heat-exchanger recipe unlock from Waste Heat Recovery had
      retroactively re-locked that recipe for anyone who'd already
      researched the tech on an older version (and hadn't separately
      researched Nuclear power). Updating now automatically re-enables
      the recipe for those saves, with an in-game notice explaining
      what happened.
  Balancing:
    - Waste Heat Recovery is now also a prerequisite for Automobilism
      and, on Space Age saves, Advanced material processing. This
      raises its hub importance in the weighted pack draw, without
      adding any new tech content or touching the draw formula itself.
    - Waste Heat Recovery now additionally requires Steel processing
      as a prerequisite, alongside Steam power and Logistic science
      pack — you need basic steel production before the tech that
      lets you build its entities becomes available.
    - Idle mining drills now cool overheated drills faster than
      before: the same idle ratio now dissipates roughly 3x the heat
      it used to. Full-throttle mining still generates heat exactly as
      before — this only makes the "leave some drills idle to cool
      down" side of the trade-off less punishing to lean on.
Version: 0.2.16
Date: 2026-08-04
  Balancing:
    - Waste Heat Boiler's target temperature raised from 165°C to
      465°C, pushing its steam output much closer to (but still under)
      vanilla steam-turbine's 500°C threshold.
    - Waste Heat Recovery no longer additionally unlocks the vanilla
      heat-exchanger recipe. That recipe is now available through the
      Nuclear power tech path only, same as vanilla.
    - Waste Heat Recovery now also requires the Logistic science pack
      tech as a prerequisite, alongside Steam power. It could previously
      surface in the draft before you were able to produce its own
      research cost, wasting a pack opening on a card you couldn't
      queue for research yet.
    - A technology that just appeared in a pack (picked or not) now
      goes on a random 2-6 pack cooldown: its hub-importance bonus is
      fully suspended for that stretch, so it competes on equal footing
      with minor technologies instead of being almost guaranteed to
      show up again immediately. The pity/guarantee safety net is
      untouched by this — it's a separate mechanism.
  Gui:
    - Smaller, flatter HUD: the outer frame now uses the built-in
      invisible_frame style with zero padding, removing a stray blank
      strip that used to sit below the panel. The collapse/expand
      control is now a plain text ">" / "<" toggle instead of an icon,
      and the pack button plus the point/heat labels are all a bit
      smaller.
    - New per-player "HUD size" setting (Compact / Standard, also
      changeable via Mod Settings), so anyone who finds the compact HUD
      too small can switch to a larger layout without affecting other
      players. Left-click the collapse button to expand/collapse as
      before; right-click it to switch HUD size directly, no need to
      dig through the settings menu. A one-time tip is shown the first
      time you join, and the button's tooltip always mentions the
      shortcut.
  Bugfixes:
    - Fixed the Waste Heat Boiler's tooltip still stating 165°C after
      the temperature was raised to 465°C.
Version: 0.2.15
Date: 2026-08-03
  Features:
    - New technology: Waste Heat Recovery (prerequisite: Steam power).
      Unlocks a new building, Waste Heat Exchanger, plus the recipes
      for the vanilla heat-pipe, heat-exchanger and steam-turbine
      (in addition to their usual Nuclear power unlock path — both
      paths coexist, researching either one unlocks the recipe).
      Holding it in the cursor or selecting a placed one now shows its
      15-tile range as an orange-red dashed circle (reusing the
      reactor's neighbour-bonus radius sprite with a tint, to avoid
      clashing with the beacon's yellow supply-area visualization).
      Selecting a placed exchanger also highlights every currently-
      working mining drill within range with an orange-red box, same
      convention as the vanilla beacon highlighting the assemblers
      it's currently boosting — except this had to be built by hand,
      since "nearby working drill" is our own scripted rule and the
      engine has no built-in way to know about it.
    - Waste Heat Exchanger is a heat-interface entity that channels
      part of your drill overheat into the vanilla heat-pipe network
      instead of letting it evaporate. A working mining drill must be
      within 15 tiles or the exchanger draws nothing. The shared
      budget is split evenly across all eligible exchangers each
      second, so building more doesn't increase the total — it only
      lets you catch a larger share of the same fixed amount before
      it's wasted on a single unit's 10MW physical throughput cap.
      Output is capped at vanilla's 500°C heat-exchanger threshold;
      this is not meant to out-produce a real reactor.
    - Cooling is now two stages instead of one. If eligible exchangers
      are present, a first pass removes the same 83.9%-capped fraction
      as the existing decay formula, but ignores idle ratio entirely —
      that removed heat is what feeds the exchangers. Whatever's left
      then goes through the unchanged idle-ratio cooling as a second
      pass. Stacked together this pushes total cooling well past the
      old 83.9% ceiling (up toward 97%+ at full idle), which is
      intentional: recovering heat you'd have lost anyway wasn't worth
      building for, so it's now an actual reward for the investment,
      not just a prettier way to waste the same amount. Bases without
      an eligible exchanger nearby are completely unaffected and keep
      the exact 0.2.14 formula and pacing.
Version: 0.2.14
Date: 2026-08-01
  Balancing:
    - Drill overheat no longer cools down just from time passing. Every
      second, cooling is now calculated from the fraction of your mining
      drills that are idle right then: if every drill is running, heat
      doesn't move at all. Keep some drills idle at any given time —
      whether by cycling them on and off or by keeping spare drills
      powered down — to actually cool down.
    - Heads up: this is a severe difficulty change, not a small tweak.
      A fully automated base that never idles gets zero natural cooling
      from this point on and will run straight into the efficiency
      floor. Think it over before pulling this update, especially on a
      server or an existing save with a mature factory already running.
  Features:
    - Saves that are loading this mod for the first time (including saves
      that already had research done before the mod was installed) now
      have every technology hidden and returned to the draft pool —
      researched or not — so you can open packs and rebuild the whole
      tech tree from the start. Already-researched technologies keep all
      their unlocked recipes and effects; only their visibility in the
      normal research queue is touched.
  Debug:
    - Added /draft-reveal-all. This sets every currently-hidden
      technology on your force back to enabled, so the tech tree returns
      to a normal, unstuck state before you remove this mod. This is
      one-way: run it only when you're done with the mod for good.
Version: 0.2.13
Date: 2026-07-31
  Balancing:
    - Drill heat gain per ore raised from 10.0 to 500.0, and the minimum
      efficiency floor lowered from 3% to 0.01%. Any automated mining
      setup will now run into the heat penalty; avoiding it entirely
      means mining by hand only.
  Bugfixes:
    - Fixed a locale folder mismatch dating back to 0.2.11: the
      Traditional Chinese text was sitting under the Simplified Chinese
      (zh-CN) locale code, so a zh-TW client silently fell back to
      English. Added a proper zh-TW folder and converted zh-CN to
      actual Simplified Chinese.
Version: 0.2.12
Date: 2026-07-31
  Balancing:
    - Base pack threshold raised from 50 to 200 ore.
    - Reworked the early threshold growth curve into three stages: a
      fixed 1.45x rate for the first 12 packs, a steady decline down to
      1.05x over the next 8, then a flat 1.05x floor through pack 100.
      After that, the rate keeps decaying by a much smaller step down
      to a 1.02x floor that holds indefinitely, so the threshold never
      truly stops growing but slows to a crawl in the very long run.
Version: 0.2.11
Date: 2026-07-31
  Features:
    - UI update.
  Balancing:
    - Balance adjustment.
Version: 0.2.1
Date: 2026-07-30
  Balancing:
    - Pity/guarantee draw order changed to longest-waiting-first, so a
      technology can no longer be silently starved out of its guarantee.
    - Drill overheat decay changed to a proportional rate, so a single
      production spike no longer takes an unreasonably long time to
      recover from.
    - Heat efficiency floor pushed further out, so ordinary-scale mining
      setups don't hit the penalty as early.
  Features:
    - Threshold crossings that happen while a pack is still unopened no
      longer overwrite the pending pack. A backlog counter tracks how
      many packs are owed, and the HUD button shows this count.
    - Redesigned HUD: icon-only pack button, no title bar, tech points
      and heat shown as separate labels, frame grows to fit content.
  Bugfixes:
    - Fixed a GUI compatibility gap where an older HUD frame would fail
      to update after the layout changed.
  Optimizations:
    - Hub-importance scoring now reads a technology's own successor list
      instead of scanning every technology on the force each time.
Version: 0.2.0
Date: 2026-07-30
  Info:
    - Initial internal architecture: pack opening, draft GUI, and
      dependency-chain safeguards.
  Balancing:
    - Manual mining counts at full weight toward progress.
    - Threshold growth uses a two-stage decaying compound rate to avoid
      runaway numbers over a long game.
    - Added the drill overheat mechanic: sustained automated output
      raises heat, which throttles how much of that output converts to
      progress; heat decays over time and manual mining actively cools
      it down.
  Bugfixes:
    - Automated contribution tracking switched to reading the mining
      target's remaining resource amount, since mining drills do not
      expose a usable "products_finished" count.