> /etc/releases

Release Notes

Family entries summarize what shipped. Build tags beneath each family list the individual patches. Permalink anywhere via the #v0-XX or #v0-XX-YY anchor.

v0.81

The protocol select menu is gone

The protocols are not.

Copy Code — diegetic protocol swap

Six pedestals line the south wall of the Quarantine now, one per protocol family, in canonical order: CORE-1, Seeker, Sentinel, Spectre, Swarm, Flux. Every protocol that’s unlocked and not currently running stands on its pedestal as a character. The one you’re piloting is the one that’s missing — out on the field with you.

Walk up to a pedestal, get the prompt: “Copy Code? ✓ ✗”. Confirm, and the swap unfolds in about a second. The target protocol’s code streams from the pedestal toward you. You pop into their shape. Your old self materializes on their pedestal behind you, waiting. The whole thing is animated — a visible code stream flowing pedestal-to-player, a transform burst, then the reverse stream dropping the previous protocol back in place.

The round-trip works exactly as you’d expect. Become Seeker, walk back to CORE-1’s pedestal, confirm again — you’re back to baseline. No menus, no separate selection screen. The roster is the Quarantine.

First launch lands you as CORE-1. No picker. CORE-1’s pedestal starts empty because CORE-1 is you; the first time you swap, the baseline character appears there.

Swarm and Flux don’t have characters yet — their pedestals stand with empty labeled slots. Visible future content. They’ll have characters when they ship.

Idle ambient dialogue

Protocols standing on pedestals aren’t quiet. Sparse, random bubbles pop up from time to time — “I wish I had something to stab.” (Seeker), “Holding position.” (Sentinel), “You can’t see me.” (Spectre), and from CORE-1, when you’re piloting anything else: “I wish I knew where my sibling was.”

The bubbles suppress automatically while any conversation or interaction is active — they won’t interrupt a swap prompt or a chat with the Programmer. Once the interaction closes, the idle timers reset and the characters go quiet for a bit before speaking again.

These are placeholder lines. The state-keyed, run-history-aware versions — reactions to last run, Null taunts, fragment counts — are deferred to v1.6.0 Living Quarantine. What ships now is the substrate: a composable emitter system built so the content depth can layer in later without touching the underlying wiring.

Under the hood

Both pedestal characters and your piloted character now share one source of truth for how a protocol looks — body gradient, core glow, glyph tuning. Previously the visual was authored in two places and could drift; now it can’t. The shared renderer is what makes the pedestal characters look exactly like you do when you run them.

See pm/roadmap/zz_archive/0.81-protocols-as-npcs/ for the full feature tree.

v0.80

Everything got sharper

Visual overhaul — drawn, not sprited

v0.80 pushed the procedural art to its ceiling before any sprite pipeline enters the question. Every entity in the game received a depth pass: shadows, edge bands, body gradients, and identity treatments that make each thing feel like it exists on a surface rather than painted flat on it.

The enemy roster got a full visual archetype framework. Drones have a triangle head that tracks their aim direction. Turrets read as hull-and-fin silhouettes rather than boxes. Heavy units carry horizontal armor-plate seams. Eye-type enemies got a sclera-and-iris layering that makes them legible even when small. Caster variants now have a faint ambient aura. Every entry in the Archive’s Bestiary renders the real in-game archetype instead of a generic circle.

The player character gained an inner glow, a move bob, and the protocol glyph painted on the body face — so CORE-1 reads as the specific protocol it is running. Vector gained vertex shading that makes the triangle read as a floating pyramid with a lit face and a still shadow underneath.

On the NPC side, the Programmer now has a lit terminal tablet docked to its body. The Archivist pulses a rim glow when the player is carrying unprocessed fragments — a visible signal that it has something to do before you have walked over.

Walls and doors got top-edge highlights and bottom-edge shadows. Pickups (powerups, item drops, cycle motes, memory fragment orbs) each have their own procedural 2.5D treatment: outer glow, radial gradient core, idle breathe animations, and drop shadows.

Floor islands are real now

The old way to make a floating platform was to carve holes in the room collision rectangle. It worked well enough, until it did not — walking onto a platform with one pixel of your collision circle over the edge still triggered a fall, because the cutout matched the visual, not the player’s actual body.

Floors are now first-class room entities, the same class of thing as walls. Each floor has real collision that answers the question “is the player grounded here?” The hole hazard asks that question on every overlap tick; as long as you are on a floor, nothing happens. Walk off the edge and the next tick catches it.

The Vector boss arena expanded from three platforms to five. Two full-width edge floors now frame the central fall pit on both sides, so the arena reads correctly — safe ground at the edges, void in the middle.

Deployable audit

