Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
f3eccaf
Add authored open item catalog
alexjercan Oct 10, 2026
eab555c
Merge remote-tracking branch 'origin/master' into open-item-catalog
alexjercan Oct 10, 2026
d75453d
Adapt arena ammo reserves to authored items
alexjercan Oct 10, 2026
20c96d5
Validate stocked arena against authored item catalog
alexjercan Oct 11, 2026
a2fef32
Resolve the visited-cell rule once on the sector worker
alexjercan Oct 11, 2026
a2f1495
Save a held ship by id, not by its manifest entry
alexjercan Oct 11, 2026
0621b2d
Apply allegiance and lootable inside the spaceship spawn
alexjercan Oct 11, 2026
aeb7ad0
Carry whole spawn configs in sector records
alexjercan Oct 11, 2026
d9c2344
Type sector object ids
alexjercan Oct 11, 2026
0767542
Skip sync_open_world until a world session or config exists
alexjercan Oct 11, 2026
a364eeb
Export live_sectors through the nova_world prelude
alexjercan Oct 11, 2026
c26d804
State what a world save records in the WORLD_SAVE_FORMAT doc
alexjercan Oct 11, 2026
a08a1b7
Fail the save on an unrecorded transient and check saved stock caps
alexjercan Oct 11, 2026
97d3ad7
Open a saved world off the main thread on Load
alexjercan Oct 11, 2026
3ee7479
Type the engine's item roles as ItemRoleType
alexjercan Oct 11, 2026
8a3d74c
Hold the test item fixture to the base item catalog
alexjercan Oct 11, 2026
3b2b837
Lint a generated hull against the loaded item catalog
alexjercan Oct 11, 2026
52661d7
Walk a bundle's dependencies once for items and ship parts
alexjercan Oct 11, 2026
45fcf7f
Add save status as status item in UI
alexjercan Oct 11, 2026
553eb60
Box prepared frozen body payloads
alexjercan Oct 11, 2026
f51d4ae
Adapt world sector example to catalog IDs
alexjercan Oct 11, 2026
d9728ab
Update examples for item catalog IDs
alexjercan Oct 11, 2026
ef9753a
Install spaceship observer in provocation test rig
alexjercan Oct 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,20 @@ does NOT get an entry. Another page that states a different rule is wrong.
- **(breaking)** A scenario object id or a ship section id may not contain
'/', and two sections of one ship may not share an id. Both fail at lint and
at load.
- **(breaking)** Items are content: mods add `Item` entries that ships carry,
trade and jettison. Stock keys are quoted, `{"HullPlate": 8}`; unknown ids
fail at lint and at load.
- **(breaking)** Two mods that define one item id are both refused unless one
depends on the other, which replaces it whole. Base must define the ten
item ids the game uses, each in a fixed category.

### Interface & HUD

- GOTO's predicted path now curves for a coasting or tumbling target, gravity
included. It hides while the target changes course or spin; the guide stays.
- Create names the world, New World by default. Load lists saved worlds, why
one cannot load, and deletes one on confirm. A status line shows the last
save; leaving shows a save overlay with Try again.
- Create names worlds; New World is the default. Load checks saves, reports
refusals, and deletes on confirm. Save notices show progress, success or
failure; `~` hides them. Leaving offers a retry.

### Web & Platform

