Leave your engineer life behind. Become the Hive. Eat the rich. Or something like that.
Mods introducing new content into the game.
Version: 0.11.2
Date: 2026-05-18
Bugfixes:
- Pheromone unlock no longer crashes the mod on first awaken. Pheromone.apply_unlock used `require("script.force")` inside an event-driven path to break a module-load cycle, but Factorio 2.0 raises "Require can't be used outside of control.lua parsing" the first time the unlock fired in the field. The function now uses the top-level Force binding that's already required at the head of pheromone.lua; the local require is gone.
- First-time guidance messages now actually print. guidance.lua was firing keys with underscores (`first_hive`, `first_creep`, `first_lab`, `first_research`) while locale/en/hive_reboot.cfg uses hyphens (`hm-guidance-first-hive`, ...), so every milestone after join silently failed to resolve. Renamed the M.fire calls in on_hive_built / on_creep_first_tile / on_lab_built / on_research_finished to match the locale.
Version: 0.11.1
Date: 2026-05-17
Bugfixes:
- Evolution gate returned current = 0.00 in the field even when the engine's /evolution command showed the real per-surface value (e.g. 0.8992). The shipped 0.11.0 used `pcall(enemy.get_evolution_factor, enemy, surface)` — two args. Factorio's binding only accepts 0 or 1 ("Expected 0 or 1 arguments but 2 were given") and raised silently inside the pcall, so current_evo always landed at 0. Fixed by calling with dot syntax and the surface as the only argument: `pcall(enemy.get_evolution_factor, surface)`. The helper lives in Force.read_evolution so both the gate and the pheromone-unlock check go through one code path.
Changes:
- Evolution-gated node count now uses an exponential curve. The previous linear formula (`threshold = (N - 1) * 0.05`) scaled above 1.0 past 21 nodes, which evolution can never reach — networks past that count were permanently locked out. The new curve: threshold(1) = 0; threshold(N >= 2) = `step * growth_base ^ (N - 2)` where growth_base is solved so threshold(50) = 0.90. Once enemy evolution crosses 0.90 the gate lifts entirely (`uncap_at_evolution`), so the late-game exponential never demands thresholds beyond what evolution can reach. Tunables in shared.network: evolution_step (0.05), uncap_at_node (50), uncap_at_evolution (0.90).
Version: 0.11.0
Date: 2026-05-17
Features:
- Forbidden zone. Hive directors can no longer fly the god controller into player territory unannounced. Any chunk within configurable radius of a player-force entity (any non-vehicle entity counts) is off-limits unless a hive-force unit is already in scout range of the director. Violation teleports the director back toward their nearest hive (or last permitted position pre-hive). Tunables (hm-forbidden-zone-chunk-radius default 2, hm-forbidden-zone-scout-radius default 32 tiles) live in runtime-global Mod settings for live experimentation.
- Pheromones unlock by evolution. The Release Pheromones recipe is locked at game start and becomes craftable when the surface's enemy evolution crosses the first node-gate threshold (0.05). At that moment a chat message announces the hive's hunting instinct waking. Saves loaded already past the threshold flip the unlock silently.
- Per-player, network-scoped pheromone bursts. Each player on the hive force can have at most one live burst, and the burst only diverts recruitment and disgorge in the caster's own network. Fixes the MP bug where one caster's burst dragged every player's biters and dumped every network's storage chest.
- Pre-hive exemption. A hive director with no live hive and no pending anchor construction is exempt from the forbidden-zone rule entirely — they may fly freely anywhere on the map, including over player territory, to pick their placement spot. Their loadout already contains only the Hive item so the only action they can perform is placing a hive; the forbidden-zone rule only kicks in once they have a live hive or a pending construction.
Changes:
- Hive Anchor Binding and Hive Evolution Gate are now permanent features. The startup booleans are removed. Legacy saves where the settings were OFF migrate cleanly: existing networks (including multi-hive ones from legacy mode) are grandfathered, the player just can't craft additional hives.
- Save compatibility is now a non-goal -> a goal. From this version onward, saves made on any released version must load without problems on later versions. Pre-policy saves (0.10.2 and below) may need one-shot conversions but must not crash.
Bugfixes:
- Pheromone Vents never actually dispatched. The arrival_radius (3 tiles) was tighter than the go_to_location radius (5 tiles) used to command biters toward the vent — biters that stopped at the outer ring of their walk command were invisible to the arrival counter, so gather_count never crossed attack_group_size and dispatch never fired. arrival_radius is now 6 (small margin over the command radius). Diagnostic [hm-vent] log lines on every scan + dispatch when hm-debug-telemetry is on.
- Forbidden-zone scout exception broadened. A director who planted their anchor inside the engineer's base (chosen during pre-hive scouting) used to get teleport-spammed every tick after the 30-second construction completed, because the scout check filtered on type = "unit" and the hive itself is a unit-spawner. The check now accepts any hive-force entity within scout_radius (hive, node, lab, biter, worker, worm, spawner), so a director can always stand next to their own foothold.
- Forbidden-zone tick skips offline (disconnected) MP players. The teleport / message paths were running for players who weren't connected, generating queued chat spam they'd see on reconnect. The tick now only processes connected players; when an offline player rejoins, the next tick picks them up normally.
Version: 0.10.2
Date: 2026-05-16
Bugfixes:
- Evolution gate no longer silently passes every chain-extended node placement. The gate's network resolution used to call Network.resolve_at without the node's own reach; chained-outward placements sit just outside the parent network's box, so the resolution returned nil, the "existing nodes" count came back as 0, and the threshold became 0 - which every current evolution trivially passes. The gate now uses Network.hives_for_position with reach = shared.ranges.hive_node to find the chain-reachable parent network, then resolves the full member list from one of those hives' positions.
- Anchor-bound players no longer lose their Hive item to the loadout watchdog. The watchdog's strip-disabled-item branch (added in 0.10.1 for the debug-vent leak) was erasing the hm-hive item that Anchor.ensure_hive_available hands out on join, because the hive recipe is intentionally disabled under anchor binding. The watchdog now exempts items whose lifecycle is managed externally; today that is hm-hive under hm-anchor-binding.
Version: 0.10.1
Date: 2026-05-16
Bugfixes:
- Hive tech tree is no longer visible on the engineer's force. Every hm-* technology now ships with enabled = false at the prototype level; Force.configure flips them on for the hive force only. Engineer players no longer see hive research mixed into their vanilla tree.
- Engineer can place vanilla ghosts again. Build.on_built now returns early when the placed entity is not on the hive force, so the mod's pollution-charge / worker-dispatch / obstruction pipeline never touches engineer placements. The previous build was destroying any ghost on any force and printing "No hive in range".
- Debug pollution vent is now properly gated behind its startup setting. The recipe prototype is default-disabled (was enabled = true, which leaked the recipe to the engineer's force regardless of the setting). A migration in on_configuration_changed disables the recipe on every non-hive force and strips lingering vent items from engineer inventories. The loadout watchdog also strips items whose recipe is currently disabled, so directors who had the item under a previous build see it removed within a watchdog tick.
- Creep recedes when its source is destroyed. When a hive or hive node dies, any creep tile no longer covered by a surviving source's range reverts to the underlying terrain. Tiles still covered by another hive or node stay. The work is queued and drained on the creep cadence at ~500 tiles per resume so cascading network collapses don't cause a lag spike. Under Hive Supremacy this means the engineer's structures stop being damaged the moment the source dies.
Version: 0.10.0
Date: 2026-05-16
Features:
- In-game guidance. First-time milestone messages fire at join, first hive (on placement under legacy mode; on construction completion under Hive Anchor Binding), first creep tile, first Hive Lab, and first hive research finished. Voice is the hive's, not a tutorial system's. Each milestone fires once per save.
- /hm-help console command. Prints a structured summary of the core flow with conditional lines for the startup balance settings: the anchor-binding explanation appears only when Hive Anchor Binding is on; the evolution-gate explanation only when Hive Evolution Gate is on. Mechanics the world isn't using are omitted.
- Debug pollution vent is now gated behind a new startup setting "Debug pollution vent" (default off). Ordinary playthroughs no longer see the debug item in the loadout; sandbox testers flip the setting on.
Changes:
- Anchor mine-to-cancel works now. During the 30-second construction window the placing player is moved to a transient permission group that allows mining; mining the in-progress hive refunds the Hive item, destroys the empty storage chest, and drops the in-memory tracking. Once construction completes (or is otherwise cleared) the player returns to the default mining-blocked group. Previously the cancellation was documented but not actually wired up.
- Recruit-bucket cap factor doc-value corrected from 5 to 10 to match the running default (no gameplay change).
- Player pheromone burst gained a documented 30-second safety timeout (the timeout existed in code, was missing from the substrate; documented now).
Bugfixes:
- Removed dead constants from shared.lua: intervals.recruit and intervals.absorb (replaced by the unified scan in 0.9.0), pheromone_vent.build_cost (vent is free per requirements + design + code).
Version: 0.9.24
Date: 2026-05-01
Optimisations:
- Hive Lab supply tick no longer scans every surface. Labs are tracked when built and cached; the per-second supply pass walks the cached list instead of running find_entities_filtered per surface every tick. Significant win on Space Age multi-surface saves where the previous scan was visiting Nauvis, Vulcanus, Fulgora, etc. every tick.
- Network member list cached. The unified per-member scan dispatcher previously rebuilt and re-sorted its full hive+node list every tick; now it appends on build, drops on destroy, and reuses the sorted list. Removes a per-tick table allocation and an O(N log N) sort on every dispatch.
- Per-member network resolution cached. Every recruit scan was re-resolving the network at each member's position; the resolution walks the overlap graph and isn't free. Now memoised by member unit_number, invalidated only when a hive or node is built / destroyed / promoted. Biggest visible win on networks with many hives and nodes. Enemy biter expansion landing inside the network's bbox does NOT invalidate the cache — network identity is purely hive-side.
- Storage invariant: networks now hold a single chest at the primary hive (smallest unit_number), not one chest per hive. Earlier versions kept N effectively-empty chests per network; every pollution-capacity, item-count, and creature-conversion read walked all of them. Aggregations now read one inventory. Existing saves are migrated on first load: duplicate chests are drained into the primary and destroyed; no contents are lost.
- Reconciler watchdog. A slow rotating audit catches any cache drift caused by a future code path that mutates state without firing the right invalidation event. One cache verified every ~10 seconds, full cycle ~50 seconds. Pure safety net; quiet by default. Drift surfaces as a [reconcile] line in the telemetry log when "Debug telemetry log" is enabled.
Version: 0.9.23
Date: 2026-05-01
Bugfixes:
- Fixed two non-recoverable crashes introduced by the 0.9.22 profiler-precision telemetry change. LuaProfiler in Factorio 2.0 has no start() method (the previous build called it on every measured handler) and its methods are bound to the userdata, so they take no implicit self argument (the previous build called them with colon syntax, passing self and tripping argument-count errors). The telemetry layer now uses a scratch profiler restart/stop'd around each measured call and accumulates into the per-category profiler via dot-syntax add. Without this fix, 0.9.22 crashed on the first on_tick or on_player_created.
Version: 0.9.22
Date: 2026-05-01
Optimisations:
- Telemetry timing now uses helpers.create_profiler (nanosecond precision) instead of os.clock (15 ms granularity on Windows). The previous timer reported every category as 0.000 ms even when the mod was using significant CPU time per tick because each individual measure call was below the clock's resolution. The new timing accumulates correctly across all calls within a flush window. The [perf] line format is unchanged in shape but the per-category value is now rendered by Factorio's built-in profiler formatter (e.g. "145.872 ms" or "32.451 µs") so the unit varies per column.
Version: 0.9.21
Date: 2026-05-01
Changes:
- Pollution display moved from a floating label above each hive to a per-player GUI element in the top bar, alongside the hive buttons. The top-bar read-out uses the heading-1 font (~2x the previous text size) and is recoloured green/amber/red on the same thresholds as before. Cleaner hive sprite, larger and easier-to-read value, and significantly less multiplayer sync traffic since per-player GUI elements only sync to the owning client (the previous render-object label was world-state and broadcast to every client every tick window). Existing saves have their orphan render-object label IDs cleaned up automatically on first load.
Optimisations:
- Pollution read-out is now dirty-checked on its value and color band; unchanged frames don't touch the GUI at all.
- Extended telemetry coverage. Every per-tick handler and every event handler is now wrapped in Telemetry.measure (visible in the [perf] line when "Debug telemetry log" is enabled). Helps diagnose lag spikes that were previously invisible because the relevant code path wasn't being timed.
Version: 0.9.20
Date: 2026-05-01
Major Features:
- New startup setting "Debug telemetry log" (default off). When enabled, the mod writes [perf] / [recruit] / [supremacy] tuning lines to script-output/hm-debug.txt. Disabled by default so end users get a quiet save folder; turn on if you're tuning the mod.
Optimisations:
- Creep growth no longer pays per-tick cost on settled hives. Once a hive or node has filled its extension ring (creep_layer > max_radius + 1) its slot in the every-3-ticks Creep.tick loop short-circuits.
- Per-creature pollution value lookup is now memoised by unit name. The function reads prototypes.entity[name].absorptions_to_join_attack.pollution and is called inside the convert-creatures and pollution-capacity loops on every charge; the prototype data doesn't change at runtime so a session-lifetime cache is safe.
Bugfixes:
- Fixed a non-recoverable crash on Hive Node placement when the Hive Evolution Gate setting was enabled. Factorio 2.0 / Space Age moved evolution to per-surface state and removed the LuaForce.evolution_factor scalar; the gate now reads it via LuaForce:get_evolution_factor(surface).
- Fixed a non-recoverable crash on hand-crafting completion when both Pheromone and Promote Node handlers were registered. The shared event.item_stack handle was cleared by the first handler and the second handler raised on .name access. Both handlers now check valid_for_read before reading the stack.
- Fixed a multi-second freeze when triggering Release Pheromones on a network with a large stored-creature stockpile. The disgorge previously released every stored creature in one tick (one find_non_colliding_position + create_entity per creature). It now releases up to target_size * 3 creatures per burst; the rest stay in storage for future bursts.
Version: 0.9.19
Date: 2026-05-01
Bugfixes:
- Fixed a non-recoverable crash when any force marked a hive-side entity for deconstruction (typically AutoDeconstruct or a non-hive multiplayer player). The fix replaces the script-side cancel-on-mark handler with the standard "not-deconstructable" prototype flag on every hive-side entity (hive, hive node, hive lab, pheromone vent, pollution generator). The engine refuses the mark up front, so there's no race for a script handler to lose against Factorio 2.0's stricter cancel_deconstruction validation.
Version: 0.9.18
Date: 2026-05-01
Bugfixes:
- Mod settings (Hive Anchor Binding, Hive Evolution Gate) now actually appear in the Mod settings menu. The 0.9.17 release zip was built without settings.lua because that file wasn't registered in the build's explicit includes list, so the startup settings entries were invisible. Settings.lua is now in the zip, and the build script asserts at packaging time that every top-level Lua file is part of the release so this kind of omission can't recur silently.
Version: 0.9.17
Date: 2026-05-01
Major Features:
- Hive Anchor Binding (startup setting, default off): the hive becomes a permanent commitment. Each player gets exactly one Hive item on join (no recipe), placement triggers a 30-second construction window with a binding warning, and the hive is non-minable after construction. Additional hives only exist via the new Promote Node action. The hive force is endless: when every hive in the network dies the network collapses and the player receives a fresh starter Hive item to plant elsewhere.
- Hive Evolution Gate (startup setting, default off): node placement is paced by enemy evolution. The Nth Hive Node in a network requires evolution ≥ (N - 1) × 0.05, so the engineer's pollution and nest kills self-pace your expansion. Nodes only — hives (anchor + promoted) do not count toward the limit.
- Promote Node: new recipe (auto-unlocks alongside Hive Spawners). Crafting consumes a marker and converts the closest Hive Node within 20 tiles of you into a Hive at the same position. Costs 1000 pollution from the network. Promoted hives share the network's storage and do not count against the evolution gate.
- Pheromones reworked into a single-shot burst. Release Pheromones is now fire-and-forget: crafting it locks a temporary attractor at your position; recruited and disgorged biters divert there until X arrive (X = a default-mode Pheromone Vent's attack-group size, scaled by Attack Group Size tech), then they form an engine-routed attack group and disperse. Re-craft cancels the previous gather; re-craft after dispatch is fine. The Withdraw Pheromones recipe is gone — the burst is bounded.
- Shared storage. Every hive in a network now shares one chest at the runtime level: absorption inserts and the GUI click both route to the network's primary chest (the smallest-unit_number hive's chest). Clicking any hive or hive node opens the same inventory. On hive death, if any other hive on the network survives, chest contents merge into a survivor instead of disgorging — full network collapse only happens when the LAST hive dies.
Changes:
- Hive Node footprint shrunk from 4×4 (inherited roboport box) to 3×3, matching the small Pentapod-spawner graphic. Hive Lab grown from 3×3 (vanilla lab box) to 5×5, matching the biolab graphic. Both fall back to hardcoded Space Age sizes when the source prototypes are not present.
Bugfixes:
- Pheromone burst no longer locks the game with disgorge spam. The disgorge pass now fires exactly once per burst (was once per recruit-scan tick × every hive on the surface, repeatedly dumping all stored creatures). A 30-second hard timeout clears any burst that hasn't reached its target_size, so a burst placed where no biters can reach it can no longer trap recruitment indefinitely. Arrival radius bumped from 3 to 16 to match the attack_area radius the recruited biters are commanded with — bursts now resolve within ~1 second when biters are nearby.
- Pheromone burst item is reliably consumed on craft via event.item_stack.clear() instead of a post-delivery inventory search (which raced on the god controller and left stranded items). A defensive one-shot migration sweeps any stranded items left by older builds.
- Fixed an on_tick crash ("count must be positive") in the pheromone-item sweep — inv.remove({count = 0}) raises in Factorio 2.0; now guarded with `if n > 0`. Inventory access wrapped in pcall; per-tick scan converted to a one-shot migration.
Version: 0.9.16
Date: 2026-04-30
Changes:
- Creep edges are now slightly irregular instead of perfect Chebyshev squares. The two outermost rings of each hive/node fill at ~90% / ~65%, and a sparse extension ring (~30%) reaches one tile past the build box. Placement is gated by a deterministic per-tile hash, so the silhouette is stable across save/load and never grows fingers.
Version: 0.9.15
Date: 2026-04-30
Bugfixes:
- Network containment / placement now uses Chebyshev (axis-aligned box) distance, matching the actual hive and node footprints. Previously it used Euclidean distance (dx² + dy² ≤ r²) — the inscribed circle of each box — so hives and nodes only connected at full range when perfectly horizontally or vertically aligned, and corner regions of every box were falsely rejected. This is most visible for the Hive (range 50, box 100×100): the diagonal corners ended up nearly 30% outside the old check. Fixed in both Network.hives_for_position and Network.resolve_at.
Version: 0.9.14
Date: 2026-04-30
Bugfixes:
- Multiplayer: hive-side entities can now actually have their deconstruction marks cancelled. Director.on_marked_for_deconstruction was only calling entity.cancel_deconstruction(hive_force), which is a no-op when the marking force is anything other than hivemind (e.g., a non-hive player on the regular `player` force in MP). The handler now scopes itself to hive-owned entities (hive force, plus post-swap player-placed enemy spawners/worms) and cancels for every existing force.
Version: 0.9.13
Date: 2026-04-30
Changes:
- Pheromones now make biters attack engineer-aligned entities at the carrier's position. Recruited and disgorged units are sent with attack_area at the carrier's position (radius 16) instead of go_to_location, so they engage any player-force structures, vehicles, or other engineer stuff that happens to be at the carrier.
Version: 0.9.12
Date: 2026-04-30
Bugfixes:
- Supremacy now runs every game tick (intervals.supremacy = 1, was 6). At 10 Hz vanilla tree regen partially restored between writes and the visible drain barely moved; at 60 Hz regen has only one tick to recover and the health bar drains smoothly along the target trajectory.
Version: 0.9.11
Date: 2026-04-30
Bugfixes:
- Supremacy now actually visibly drains HP. Two compounding fixes: (1) damage_cache wrote target only when entity.health was already higher than target, so vanilla tree regen between ticks erased the drain. The write is now unconditional. (2) supremacy ticked at 1 Hz (60 game ticks); raised to 10 Hz (intervals.supremacy = 6) so the visible drain is smooth and regen can't catch up.
Version: 0.9.10
Date: 2026-04-30
Bugfixes:
- Fixed Hive Supremacy still doing nothing. The 600-tick candidate-cache rebuild was wiping the entries table and re-adding every entity with a fresh added_tick — so a tree that had been on creep for 9.99 seconds got its timer reset to 0 every 10 seconds and could never reach the 30-second lifetime. The rebuild now preserves existing entries' added_tick and only adds entities that aren't already cached. Dead entries are pruned during the walk.
Version: 0.9.9
Date: 2026-04-30
Bugfixes:
- Fixed crash on save-load after upgrading to 0.9.8: "attempt to compare nil with number" in supremacy.damage_cache. The 0.9.8 cache shape replaced dmg_per_tick / lifetime_seconds with added_tick / expires_tick / max_hp, but saves from 0.9.5–0.9.7 still hold cache entries in the old shape. damage_cache now drops entries that lack the new fields; the next candidate scan rewrites them in the current shape.
Version: 0.9.8
Date: 2026-04-30
Bugfixes:
- Fixed Hive Supremacy "trees stuck at low HP" by bypassing entity.damage entirely. Vanilla trees have full fire resistance AND regenerate health over time, so per-tick damage was being absorbed by resistance and then regenerated faster than supremacy could whittle it down. Supremacy now writes entity.health directly (linear drain over the lifetime), then entity.die()'s the entity at expiry. Tree pollution burst still fires on death.
Version: 0.9.7
Date: 2026-04-30
Changes:
- Clicking a Hive Node now opens the chest of the nearest hive on the surface, mirroring the click-on-Hive behaviour. No more empty roboport GUI on nodes.
Version: 0.9.6
Date: 2026-04-30
Bugfixes:
- Rocks now take supremacy damage. simple-entity is no longer in the skip list — safe_max_health filters out the truly-no-health variants while letting damageable rocks through.
- Trees no longer get stuck at 1 HP. Vanilla trees have very high physical resistance, which floored the per-tick damage to 1 and left them undying. Trees are now damaged with "fire" (100% damage in vanilla) instead of "physical". Added a low-HP safety: any entity at <= 1 HP after damage gets entity.die() to finish it.
Version: 0.9.5
Date: 2026-04-30
Bugfixes:
- Fixed crash on save-load: "LuaEntityPrototype doesn't contain key max_health." Removing the unit_number filter in 0.9.4 exposed entity types whose prototype doesn't expose max_health (rocks / simple-entity / decoratives). Added simple-entity, decorative, and cliff to the supremacy skip list, and pcall-wrap the prototype.max_health read with a fallback to entity.health.
Version: 0.9.4
Date: 2026-04-30
Bugfixes:
- Fixed Hive Supremacy doing zero damage. The candidate cache was keyed by entity.unit_number; on the running engine, every entity returned by find_entities_filtered{force={player,neutral}} (trees, rocks, decoratives) had nil unit_number, so the cache was empty every cycle. Cache is now an array keyed by index.
- Removed the attack-group bypass pcall spam. Both commandable.unit_group and commandable.group throw "doesn't contain key" on every call (verified via 0.9.3 telemetry: ag_err >800/sec, ag_ug + ag_g = 0). Until a working property name is found, the bypass is a no-op — every biter routes through the trickle. Saves the pcall cost on every recruited unit.
Version: 0.9.3
Date: 2026-04-30
Tunables:
- Bumped recruit.bucket_cap_factor 5 → 10. Networks now hold up to 20s of saved-up trickle, so previously-untouched pockets get a brief surge instead of a dribble when the player walks past.
Telemetry:
- [perf] line gains find / recruit / absorb / damage / dispatch operation counters. Wallclock ms still emitted (zero-floored under ~15ms on Windows os.clock granularity); op counts give shape data when ms is 0.
- [recruit] line gains attack-group probe counters (ag_ug, ag_g, ag_miss, ag_err) so we can confirm which spelling of LuaCommandable.unit_group / .group works on the running engine and how often the bypass actually fires.
- New [supremacy] line: cache size, rebuild calls, entries added, damage calls, kills, off-creep skips, and entities skipped because they had no unit_number. Diagnoses "nothing is taking damage" without code dives.
Version: 0.9.2
Date: 2026-04-30
Bugfixes:
- Fixed crash on save-load: "Require can't be used outside of control.lua parsing." Four deferred require() calls inside event handler functions (creatures.lua resolve_destination, vent.lua closest_non_full_for_unit, death.lua collapse_orphans, telemetry.lua flush_recruit) hoisted to the top of their modules. Factorio disallows require() at runtime; only data-load and control-script-parsing phases may call it.
Version: 0.9.1
Date: 2026-04-30
Bugfixes:
- Fixed crash on save-load: "LuaCommandable doesn't contain key group". The attack-group bypass in recruit_around used the wrong property name; in Factorio 2.0 a unit's group is reachable via commandable.unit_group, not commandable.group. Defensive pcall fallback in case future engine builds rename it again.
Version: 0.9.0
Date: 2026-04-30
Major:
- Recruitment throttling: without pollution, biters now arrive as a steady trickle scaling with how many spawners (any force) sit inside the network's recruit-box union. Default 0.05 biters/sec per spawner, pooled across hives + hive nodes + pheromone vents in the network. With pollution, attack-group biters bypass the throttle and are recruited the moment they enter range.
- Pheromone Vent: new buildable. Diverts the network's incoming biter stream and dispatches gathered biters as autonomous attack groups via the engine's unit-group AI. The hive does not target — the engine routes the group. Buildable anywhere, free to place; the placing player must own a hive or the vent collapses on placement. Visually a recoloured Hive Node (deep red).
- Network collapse: when the last hive in a network is destroyed, every other hive-side building in that network (hive nodes, pheromone vents, hive labs, hive storage chests) is destroyed too, and any hive workers in the network die. Storage releases stored creatures as live units before destruction. Player-placed biter/spitter spawners and worm turrets are NOT destroyed — they revert to ordinary vanilla nests/turrets on the enemy force. In-tick repositioning (place new hive, old dies) is preserved by checking the world for surviving hives.
Tech:
- New single-shot tech "Pheromone Vent" (prerequisite Small Worms) unlocks the Pheromone Vent recipe.
- New infinite tech "Attack Group Size" (prerequisite Pheromone Vent) adds +2 biters per dispatched group per level.
Performance:
- Unified per-member scan with work-spread replaces the old separate intervals.recruit (120t) and intervals.absorb (30t) cadences. Each tick processes ceil(N/T) hives + hive nodes on a deterministic rotating cursor (T = intervals.scan = 60), so per-tick scan count is constant relative to network size — no moloch supertick.
- Hive nodes now also absorb biters (route into the chest of the cached nearest hive), shortening unit walks across the network.
- Workers spawn from the nearest hive OR hive node, whichever is closer to the ghost.
- Hive Supremacy now caches its damage candidates per hive, rebuilding the cache every 600t. The 60t damage tick is a cheap walk over the cache; the per-entity surface.get_tile lookup is gone.
- Cached `nearest_hive_unit_number` per hive node (lazy invalidation) drops the per-tick O(N×M) lookup for networks with many nodes.
- Workers.tick() short-circuits when no jobs are pending.
Telemetry:
- script-output/hm-debug.txt now appends two log lines per scan flush (every 60 ticks): a [recruit] line with per-network bucket state (tokens, R, spawners) and aggregate group/trickle/skipped counters, plus a [perf] line with per-system millisecond timings. Both gated on the existing Debug enable.
Known limitations:
- Pheromone Vent mode markers (small / default / large) are deferred to a follow-up. All vents operate in default mode for now; mode still scales with hm-attack-group-size tech.
Version: 0.8.1
Date: 2026-04-30
Bugfixes:
- 0.8.0 failed to load: hm-hive-supremacy tech read shared.science.research_packs (nil); Factorio then required count_formula. Fixed to read shared.supremacy.research_packs.
- tools/check-load.ps1 now propagates Factorio's exit code so failed prototype loads actually break the build pipeline instead of silently shipping a broken zip.
Version: 0.8.0
Date: 2026-04-30
Major:
- New tech "Hive Supremacy" (manual research, prerequisite Hive Labs). While researched, anything standing on hive creep that isn't part of the hive ecosystem withers. Hive force entities and vanilla biters/spitters/spawners/worms are immune. Trees die in ~30s and release their vanilla pollution burst into the world; player buildings and other neutral entities die in ~60s.
Version: 0.7.2
Date: 2026-04-30
Bugfixes:
- Fixed mod failing to load with "Missing sound: __Hive_Mind_Reworked__/legacy/.../creep-01.ogg". The 8 creep walking sounds are now vendored under sound/creep/ and shipped with the release.
- Removed the legacy/hive-mind-2.0-port-reference archive from the repo; it was excluded from the package and only pulled the build into a broken state.
Version: 0.7.1
Date: 2026-04-30
Changes:
- Mod folder renamed to Hive_Mind_Reworked to match the title; locale and asset paths follow.
- Bugfix pass on the worker dispatcher and supporting modules.
- Embedded gleba-spawner / wriggler / biolab graphics + sounds into the mod so the egg-raft hive and wriggler workers render without Space Age installed.
Version: 0.7.0
Date: 2026-04-30
Renamed:
- Mod retitled from "Hive Mind Reloaded" to "Hive Mind Reworked".
- Internal mod portal name changed from "Hive_Mind" to "Hive_Mind_Reworked".
- Hive, Hive Node, Hive Lab, and hive worker visuals now use vendored Gleba/Biolab/wiggler assets even when Space Age is disabled.
Major:
- Replaced the flying construction-bot pipeline with a unit-based worker dispatcher (script/workers.lua). Hive workers are now ground-walking units, not flying robots.
- Worker base is small-wriggler-pentapod when Space Age is loaded; falls back to small-biter otherwise.
- Direct placement now converts the placed entity to a ghost and queues it on the dispatcher so a worker walks out of the nearest hive and materialises it. The hive itself is the only direct-placed building (no workers exist before the first hive lands).
- Hive Nodes also recruit creatures within their own 50×50 box, scaled by the Attraction Reach tech.
- Hive Node placement extends the network by its own reach — a node is buildable wherever its 50×50 box would connect to the existing network.
- Eden creep growth replaced by deterministic Chebyshev ring fill: creep stays inside the hive's axis-aligned box, no fingers, no offshoots.
- New "Reject the Hive" button next to "Join the Hive". Rejection is permanent for the session.
- New infinite Attraction Reach tech (+10% recruitment radius per level).
- New spitter spawner item / proxy / recipe — same mechanics as the biter spawner.
- Vanilla research is hidden on the hive force; only hm-* techs appear in the tree.
- Loadout watchdog ensures every director carries one of every currently-buildable item and pins them to the quickbar.
- Auto-refund-on-place: cursor item refills after every successful placement (cursor first, main inventory fallback).
- Cost.consume pre-checks the network's pollution capacity and only mutates state on success — failed placements never burn biters.
- Insufficient-pollution message now reports actual need vs have side-by-side.
- Placements over trees / rocks / cliffs are refused and any auto-deconstruction order on those obstructions is cancelled.
- Ghosts that cannot be fulfilled (tech, obstruction, charge failure, missing item proto) are destroyed instead of left lingering.
- Hive workers are excluded from creature roles so the absorber can't try to file them as hm-creature-hm-hive-worker (which would crash on_tick).
- Active Pheromones now make hives disgorge stored creatures and send them toward the pheromone carrier; absorption pauses while the lure is active.
Visual:
- Hive renders as a 2× scaled gleba-spawner ("egg raft") tinted orange-red when Space Age is loaded; falls back to a tinted biter-spawner.
- Floating pollution label above each hive shows the network's available pollution, recoloured green / amber / red.
- Clicking a hive routes player.opened to its hidden storage chest so the inventory you care about pops up.
- Reject button + Join button live in a private hm-button-flow under player.gui.top, so destroying the flow leaves no empty mod_gui frame.
- Creep is back to a single royal-purple tile.
- Build cost surfaces in every placeable item's tooltip.
Cleanup:
- shared.ranges.recruit subsumed by ranges.hive / ranges.hive_node.
- hm-construction-robot / Hive.init / Hive.tick_robots / on_robot_built handler removed.
- hive_storage chest still exists internally but the click is transparently routed to it.
Version: 0.6.0
Date: 2026-04-29
Major:
- Rewrote build/cost flow: every hive recipe is now a free cursor stamp, the hive network pays the pollution cost on placement.
- Added network-wide resource pooling: connected hives + nodes share one virtual chest for cost reads/writes and lab supply.
- Hive death now respawns stored creatures as living units on the hive force (R6).
- Spawner and worm proxy ghosts now correctly swap to real entities on enemy force when a hive worker finishes building them.
- Direct placement of hive items is also charged from the network; insufficient funds destroy the entity and refund the cursor item.
- Build cost for arbitrary buildings is derived from recipe ingredients * a per-item pollution factor table.
Visual:
- All hive structures (hive, node, lab, storage chest, proxies) now render as colored variants of the biter spawner.
- Hive workers die with a small-biter corpse instead of vanishing silently.
- Creep is now four shades of purple, placed at random for organic texture.
- Creep growth is now random-ray rather than square-ring; the front advances unevenly.
Content:
- Added Small/Medium/Big/Behemoth Worm recipes, items, ghosts, and tech-gated unlocks.
- Worm techs are researched manually with Pollution Science Pack; spawner and lab unlocks remain event-flagged (place hive / spread creep).
Cleanup:
- Removed the per-recruit-tick debug log file (hm-debug.txt).
- Stripped stale pollution ingredients from hive-tier recipes (player can now actually craft them).
- Hive construction radius reduced to a 100x100 box (50x50 for nodes); recruitment radius unchanged at 1000 tiles.
Version: 0.5.0 Date: 2026-04-28 Renamed the rebooted mod to Hive Mind Reloaded. Rebooted the mod into a clean scaffold. Archived the legacy 2.0 port implementation under legacy/hive-mind-2.0-port-reference.