The gatling turret is gone. It did not work and the fix was not worth the slot on the roster. The three remaining deployables — drone, repulsor, and sniper — went through a full audit pass.

Enemy fire now actually damages deployables. Previously, projectiles could not reach a deployable even when aimed directly at it; a new collision layer routes enemy shots through the correct damage path. The drone and repulsor are AoE passthrough by design (no hitbox of their own — they affect the area, not a body), but the sniper turret absorbs fire and can be destroyed.

The decoy flare, which is supposed to draw enemy fire away from the player, was not taking any damage from the projectiles it attracted. The routing check that handles projectile impacts was looking in the wrong place for a self-grouped entity. Fixed.

Each deployable has a threat value now, so enemies with threat-aware targeting treat a dropped sniper as a meaningful priority instead of ignoring it.

Visually, each deployable has its own identity treatment. The drone traces a lazy infinity loop above its shadow, rotor blur suggesting lift. The sniper’s crosshair is now state-driven — scan, lock, tighten, fire — each state shifting the aim-line before the shot lands. The repulsor emits orbital flecks and draws visible tethers to any slowed enemy inside its boundary.

Deployable belt

Deployables used to work differently from consumables — you owned a pool of types and all of them were available mid-run. That mismatch is gone. Deployables now use the same belt pattern as consumables: four slots, filled at the loadout screen before the run, picked from during the run.

The loadout screen’s deployable row became four drag-target slots. The Items/Deployables tab split — you browse consumables on one tab, deployables on the other, drag either to their respective belt slots. The filter bar chips now wrap to a second row when there are enough of them, so the panel no longer clips at the right edge.

Radial wheels

The slide-up deployable bag is retired. Both the consumable belt and the deployable belt now have center-screen radial wheels:

  • T opens the deployable wheel. Four wedges, one per belt slot, slot 0 at twelve o’clock and the rest clockwise. Empty slots are visible placeholders, not hidden — position stays stable so muscle memory works.
  • C opens the consumable wheel. Same shape, five wedges, level-locked slots showing their unlock level.
  • Only one wheel is open at a time. Opening one closes the other. ESC closes whichever is active.
  • Right-click any wedge to lock the slot mid-run — lock to a specific item, lock to a category, or leave it free for auto-fill.
  • Slow-mo engages while a wheel is open, same as the old bag overlay.
  • Hotkeys 1–5 still work for fast consumable use. The wheel is the deliberate surface; the hotkeys are the reflex surface. Both are useful.

After the first playtest pass, the wheel ran 30% larger — the original size read well in isolation but was too small to use confidently in motion.

Protocol fixes

Several lingering bugs from the v0.71 protocol rollout closed this milestone:

  • Seeker dash charges — a registry rename left the wrong fallback sorting in place, giving the ability an extra charge. Fixed.
  • Rail Slug trail — the trail’s opacity was constant regardless of how long you held the trigger. Now it ramps with charge.
  • Sentinel cancels on re-press — pressing the ability key again during the placement phase now cancels it, same as Spectre. Previously the re-press was ignored.
  • Level-up picks offered unbuilt protocols — Flux and Swarm appeared in the level-up pool even though neither shipped yet. A new gate field on protocol definitions blocks unbuilt protocols from surfacing.
  • Protocol passives polled for state instead of listening for signals — three protocol passives were actively polling their bindings every tick instead of reacting to events. Converted to signal-based.

Other fixes

  • Practice mode was broken — picking Practice on the deploy screen sent you into a regular dungeon. A signal that routed the confirmation was discarded before it reached the mode selector. Fixed with a dedicated practice-run start path.
  • Hookshot survival across death — if you died mid-tether during the Vector encounter, the hookshot you were trial-equipping survived dungeon teardown and ended up permanently on the next run. The equip now revokes on death. Successful runs keep it.
  • Fresh loadout stat picks defaulted to the same value — opening the loadout for the first time left primary and secondary stat pickers pointing at the same stat, which then blocked the third pick. Defaults now differ.
  • Walking into your own deployable — the player was taking contact damage from their own turret or drone. Fixed.
  • Boss arena blank on first load — the camera was not committed before the first frame rendered on cold boss-room entry. A defensive fix landed; playtest confirmed clean.

What moved out

The numbers pass — XP curve, currency flow, gear sell values, loot rewards — was originally part of this milestone. It moved to v0.99 as a dedicated final-pass milestone before launch. The reason is practical: tuning those numbers is more useful after the intervening milestones have shipped more content to tune against. The design stays; the data waits for a better-grounded moment.

See pm/roadmap/zz_archive/0.80-visual-polish-and-numbers-pass/ for the full feature tree.

v0.79

The Archive is open