Expand Down
1 change: 0 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions assets/base/base.bundle.ron
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
// than a thing a scenario names, and the Settings picker reads this
// order, so the shipped default has to stand first in it.
"ui_themes/base.content.ron",
"items/base.content.ron",
"sections/base.content.ron",
"styles/base.content.ron",
"ships/base.content.ron",
Expand Down
92 changes: 92 additions & 0 deletions assets/base/items/base.content.ron
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
[
Item((
id: "HullPlate",
name: "Hull plate",
about: "Structural plating for hull sections.",
category: Repair,
mass_g: 10000,
ask_cr: 40,
bid_cr: 30,
)),
Item((
id: "PdcRound",
name: "PDC round",
about: "Point-defense round. Kinetic and Pierce mounts reload from it.",
category: Ammo,
mass_g: 200,
ask_cr: 4,
bid_cr: 3,
)),
Item((
id: "RailSlug",
name: "Rail slug",
about: "Railgun slug. Railgun mounts reload from it.",
category: Ammo,
mass_g: 20000,
ask_cr: 40,
bid_cr: 30,
)),
Item((
id: "Torpedo",
name: "Torpedo",
about: "Torpedo. Every torpedo bay reloads from it.",
category: Ammo,
mass_g: 150000,
ask_cr: 400,
bid_cr: 300,
)),
Item((
id: "StoneOre",
name: "Stone ore",
about: "Silicate rock, mined from rock asteroids.",
category: Raw,
mass_g: 10000,
ask_cr: 4,
bid_cr: 3,
)),
Item((
id: "IronOre",
name: "Iron ore",
about: "Metal-rich ore, mined from metal asteroids.",
category: Raw,
mass_g: 10000,
ask_cr: 16,
bid_cr: 12,
)),
Item((
id: "WaterIce",
name: "Water ice",
about: "Frozen volatiles, mined from ice asteroids.",
category: Raw,
mass_g: 10000,
ask_cr: 12,
bid_cr: 9,
)),
Item((
id: "CarbonOre",
name: "Carbon ore",
about: "Carbon-rich ore, mined from carbon asteroids.",
category: Raw,
mass_g: 10000,
ask_cr: 8,
bid_cr: 6,
)),
Item((
id: "Rations",
name: "Rations",
about: "Packed crew food. Traders buy and sell it.",
category: Food,
mass_g: 2000,
ask_cr: 8,
bid_cr: 6,
)),
Item((
id: "SalvagedParts",
name: "Salvaged parts",
about: "Reusable ship components. Traders buy and sell them.",
category: Parts,
mass_g: 25000,
ask_cr: 120,
bid_cr: 90,
)),
]
2 changes: 1 addition & 1 deletion assets/base/scenarios/drill_autopilot.content.ron
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
stop_enabled: false,
),
inventory: {
PdcRound: 2000,
"PdcRound": 2000,
},
lootable: false,
credits: 2000,
Expand Down
2 changes: 1 addition & 1 deletion assets/base/scenarios/drill_gunnery.content.ron
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
orbit_enabled: false,
),
inventory: {
PdcRound: 2000,
"PdcRound": 2000,
},
lootable: false,
credits: 2000,
Expand Down
2 changes: 1 addition & 1 deletion assets/base/scenarios/drill_momentum.content.ron
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
lock_enabled: false,
),
inventory: {
PdcRound: 2000,
"PdcRound": 2000,
},
lootable: false,
credits: 2000,
Expand Down
2 changes: 1 addition & 1 deletion assets/base/scenarios/drill_stop.content.ron
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
lock_enabled: false,
),
inventory: {
PdcRound: 2000,
"PdcRound": 2000,
},
lootable: false,
credits: 2000,
Expand Down
4 changes: 2 additions & 2 deletions assets/base/scenarios/menu_duel.content.ron
Original file line number Diff line number Diff line change
Expand Up @@ -528,7 +528,7 @@
),
allegiance: Some(Player),
inventory: {
PdcRound: 2000,
"PdcRound": 2000,
},
lootable: false,
credits: 2000,
Expand Down Expand Up @@ -1198,7 +1198,7 @@
0.0,
),
inventory: {
PdcRound: 2000,
"PdcRound": 2000,
},
lootable: false,
credits: 2000,
Expand Down
8 changes: 4 additions & 4 deletions assets/base/scenarios/open_world.content.ron
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,10 @@
0.0,
),
inventory: {
HullPlate: 12,
PdcRound: 6000,
RailSlug: 20,
Torpedo: 12,
"HullPlate": 12,
"PdcRound": 6000,
"RailSlug": 20,
"Torpedo": 12,
},
lootable: false,
credits: 2000,
Expand Down
2 changes: 1 addition & 1 deletion assets/base/scenarios/tutorial.content.ron
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
rcs_enabled: false,
),
inventory: {
PdcRound: 2000,
"PdcRound": 2000,
},
lootable: false,
credits: 2000,
Expand Down
6 changes: 6 additions & 0 deletions assets/mods/example/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## 1.4.0

- **(breaking)** Add `example_survey_core`, an item this mod defines, and
start the arena's player ship with two. Needs a base game whose items are
content; item ids in ship stock are quoted map keys.

## 1.3.0

- Add `example_freighter_hull`, a `Grammar` under a new id: a hull LINE the
Expand Down
4 changes: 3 additions & 1 deletion assets/mods/example/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,16 @@ binary assets it ships).
longer, blunt-nosed hauler drawing this mod's own plate and no weapons. The
editor's Generate block lists it under HULL LINE beside the base warship and
collapses whichever is picked.
- **A new item** - `example_survey_core` adds a fresh id to the item catalog;
the arena's player ship starts with two of it in its hold.

