v0.7.0 - A game you can win or lose
For six releases Nova Protocol was a place to fly, not a game you could finish. There was no win, no loss, no reason a fight had to end - you flew until you got bored or blown up, and blown up just dropped you back at a silent restart. v0.7.0 is the release that gives the flying stakes: scenarios can now declare a victory or a defeat, the base campaign grew a real second chapter that chains off the first, a full four-chapter campaign mod ships on the portal, and the fights themselves got smarter - enemies that take cover, weapons that reload, locks you have to earn. Around that there is a real Settings menu, fine docking thrusters, a world where every sound is now something a mod can author, and a pile of tooling that catches content mistakes before you ever see them. Here is the whole of it, section by section.
Win or lose
A result, with real buttons
The headline is the smallest-sounding change: scenarios can now end. A new
Outcome action throws up a VICTORY or DEFEAT overlay with real buttons
- Continue or Retry, and Main Menu always - instead of the old silent press-Enter-to-restart. Dying in the Shakedown Run now shows Defeat and offers Retry; clearing it shows Victory and chains you straight into chapter two.
The world freezes behind the banner
The part that took the most care is what the overlay does to the world behind it. It freezes the simulation the same way the pause menu does - physics, AI, weapons and scenario timers all stop dead behind the banner - so the world does not quietly play on underneath a screen you are reading. The closing story lines that used to fire behind the victory banner (where nobody could ever read them) now live inside the banner itself.
Pacing the cut
Scenario transitions also grew a middle gear between "hard cut now" and "wait
for a click". A NextScenario that does not linger can carry a delay: the
world keeps playing for those seconds - long enough to read the closing comms
line - before the cut lands. And a Victory or Defeat banner can carry
auto_advance_secs, advancing its queued chain by itself after that many real
seconds if the player does not click first. The content lint warns on the
classic authoring trap of pairing an Outcome with a non-lingering switch in the
same handler, where the overlay gets swallowed before anyone sees it.
The sandboxes join in
The outcome frame is not just for the campaign. The Asteroid Field sandbox now declares Victory when you reach the zone (Continue rerolls the field) and Defeat with a Retry when you die, replacing its old silent scene switches. If a scenario can end, it now ends like it means it.
Broadside, and a campaign that talks back
Chapter two: the capital-combat slice
Broadside is chapter two of the base storyline and the first place the win/lose frame really earns its keep: answer a neutral hauler's distress call, break a two-corvette ambush, then screen a gang gunship's torpedoes with your point-defense and pull it apart. It is the capital-combat slice, it is in the Scenarios picker, and it is chained from Shakedown Run's victory screen, so the base game now plays as a sequence, not a menu of disconnected scenes.
A checkpoint that respects the approach
Broadside now plays as two scenarios under the hood: break the corvette ambush and a Victory beat banks your progress as a checkpoint, then Continue carries you into the gunship fight - which retries itself on death instead of marching you back through the whole approach and ambush. Five invulnerable boulders now anchor the hauler fight and the gunship lane (the destructible rock field stays as chaff), so the new hold-fire-behind-cover rules have something solid to work with in the chapter's biggest fight.
Scenarios can speak
The whole campaign got a storytelling pass at the same time. Scenarios can
now talk: a new StoryMessage action shows speaker-attributed dialog in a HUD
comms panel (OKONO > Strip it clean.). The comms lines queue and display in
arrival order instead of a burst overwriting its own first line, and each fades
in with a soft blip, holds the screen for a readable dwell (authors can set a
per-line hold), and yields gracefully when another line waits.
Objectives that register
Mid-fight objective changes read at a glance now: a newly posted objective flashes gold in the ghost column beside the panel, so a change registers even while you are busy not dying. Leftover ghost lines also vanish with the scenario instead of fading awkwardly over the menu after you leave.
Fights that announce themselves
Every fight now announces itself. Attackers fly in on a readable arrival grace before going hot instead of materializing point-blank - shoot first and the courtesy ends instantly - while ships that already spawn far away keep their ungraced entrance, and the one by-design hot drop (the Ledger finale's Auditor) stays a hot drop on purpose. Opening comms beats are spaced on the scenario clock rather than dumped in one burst. The beat-sheet convention - announce, breathe, arrive - is written down for scenario authors, and the content lint enforces its two hard rules.
The Ledger: a full campaign on the portal
Four chapters, two endings
If Broadside proves the base game can tell a story, The Ledger proves a mod can. It is the first campaign mod on the portal: a four-chapter salvage arc - strip the wreck, break the claim jumpers, run the quiet channel, then pick the buyer, or the buoy - with comms-driven story beats and a two-ending finale, all authored in the RON scenario stack v0.6.0 shipped. Install it from Mods > Explore.
Rebuilt around fair fights
Dogfooding the authoring stack on a real campaign is also what surfaced the balance work, and chapter two got the first full pass. Wave one's Magpies now carry the light mook gun instead of the top-tier turret, burn in down a single ~600u lane instead of materializing point-blank on both flanks, and an invulnerable boulder field between their lane and the Dray Mule gives the new line-of-fire rules something to work with. The chapter plays in two acts across two scenarios: breaking wave one is a checkpoint, so dying to the reinforced heavies - who arrive from the opposite lane, ~950u out, with exactly one big gun between them - retries the heavies, never the whole chapter. The Mule holds station high off the fight plane, out of the stray-fire lanes, and Okono now tells you the play: their guns only want you, so drag the fire wide of her.
The finale got the same treatment. The Auditor traded its top-tier turret for the mook gun on both ending branches - the playtest-decided answer to the balance audit flagging it - because its drama is the close entrance and the torpedo you screen with your PDC, not an instant shred.
Smarter fights
The combat model grew five teeth this cycle.
Enemies take cover
A gunner with an asteroid - or any other tangible body - between its muzzle and you now holds fire instead of hosing the rock, and holds torpedo launches the same way. Its attack orbit keeps it circling, so the pressure resumes once the angle comes back, but breaking line of sight behind hard cover now actually relieves you instead of just soaking bullets. Intangible volumes (beacon rings, trigger zones) still stop nothing, and point-defense fire at inbound torpedoes is exempt on purpose - a torpedo does not get to hide. To give the rule something to bite on, the big fights gained a handful of invulnerable boulders as real cover, with the destructible rock field kept as chaff.
Weapons reload
A magazine that runs dry now refills on its own instead of leaving the weapon dead for the rest of the scenario - PDCs dump and reload to full after a few seconds, the torpedo bay rearms one tube at a time. Because a spent weapon always comes back, magazine size is a fire-pacing beat rather than a hard fail, so finite ammo is on by default everywhere: Broadside and the example arena joined Shakedown Run in dropping the old unlimited-ammo setting, and you manage magazines in every fight in the game (authors keep unlimited ammo as a testing tool). The diegetic ammo gauge shows the reload as it happens: the pips above your live rounds fill back up as a sweep in a dimmer shade of the loaded round's color, so you can read at a glance how close a weapon is to firing again.
Locks are earned
Locking is no longer instant. Once the radar settles on a target you hold it under your aim through a short lock-on dwell before it commits, and the dwell is longer the farther the target is. Sweep off before it fills and the acquisition cancels; re-designating to a new target earns a fresh dwell while the old lock holds. A lock is now something you keep the target under your aim to earn, not something granted the instant you point at it.
More than one barrel
A turret mount now fires and aims every muzzle it has, so a twin-barrel PDC throws two streams at once, each at its own fire rate, all sharing the turret's one magazine - so a twin barrel empties it twice as fast.
Reading the damage you deal
Enemy ships now show battle damage too: knock out one of a hostile's sections and it reads burnt-black, so you can see at a glance which of its components you have already destroyed and which are still a threat. Unlike your own ship - which reddens and darkens gradually as each section wears down - enemies only show the black endpoint, staying pristine until a section is actually gone, so the enemy hull reads as a checklist, not a health bar.
Docking on the fine thrusters
Hold SHIFT and trim
New this cycle: a reaction-control system for the close-in work autopilot and main-drive burns are too coarse for. Hold SHIFT and steer with the mouse (lateral and fore/aft) and the scroll wheel (up and down) to nudge the ship along its own axes under a gentle speed cap, with no rotation - the helm and camera hold still while you translate, the velocity sphere turns violet, and a soft burn loop tells you it is live.
A trim, not free thrust
Each axis caps around 2 u/s, so RCS is for easing the last few meters of an
approach, not for flying. It is a controller verb granted per ship, and the
mainline campaign flies with it withheld (the [SHIFT] RCS hint only shows when
a scenario grants it), so it stays out of the way until a scenario that wants
docking opts a ship in.
The autopilot flies them too
The autopilot uses the same thrusters under the hood: GOTO and STOP now settle their arrival on RCS, braking with the fine jets in the last stretch once the desired velocity is near zero, so a ship eases to a stop instead of pulsing on the spot - the same soft burn loop playing while it does.
A real Settings menu
Audio, graphics and a keybind reference
The Settings menu is real content now instead of a placeholder. It carries a draggable master audio volume slider, a Low / Medium / High graphics-quality preset, and a read-only reference of the current keyboard and gamepad bindings (flight, targeting, camera, pause). It is reachable from both the main menu and the pause menu - the same modal, both doors - and it is remembered across restarts, as a config file on native and browser storage on the web.
What the preset actually does
The graphics preset is not just cosmetic. High keeps the full combat juice (camera shake, hit flashes); Medium drops the shake; Low turns the juice off entirely and also gates the heavier visuals for weak machines - it is spawn-less (no particle bursts) and renders the world at a reduced internal resolution that upscales to the window. That last lever is aimed squarely at fill-bound hardware (laptop iGPUs, phones); the HUD and menus stay crisp and fully clickable, and on a strong discrete GPU the win is small - it is a knob for the low end, not a general speed-up.
A ship sounds like itself
The quietest big change this release: every world sound is now content-owned. A sound plays because something you can author declares it, which means a modded ship no longer borrows the stock game's voice.
Every world sound has an author
Weapon and controller sections now fully own their sounds as authorable asset
refs, the same way they own their meshes: the turret's fire_sound and
dry_fire_sound, the torpedo bay's launch_sound and detonation_sound, the
controller's radar and lock ticks (lock_on_sound, lock_off_sound,
radar_deny_sound, radar_retarget_sound, safety_on_sound), the thruster's
engine hum (loop_sound - thrusters sharing a sound share one loop, so two
mods' ships can hum differently side by side), and the salvage crate's
pickup_sound. A section that authors no sound is silent; the base sections
author all of them, so the stock game sounds exactly the same. The base game's
world sounds ship with the base mod under assets/base/sounds/, while UI sounds
(menu clicks, objective chimes) stay engine chrome. More section sounds are on
the way.
Per-target impact and destruction
Every damage target can now declare its own hit and death voice: impact_sound
and destroy_sound live on any section's base block and on asteroids.
Per-target means per-material - a rock, a light hull and a reinforced hull
can each sound different when your rounds connect, so your ears learn what you
are hitting before your eyes confirm it.
Turrets, art and time: the modding surface
The authoring stack grew in three big ways this cycle, each a format change worth reading if you write mods - plus a stack of smaller authoring wins.
Turret mounts are a joint tree
A Turret section now describes its gun as a root joint with recursive
children - each joint an offset, an optional hinge axis the aim solver steers,
an optional render mesh, and an optional muzzle fire point - instead of the old
fixed yaw/pitch/barrel fields. A mount can have extra hinges, a rotator chain,
or elevation several joints down, and the aim solver distributes the lead across
whatever hinges a muzzle hangs below, so novel mounts track without bespoke
code. The stock turrets aim and fire exactly as before.
Mods ship their own art and sounds
A bundle manifest gains a resources list of the binary files it packages
(textures, skyboxes, models, audio), and content references them with a
self:// path that resolves against the mod's own folder. Cross-mod and
base-game references got one canonical form too: self:// for your own folder,
dep://<id>/ for a declared dependency's file, and dep://base/ for a
base-game asset. The base game itself became a normal self-contained mod - its
art moved under assets/base/ and is referenced like any dependency. List a wav
in resources and a turret's fire, a hull's impact voice, a thruster's hum are
yours to ship.
Scenarios can tell time
The engine now maintains a reserved scenario_elapsed variable - seconds of
live, unpaused scenario time, frozen by pause and reset by retry - readable from
any expression filter, so authors can write timed story beats, breathers and
late reinforcement waves with the existing gate vocabulary. The example mod
ships a timed comms nudge and a timed bonus spawn as the copy-me pattern, and
writing the reserved clock is a content-lint error.
Menu backdrops and the New Game hook
Scenarios gained a menu_backdrop flag: on every menu entry the game picks one
flagged scenario at random, so mods can ship their own menu ambience scenes -
the base backdrop is just the first of them. The New Game start also moved from
code into the base bundle's new_game_scenario declaration; it is honored only
from the base game, so a mod cannot silently redirect your New Game button.
Smaller authoring wins
- Ships in scenario RON can author their side: an optional
allegiancefield (Some(Neutral)for bystanders like Broadside's hauler) overrides the controller default. - The two 5-second event windows are now author-tunable per ship:
orbit_hold_secssets how long a ship holds its orbit beforeOnOrbitfires and re-fires, andlock_refire_secssets how often a held travel or combat lock re-fires. Both default to the old 5 seconds when omitted, and a non-positive value is a content-lint error.
Breaking - migrating your mods
Three format breaks this release. Turret sections must
move their yaw_speed / *_offset /
render_mesh_* / fire_rate fields into the new joint
tree (fire_rate is now per-muzzle; muzzle_speed
stays section-wide) - the dev wiki's section-authoring guide has the new
shape. Asset paths now always carry a scheme: a bare,
scheme-less path is an error, so reuse of base art must be written
dep://base/<path>. And scenario_elapsed is
now a reserved variable - a mod that used that name for its own variable must
rename it. Existing stock turret content is migrated for you; the content lint
flags each of these at build time.
Tooling that catches your mistakes
Building two campaigns worth of content surfaced whole classes of authoring slip, and the checks got much stricter for it.
One content CLI
The content tools are one CLI now: cargo run -p nova_authoring --bin content -- <gen|lint|audit> replaces the three former separate binaries - gen writes the
base content, lint runs the reference and geometry checks, audit grades
combat balance. One tool to remember instead of three, and mod developers can
check just their own mod with lint --target <mod> instead of linting the whole
repo.
Geometry checks
The lint now errors on ships whose unit-cube sections overlap, and on a turret or torpedo bay whose base face does not seat against an occupied neighbor cell of its own ship - at build time and in the in-game mod gate alike. These are the exact bugs behind the Auditor's embedded torpedo bay and the Rust Tally's four wrong-rolled side mounts (both fixed this release - see Fixes). Turret joint trees get their own checks for the mistakes the parser accepts but the game cannot use: a hinge with a zero axis or non-positive speed, min/max limits the wrong way round, or a mount with no muzzle at all.
The balance audit
content -- audit derives each combat scenario's fairness sheet from the
shipped content - hostile dps, weapon envelopes, spawn distances, time-to-kill
against the player ship, cover tiers - and fails CI when an armed hostile opens
a scenario already inside its own effective range of the player spawn. It earned
its keep on the first run by flagging the Ledger finale's Auditor on both ending
branches. Intended drama can be acknowledged in balance_acks.ron with a
reason and the deciding task: an acked warning still prints (tagged ACK) but
stops counting, errors can never be acked, and a stale ack fails CI until it is
pruned. The Auditor's torpedo-envelope warning is the first acked entry.
Broken content fails loud
Scenarios with reference errors - unknown section prototypes, dangling chapter chains, filters targeting things nothing spawns - refuse to start with a FAILED TO START report naming each problem, and the menu backdrop rotation skips them rather than crashing. A broken mod tells you what is wrong instead of behaving mysteriously.
Odds and ends
Two new menu backdrops
Two new scenes join the rotation behind the menus: Waystation Traffic, a
hauler convoy circling a freight stop under amber dock lights, and Scrapyard
Drift, a quiet salvage yard of drifting crates, two wrecks and a lone tug.
Mods can ship their own, too - any scenario flagged menu_backdrop is eligible,
and the game picks one at random on each menu entry.
One example mod
The earlier scattered demos folded into a single copy-me tutorial: a section
overlay, a brand-new section, a playable arena, its own shipped skybox and
texture, a comms beat, Victory/Defeat outcomes, a timed scenario_elapsed
pattern and a menu backdrop - a little of everything, in one folder.
Retry from the pause menu
The pause menu (Esc) gained a Retry button: restart the current scenario from scratch without going back through the main menu. It is offered only while a scenario is live, so the editor's build mode does not show it.
F12 for the devlog
Debug builds (--features debug) bind F12 to a screenshot: the primary
window saves to your Downloads directory as <timestamp>.png.
Fixes
The Rust Tally learns to broadside
The gunship's side mounts now actually mount: both flank turrets and both torpedo tubes roll so their bases seat against the spine instead of all pointing the same way off into space, tube hatches face outboard, and the port and starboard section ids match the sides they are on (they were swapped). The roll also reshapes its firing arcs the way a broadside gunship should fight: one gun per beam, both on the bow, and the previously blind stern covered.
The Auditor's bay comes out of the hull
The Ledger finale's Auditor no longer carries its torpedo bay inside its own hull: the bay was authored half-embedded in the spine, visibly clipping through the controller and bow sections, and now mounts flush on the bow's flank, seated base-to-hull. The new geometry lint catches this whole class of slip at build time now.
Skyboxes stop crashing WebGL2-class GPUs
Cubemap .meta sidecars are now honored for every asset - base and mod alike,
shipped or portal-downloaded - so a skybox gets its 6-face cube layout at load
time instead of risking the raw 4096x24576 stacked image being uploaded as-is
(a fatal error on GPUs with a 16384 texture limit) if a scenario tore down
mid-load. This covers Broadside's deep-field sky, the gauntlet and ledger mods
that reuse it via dep://base, and any mod that ships its own cube.
No more ghost hulls
A ship that loses its last section outside the damage path no longer lingers as a targetable 0-HP ghost: the health aggregate carries a structural death backstop (no living sections means dead), closing a soft-lock where Broadside's act gates waited on a kill that never registered.
Paused means paused
Scenario OnUpdate handlers now freeze while the game is paused - the pause
menu or the Victory/Defeat frame - so an already-satisfied handler no longer
re-applies its action every frame behind a screen you are reading.
Retry keeps your objectives
Restarting a scenario (Retry, from the pause menu or the outcome frame) no longer loses the objective text: the objectives HUD resets on scenario teardown, so a restart that re-posts the same objectives repaints the panel instead of leaving it blank.
Quieter guns
Firing no longer spams the log with a physics warning per round: turret bullets, which use a near-zero mass and a sensor collider, now carry an explicit angular inertia, removing the warning and its NaN risk.
Under the hood
One clock for the event windows
The two 5-second scenario-event windows - the orbit-hold check behind OnOrbit
and the lock re-fire behind OnTravelLock/OnCombatLock - now measure their
elapsed time against the engine scenario clock (scenario_elapsed) instead of
each accumulating its own frame delta. Pause, teardown and retry freeze and
reset both windows in one place, so their pause-correctness no longer rides an
implicit assumption. No change to when the events fire.
Removed: the Demo Scenario
The base Demo Scenario - the old ship-less RON authoring demo - was removed from the game and the Scenarios picker. The example mod's arena is the worked hand-authored RON example now, and it demonstrates strictly more: outcomes, comms, timed beats, shipped art and a menu backdrop.