The Archivist and The Archive

There is now an NPC standing at the Quarantine pad. The Archivist does not run, does not fight, and does not explain itself beyond what the terminal requires. Approach and interact to open The Archive — a two-tab modal covering everything you have encountered and everything you have learned.

The Bestiary tab catalogs every enemy class you have sighted or eliminated. First encounter, kill count, and MEMORIAL-tier lore entries unlock as you accumulate records. Enemies you have only glimpsed carry partial records; enemies you have killed reveal the full file. Nothing is retroactive — the tracking began the moment this update loaded.

The System Memory tab holds your Memory Fragments. Bring the Archivist a fragment you have never seen before and it lands in the archive as a new record, tagged NEW until you view it. Bring a duplicate and the Archivist decompiles it into Echo currency instead. The ceremony is brief and clinical, as it should be.

Memory Fragments

Memory Fragments drop in combat rooms (low probability, any kill), from boss chests (moderate probability), and from Vector’s boss room in a fixed sequence tied to specific kill indices — mid-sentence, the count, the choice, in that order. The sequential drops are deterministic. They will appear on the same kills across every run. Whether that means anything is a question The Archive may eventually answer.

Echoes

The Echo wallet is live. Your current balance is visible in the HUD between Cycles and Keys. Echoes accumulate now via duplicate fragment decompilation; a spending path is not yet open. Consider this the accumulation phase.

Quarantine Pad Polish

The four corner pads dropped their [ OFFLINE ] labels — the state was self-evident and the labels were noise. The REQ PAD gained a proper pixel-art podium. The SIGNAL CACHE is now a pill-tube with an antenna pillar; the pillar blinks and shimmers when a level-up is available, goes dark when it is not. Two new palette entries (GameTheme.SignalCache, GameTheme.PadPodium) govern both.

Bug Fix — Quarantine Music

Level-up ceremonies were silencing the Quarantine ambient track and not restoring it afterward. The AudioOrchestrator now receives the ceremony-complete signal through Game and calls restore_mode_music on completion. The track comes back.

Enemy Naming Pass

The enemy roster received proper names matching the bestiary lore entries. Class-name placeholders like “mobile_shooter” and “turret_variant” are gone. If you have been modding .tres files by class label, the mapping is in the v0.79 feature notes. The in-engine enemy catalog and the Archive bestiary now refer to the same names.

Late polish (post-playtest)

A pass after archive caught the things you only see by actually using the new surfaces.

  • The Archive and the Requisition Terminal both gained an close button in the top-right and now auto-close when you walk away from the NPC. Either modal also closes on ESC or by clicking the dim area outside the panel — four ways out, none of which leave you stuck.
  • The Requisition Terminal lost its bottom bar; the cycles wallet moved up next to the close button, and the title now renders in the Programmer’s purple identity color so the chrome reads as that NPC’s terminal.
  • Approach prompt bubbles (the Archivist / Programmer / Breach Pad walk-up) were overflowing on multi-line dialogue and pushing the confirm / cancel buttons off-center. Bubbles now autowrap with a hard four-line cap, the confirm and cancel buttons stay centered on the bottom regardless of text length, and the bubble itself is a touch wider to breathe.
  • Quarantine pad labels (ARCHIVE, SIGNAL CACHE, PROGRAMMER, REQ PAD) sit cleanly above their pad rectangles instead of getting clipped by the outline. The Signal Cache pillar lies horizontally now — the antenna points east, into the room.
  • An Archive close path that stack-overflowed the engine (the close handler emitted the same signal it was listening to) was caught and fixed before merge. Filed and resolved in-milestone.

See pm/roadmap/zz_archive/0.79-archivist-bestiary-fragments/ for the full feature tree.

v0.78

One coordinated sweep of every screen you touch before a run — and it all ships together so you never have to relearn the same panel twice

Belt controls

Right-click any belt slot (in the loadout or mid-run with the B-key overlay) to get a small popup: Clear, Swap, or Lock. No more hunting for the right click target.

Locking a slot now means something real. The game has always tracked three states (free, locked to an item category like “Healing only,” or locked to a specific item like “always Frag Grenade”), but the UI only ever showed a binary toggle. A sub-popup on the Lock action finally exposes all three options. Auto-refill follows the same rule: when a locked slot empties, it pulls the first eligible item from your bag.

The in-run belt now matches the loadout belt visually. One row per slot with an inline lock indicator. The old two-row layout is gone.

Stash organization

All three stash panels — gear, charms, consumables — now have a sort/filter bar. Sort by type, rarity, name, or acquisition order. Filter by name substring or chip-select by type. Items group into collapsible rarity bands so a deep inventory stays readable.

Gear lock and sell