## Layout

```
example/
example.bundle.ron # manifest: content + resources + meta
example.content.ron # section overlay + new section + arena + menu backdrop
# + hull line
# + hull line + item
textures/
nebula.png # self:// skybox (stacked 1x6 cube faces)
nebula.png.meta # RowCount cube reinterpret sidecar (rides along, not listed)
Expand Down
9 changes: 5 additions & 4 deletions assets/mods/example/example.bundle.ron
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@
//
// What this bundle carries:
// - content: one `*.content.ron` file. It OVERRIDES a base section by id, ADDS
// a new section, ADDS a playable arena scenario, and ADDS a menu-backdrop
// scenario - see the header of example.content.ron for the tour.
// a new section, ADDS a playable arena scenario, ADDS a menu-backdrop
// scenario, and ADDS an item - see the header of example.content.ron for
// the tour.
// - resources: the binary files this mod ships itself (bundle-dir-relative,
// the same base as `content` and `meta.icon`). Content references them with
// `self://<path>`, which resolves against THIS folder - `mods/example/...`
Expand All @@ -32,9 +33,9 @@
],
meta: (
name: "Example Mod",
description: "The copy-me tutorial mod: a section overlay, a new section, a playable arena, mod-shipped art, and a menu backdrop - a little of everything.",
description: "The copy-me tutorial mod: a section overlay, a new section, a playable arena, mod-shipped art, a menu backdrop, and an item - a little of everything.",
author: "Nova Protocol",
version: "1.3.0",
version: "1.4.0",
// base is an implicit dependency and is never declared (see the header
// comment); list only OTHER mods this one depends on. This mod has none.
dependencies: [],
Expand Down
26 changes: 24 additions & 2 deletions assets/mods/example/example.content.ron
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
//
// This bundle loads AFTER base (base first, mods in catalog order), so overlay
// is last-wins by id: an item whose id already exists REPLACES it; a fresh id
// ADDS alongside. This file does four things, in order:
// ADDS alongside. This file does five things, in order:
//
// 1. OVERRIDE a base section - `reinforced_hull_section` (same id -> replace)
// 2. ADD a new section - `example_plated_hull_section` (new id -> add)
Expand All @@ -13,6 +13,8 @@
// win check, and Victory/Defeat Outcomes)
// 4. ADD a menu backdrop - `example_menu` (a `role: Backdrop` scene:
// mods can ship main-menu ambience)
// 5. ADD an item - `example_survey_core` (cargo the arena's
// player ship starts with)
//
// Everything here is pure data - no engine changes. For the field-by-field
// syntax behind it see the wiki: "Author a section", "Author a scenario",
Expand Down Expand Up @@ -370,7 +372,10 @@
],
)),
initial_velocity: (0.0, 0.0, 0.0),
inventory: {},
// Two of the item this mod adds (5 below): it
// weighs, trades and jettisons like a base item.
// Item ids are quoted map keys.
inventory: {"example_survey_core": 2},
lootable: false,
credits: 2_000,
)),
Expand Down Expand Up @@ -829,4 +834,21 @@
),
],
)),
// -- 5. ITEM ---------------------------------------------------------------
// A NEW item id, so it ADDS to the catalog. Any ship stock, canister or
// trade may carry it. Every field is required: `mass_g` above 0 grams, and
// `bid_cr` (what a Sell earns) at most `ask_cr` (what a Buy pays). The ten
// ids the game itself uses - "HullPlate", the ammunition, the ores,
// "Rations" and "SalvagedParts" - belong to base. A mod may replace one
// whole, with its own mass and prices but the same category, because base
// is a dependency of every mod.
Item((
id: "example_survey_core",
name: "Survey core",
about: "A sealed sensor core from the example mod. Traders buy and sell it.",
category: Parts,
mass_g: 5000,
ask_cr: 60,
bid_cr: 45,
)),
]
3 changes: 3 additions & 0 deletions crates/nova_assets/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ wasm-bindgen-futures = "0.4"

[dev-dependencies]
nova_events = { path = "../nova_events" }
# `test_items`: a synthetic base pack must define every role item, or the
# merge refuses it.
nova_gameplay = { path = "../nova_gameplay", features = ["test-support"] }
# The provocation walk spawns real ships through the OnStart action, so it needs
# `test_support` to run the rig out to a LIVE world before firing the next
# event: the dispatcher holds every handler while objects are still landing.
Expand Down
Loading
Loading