Right-click any gear entry in your stash to toggle a lock on it. Locked items refuse the sell action — a toast confirms why. Sell an individual piece with the [$] glyph on its row (payout scales to rarity), or hit “SELL ALL UNLOCKED” at the panel bottom and confirm.

Derived stats

Below the six primary stats on the loadout screen, a toggle reveals the full derived picture: max HP, dodge chance, fire rate, crit chance, lifesteal, thorns, all five resistances, and more — 31 values in total, pulled live from your current build. Worth opening after a gear swap to see what actually changed.

Level badges on locked slots

Gear, charm, and belt slots that haven’t unlocked yet now show a “Lvl N” badge so you know exactly when each one opens up.

Tooltip pass

Hovering a protocol in the level-up ceremony or the loadout picker now shows a full card: stat profile, active and passive descriptions, flavor text. Consumable tooltips match the visual quality of gear and charm tooltips — panel frame, icon, rarity header, and real effect copy (what it does, magnitude, duration, cooldown). Stat tooltips gained a player-facing description line; the eight primary stats each have a short prose entry explaining what they actually affect.

Screenshot button

Press F12 anywhere — title screen, in-run, menus, pause — to save a full-window PNG to user://screenshots/. The screen edges flash a brief green pulse after capture confirms the file landed. Remappable in Settings → Controls under a new “System” group.

Under the hood

The eight primary stats now have first-class data records (display name, description, color). Nothing visible changes yet, but they’re the foundation the HUD tooltip work in v0.89 will build on.

Deployable behavior data migrated from a legacy string-keyed registry to the same typed composition pattern enemies moved to in v0.76. The registry is gone.

The duplicate key-count display on the loadout stats bar is gone — one read, one place.

Fixes

  • CORE-1 dash silent since v0.71 — a registry collision between two protocol files meant the no-dash variant always won on a fresh save. Dash now resolves through the level-effect schedule, which had the correct answer all along but was never consulted.
  • Belt slots 3-5 rejected consumables after leveling up — the slot count cache wasn’t re-syncing when the stat layer changed. Fixed at the stat-changed hook so it stays in sync across every path that can add or remove a slot.
  • Charm replace-confirm dialog invisible — the confirm modal’s _ready was stomping the canvas layer set by the loadout host, pushing it below the panel. Modal now reads the layer from the scene file, hosts override cleanly.
  • Stat picker forced a third pick to swap primary and secondary — disabled items don’t emit selection signals, so the swap branch was unreachable. Both dropdowns now stay enabled; picking the other slot’s value swaps in place.
  • Hole-hazard respawn could place the player outside the room — clamped to room bounds, matching the existing hookshot respawn pattern.
  • Item tooltip stretched the full screen height — the autowrap description label was missing a width constraint. Fixed across all tooltip types.
  • Stash panels stopped scrolling after the sort/filter rebuild — the new grouped-rows widget was missing a ScrollContainer wrapper.

Known issue

Vector’s boss room intermittently renders with no walls, floor, or boss sprite — HUD draws correctly and simulation runs, but the playfield is visually empty. Instrumentation shipped to capture the wall geometry and visibility chain the next time it repros. Awaiting a log capture to pin the cause.

Smoke passes pending

Three windowed verification passes remain open: the belt-slot modal across both hosts, the belt management overhaul end-to-end flows, and the full tooltip parity alpha sweep.

See pm/roadmap/0.78-loadout-ux-pass/ for the full feature tree.

v0.77

Walk up to something

A text box appears. Walk away to dismiss it. That’s the whole interaction model — and v0.77 builds every interactive surface in the game on top of it.

The Programmer

The Quarantine’s first NPC is live. The Programmer is a brand-purple circle parked near the hub’s north corner. Walk into their space and a terminal bubble floats above their body: “Welcome, [protocol]. What can I code up for you?” with Enter Req. Terminal? ✓ ✗. Confirm to open the gear shop; walk back out when you’re done and a goodbye line plays. Walk back in and the full cycle runs again. The Requisition Terminal is now the primary shop — a diegetic object you approach, not a menu option.

Approach-driven interaction everywhere

Everything interactive in the game now uses the same pattern: walk into range → prompt appears over the entity, with ✓ / ✗ options where a choice matters → walk away to decline. No click-to-talk. No button-to-open-dialogue. Walk-away is the cancel verb.

Three surfaces migrated this release:

  • Treasure chests no longer auto-open on contact. Walk up and the prompt appears — “Open chest? ✓” for a standard chest, “Use key? ✓” for a locked one. The key-consume path, the pour ceremony, and the chest rarity tiers are all unchanged; only the trigger changed.
  • The breach pad in the Quarantine hub now prompts before dropping you into the root. The contact trigger it used before is gone.
  • The Programmer (above) is the first NPC to consume the new surface.

Terminal dialogue bubble

All prompts use a new text box styled for NullBound: squared corners, terminal monospace font, and a per-character type-out animation (40 characters per second by default). Pressing confirm or the shoot input while text is revealing completes the reveal instantly; a second press advances to the next beat. The pattern should feel familiar if you’ve played a text-heavy JRPG and it should look like it belongs on a terminal.

Terminal cursor

The OS default cursor is gone. NullBound now ships a narrow brand-cyan triangle with a sharp tip — a paper-airplane silhouette that matches the game’s aesthetic. It swaps to a light-gray variant when hovering over clickable buttons. After the first playtest pass revealed the original cursor was too large, it shipped at half the initial size with anti-aliased edges.

Under the hood

Every regular enemy now perceives threats through a per-entity detection zone rather than a global shared candidate pool. Behavior is unchanged — same threat scoring, same dwell timers, same attack patterns — but each enemy now has a tunable awareness radius and LOS is computed once per entity rather than redundantly inside each behavior. Vector (the T1 boss) retains its room-wide omniscience: it always sees you anywhere in the arena, which is the same behavior as before, now running on the same infrastructure as every other enemy.

The interaction and perception code was also reorganized into self-contained module folders with documented public surfaces — a structural cleanup that makes the system easier to extend as more NPCs ship.

Polish

  • Spectre weapon: the charge rifle now has an unlimited magazine. No reload UI exists for it, and the janky reload state that surfaced during playtesting is gone.

See pm/roadmap/0.77-approach-interaction-system/ for the full feature tree. PR #31.

v0.76.3

CI hotfix + spec cleanup

The release.yml “Build release notes” step still tried to awk product/CHANGELOG.md, which doesn’t exist after the v0.76.2 changelog refactor — every release-build since the refactor failed silently, no GitHub Releases were cut, and the marketing site’s /releases/ page showed v0.76.1 as the latest version. The step now reads product/changelog/ directly, parses YAML frontmatter for the version array, and renders every entry in the v{MAJOR.MINOR} family sorted descending. CORE-1’s spec also got its blockquote tagline aligned with the other five protocols (“Whatever it takes.” instead of the descriptive sentence that previously sat in the slot). No game-side changes.

v0.76.2

Changelog refactor

The single product/CHANGELOG.md file decomposes into a product/changelog/ directory — one markdown file per release, with YAML frontmatter driving sort + display label. Concurrency-safe (no merge conflicts when two branches add notes), file-as-unit matches how releases ship, and mirrors the pm/roadmap/ milestone tree pattern. Authoring contract lives in product/changelog/README.md. The “What this game does” overview moved to OVERVIEW.md as a new ## Systems section. No game-side changes — paired with the website’s build_releases_page.py rewrite to read the directory.

v0.76.1

CI hotfix

release.yml was calling a workflow that doesn’t exist (deploy-marketing-site.yml) instead of the actual website-rebuild workflow (dispatch-website.yml). Surfaced during v0.76 close-out — the wrong filename produced an HTTP 422 from GitHub on every merge to main, silently breaking /release-notes updates on the marketing site since the workflow shipped. No game-side changes.

v0.76

The T1 dungeon is now a complete combat loop from first room to final boss

Phase 1 — Enemy Roster (9 new enemies)

The dungeon has a full cast. Nine enemies across five archetypes join the roster, each with distinct behavior compositions and room placement weights:

  • Mobile Shooter — kites at mid-range, retreats when threatened, holds position while firing.
  • Sniper Turret — stationary, projects a red target-lock beam before firing a high-damage bolt at long range.
  • Melee Rusher — closes on the player and delivers contact damage; the template all rushers share.
  • Gun Rusher — same chase pattern as the melee rusher but opens fire once it reaches its engagement ring.
  • Grenade Rusher — closes fast and lobs grenades once in range; borrows the shared ThrowableConfig layer.
  • Gun Tank — advances to medium range and sustains a high-damage-per-second barrage while repositioning slowly.
  • Daemon — doesn’t attack directly; projects an aura that amplifies the damage of all nearby enemies; max one per room.
  • Shield Tank Elite — elite variant of the gun tank; a frontal shield rotates to face the player, blocking all forward fire; flanking is required to deal damage.
  • Daemon Elite — elite daemon with an upgraded aura and altered stat profile.

All nine enemies use rate-limited aim (aim_turn_rate_rad_per_sec) so they slew toward the player rather than snapping instantly. Enemy fire is now gated on aim-on-target — enemies won’t shoot while still rotating toward you.

Phase 2 — Content Triage

The item roster sharpened. Three deployables were cut (shield bumper, gravity well, speed ramp) — each had design or feel problems that weren’t worth iterating on now. Two consumables were cut (cycle boost was out-of-vision for the run economy; gravity grenade felt like a worse frag grenade). What remains is tighter. Changes to what stayed:

  • Void Spike fixed: now pulls enemies toward the impact point, applies a slow, and shows a visible tether on the target throughout the bleed duration.
  • Repulsor Field redesigned: no longer pushes everything — it now creates an enemy-only slow field, making it a defensive zone rather than a chaos tool.
  • Powerups tuned: pickup duration extended to 5 minutes, stack cap 3 with linear intensity scaling (no diminishing returns). Enemy and elite kills now drop powerup orbs at a meaningful rate. Orbs shrank 50% visually and gained a coin-flip idle animation. HUD shows stack-count badges per powerup slot.

Phase 2 — Treasure Rooms

Standard dungeons can now contain a locked treasure room. A small key (dropped by enemies, found in rooms) opens the door. Inside: a treasure chest with a tiered loot pour scaled to rarity. Chests open with a multi-phase ceremony and a per-tier shimmer shader. Boss rooms spawn a boss chest at arena center after the boss dies.

Phase 3 — T1 Boss: Vector

The first boss is Vector, the Null Guardian. Vector is a large undulating triangle that guards the final room of the T1 dungeon sequence. Its phases escalate:

  • Phase 1: patrols and fires a ring-blast weapon; hookshots to relocate.
  • Phase 2: charging spin telegraph, glitch-slice attack, and increased ring-blast cadence.
  • Phase 3: full aggression — edge distortion shader pulses on the body, all attacks in rotation.

Vector’s arena features a continuous north-to-south fall pit with three floating platforms; crossing the arena requires using the hookshot to traverse. Standing in the pit deals fall damage and teleports you to the nearest platform edge.

The boss health bar appears at the bottom of the play area on boss room entry and fades out after Vector dies. It hides automatically in Practice and Quarantine modes.

Two title cards play on boss room entry: “Null Guardian — Vector” and “Hookshot Unlocked” (if this is the first hookshot encounter).

Phase 4 — Polish

  • Dodge feedback: when the player’s dodge-chance stat avoids a hit, a DODGE popup appears at the player’s position in the GameTheme.CombatFeedback palette color.
  • Spectre improvements: a glowing cyan anchor marker now appears at the Spectre’s dash origin point; the drone slows enemies in its AoE by 50%; charge-shot tunneling through enemies fixed.
  • Respawn polish: CORE-1 now parks at the REC. PAD synchronously on Quarantine entry — no more sliding in from off-screen.
  • Combat color palette unified: crit, dodge, shield absorb, heal, and default damage each have a dedicated GameTheme.CombatFeedback color token.

Mechanics

  • Per-hit crit roll: DamagePayload now carries crit_chance + crit_multiplier authored on the spec; the receiver rolls roll_is_crit() per hit rather than stamping the payload at fire time. Pierce shots produce mixed crit/non-crit outcomes instead of all-or-none.
  • Hookshot airborne state: the player drops the PLAYER_GROUNDED collision layer during hookshot flight, making the player immune to fall hazards while in the air. Other detectors (bullets, walls, trigger zones) are unaffected.
  • Enemy omniscient targeting: EnemyDefinition.omniscient_room_vision allows boss-tier enemies to target players anywhere in the room regardless of line-of-sight.

Late polish (post-playtest)

  • Boss success flow: when Vector dies, the arena dissolves (cover walls + pit + platforms), a boss chest spawns at room center with a BOSS-pour ceremony, and a “Return to Quarantine” pad fades in at the top-left. Walking onto the pad opens a “Signal Restored” run summary with distinct title and subtitle copy from the death menu’s “Null Advances”. The action button reads “Return” on success, “Retreat” on death.
  • Fall ceremony: falling into the boss pit now plays a real beat — character shrinks as if falling, takes damage, then re-materializes at the nearest platform edge via the recreation dissolve shader (faster than the Quarantine recreation; same visual vocabulary). Cooldown semantics tightened: only arms after the player exits the pit, so teleport edge-cases re-trigger immediately.
  • Hookshot + falls: mid-hookshot the player drops PLAYER_GROUNDED and is airborne-immune to falls. If a hookshot ends mid-pit, the fall fires immediately on grounded restoration (no walking-on-pit free pass).
  • Melee rusher swarmer pattern: melee rushers now dart in, hit, and back off ~130px before re-engaging — bee-style swarmers instead of glue-stickers. Multiple rushers desync naturally and take turns engaging.
  • Daemon support pivot: daemons now seek the densest cluster of allies and park within their aura range rather than chasing the player. The aura’s buff/heal effect is unchanged; the positioning is what changed. Solo daemons hold position.
  • Run summary signature items: items unlocked DURING a run (e.g. first-time Hook Shot acquisition) appear in a new “Signature Items” section. Subsequent runs that already own the item show no entry.
  • Z-layer convention codified: GameProperties.ZLayer now centralises render-layer constants (HOLE / FLOOR / ENTITY / PROJECTILE / HOOK_VISUAL / VFX / HUD_OVERLAY). Pure dev-facing — fixed a platform-over-entity layering bug and prevents the next regression of the same shape.

See pm/roadmap/zz_archive/0.76-t1-combat-loop/ for the full feature tree.

v0.75

The Quarantine exists

Every run starts and ends there.

Launch the game, see a trimmed Main Menu (Deploy / Settings / About / Exit), pick from up to three save slots with a long-press delete guard, and land in a walkable hub: four labeled floor pads tucked into the corners (ARCHIVE green / SIGNAL CACHE gold / PROGRAMMER purple / REC. PAD cyan), a breach gap in the north wall with an “ENTER /root” label, and hub-distinct music routed through a new AudioOrchestrator. Walk into the breach, confirm, and the existing dungeon run launches.

Die — and instead of a menu cut, CORE-1 re-assembles on the REC. PAD: a custom dissolve shader resolves the procedurally-drawn player out of noise with a brand-cyan tint, a respawn flash bursts at the player’s position alongside the “Welcome back, [protocol]” card, and input releases once the flash reads so you walk freely while the card finishes on its own timeline. Walk to the SIGNAL CACHE pad and any pending level-up ceremony opens in place; the pad pulses gold when levels are waiting.

Tactical reads: belt and active abilities are locked in non-COMBAT rooms (Quarantine and dungeon safe rooms); pause menu says “Quit to Quarantine” when that’s where you came from.

Internal: QuarantineMode is a clean ModeController plug-in alongside the existing DungeonMode and PracticeMode; GameManager caches _previous_mode_class so the swap-back is mechanical rather than bespoke. Title-card infrastructure (TitleCardConfig Resource + TitleCardManager + TitleCardRegistry) ships as general-purpose foundational infrastructure, driving four v0.75 cards (“The Quarantine”, “T1 Dungeon · Good luck, [protocol]”, “Welcome back, [protocol]”, “Sanctuary”) with a SCREEN_UV glint shader on fade-in, {key} substitution, per-card SFX + music-duck hooks, and a queue/interrupt lifecycle that is pause-aware.

Three CC BY 4.0 music tracks added (Amarent “Just Wondering” as the Quarantine theme, Joseph Sacco “Electronic Crystals”, Fretbound “Electronic Inspirational”). GameTheme restructured: Primary is now Primary.Cyan + Primary.Purple (the two formal identity tiers); Brand class removed.

See pm/roadmap/0.75-quarantine-foundation/ for the full feature tree.

v0.74

Practice mode is now a true sandbox: snapshot-clone your loadout on entry, step on a refresh pad to reset, die and come back — no penalty, no run counter, no timer

Room geometry is right: E/W doors are proportional, shared walls no longer double-thick, door panels block bullets in both open and closed states (two independent pre-existing gaps, both fixed).

Run over? The new Run Summary screen shows what actually happened — cores, rooms, kills, consumables, loot, and cycles — with title and accent color tuned to whether you died, timed out, completed, or quit. Replaces the static “NULL ADVANCES” panel for all four end paths.

Internal: ModeController abstraction splits game-mode orchestration out of GameManager, making v0.75 Quarantine a clean plug-in. Run log event stream (DungeonRunLog + RunLogStore) instruments every run for future server validation and balance data.

v0.73.16

Planning content carried across

Every previously-tracked feature now has its scope, ship criterion, and stories sitting next to it in the new tree — 21 features fleshed out, 87 stories filed under their parent feature, 14 open bugs anchored to the milestone where they were caught. The Jira shim that powered the import is gone. No player-facing changes.

v0.73.15

Back-of-the-house planning

No player-facing changes. The roadmap moves out of Jira and back into the repo as a structured filesystem tree under pm/roadmap/ — one directory per milestone, self-contained, with locked-down YAML frontmatter on every doc so the whole thing is grep-friendly. The road through release is now fully planned: 14 pre-launch milestones (alternating combat and identity tracks), the launch cut, and three post-launch drops (Swarm, Flux, alt distribution). What’s coming next: the Quarantine hub and the title-card system in v0.75, the T1 dungeon content settling pass in v0.76, and the first NPC + diegetic shop in v0.77.

v0.73

Codebase audit and cleanup before alpha

No player-facing changes: signal boundaries tightened, dead code deleted, 370 lines of duplication cut, and the planning surface migrated to Jira. Sets the table for everything that comes next.

v0.73 infra

Devlog reach

Landing page gains a Devlog nav link, release notes auto-link the matching devlog post, and Bluesky now announces new devlog entries alongside the existing Discord channel.

v0.72

Local multiplayer plumbing

Input architecture decoupled from player identity — one ControlScheme per player, rebindable keyboard / mouse button / gamepad button, slot-assignment screen picks schemes + devices for up to four players, and a multi-PlayerCharacter spawn. Camera and HUD stay single-screen centered on P1 this release; split-screen and per-player HUD land in a future milestone.

v0.71

Four alpha protocols, four different feels

CORE-1 scavenges, Sentinel digs in behind armor and a barrier, Seeker slips into stealth on dash, Spectre charges a sniper round and marks targets with a drone. Crits now read on screen — bigger bolder numbers, a bright hit-flash, and screen shake scaled to the hit.

v0.71 infra

NullBound has a home on the internet

One-page landing site at nullbound.signalandecho.com with game overview, key art, and an alpha signup. Push to main and the site redeploys on its own.

v0.70

Stat builds come alive

Agility scales weapon damage and fire rate, Focus amplifies crits and cuts cooldowns, Speed makes you fast and stretches deployables, Luck spikes crit chance and loot rarity. Every stat now matters.

v0.69

Build stacking

Charms, gear, equipped elements, and timed buffs all inject weapon modifiers at the moment of fire — homing rounds, crit boosts, element swaps all compose cleanly. Q cycles your channeled element mid-run.

v0.68

Weapons are built from swappable parts

Any chassis + trigger mechanic + projectile + damage profile + stat-scaling composes into a unique weapon. Bullet feedback bar shows reload, charge, overheat, and cooldown state at a glance.

v0.67

Threat-weighted enemy AI

Enemies target by perceived threat, not “always chase the player.” Decoy flares pull aggro, high-threat turrets draw fire, and zero-threat equals full invisibility. Hazard and consumable polish pass bundled.

v0.66

UI palette unified

Consistent colors across loot, ceremony, HUD, and rarity indicators.

v0.65

Deployables, hazards, and throwables all ship as data

Frag grenades, gravity grenades, void spikes, leech spikes, sniper turret, gatling turret, gravity well, repulsor field, speed ramp, null barrier, shield bumper, repair drone — eight deployables across offense / defense / control.

v0.64

Locked doors and keys

Combat rooms seal on entry, unlock on clear. Keys persist across runs.

v0.63

Consumable belt

Two-slot belt with strict type taxonomy; stash-click fills to cap.

v0.62

Gear & stash UI

Two-step equip flow with rarity-colored borders, type glyphs, and modifier tooltips.

v0.61

Loot drops

Gear and charms drop from enemies with deterministic seeded RNG, rarity-colored pickup orbs, and charms as gear sockets.

v0.60

Deployables get composable behaviors, shared targeting, and entity pooling

v0.59

Consumables ship as data

New items need a .tres, not new code.

v0.58

Status effect polish

Threshold scaling, immunity cooldowns, unified buff/debuff bar.

v0.57

Loadout panel redesign

v0.55

Particle VFX

Hit sparks, death bursts, status shimmers, muzzle flash, arc crackle.

v0.54

Enemy pathfinding

Nav-mesh movement with straight-line fallback.

v0.53

Elemental status effects

Overload, Decay, Arc, and Corrupt trigger on buildup thresholds.

v0.52

Elemental combat

Four elements with a matchup table and receiver-calculates damage resolution.

v0.51

Room and dungeon templates

Data-driven starter content.

v0.49

Spatial room layout

Rooms at real world coordinates, three-dungeon sequence (entry → main → boss), SubViewport rendering, room-locked camera with smooth pan.

v0.47

Signature items

Boss tier unlocks with trial equip on entry, permanent unlock on defeat. Hook Shot ships first.

v0.46

Protocol dashes + unified effect system

Six protocols × three tiers of unique dash behavior. Every stat, capability, and buff now flows through data-driven effect files.

v0.45

Signal Strength leveling 1–50

XP curve, level-up ceremony, gear & charm equip API.

v0.44

Consumable system, powerup rebuild, deployable audit

v0.43

Procedural dungeon generation, minimap with fog of war, inventory & loadout UI, persistence

v0.38–v0.42

Dungeon architecture, player shooting, enemy entities, bullet patterns

v0.31–v0.35

HUD, countdown timer, player stats

v0.001–v0.30

Engine foundation and MVP proof