Commit graph

4,265 commits

Author SHA1 Message Date
Nibu
c0c8b3bdf0 EmissionTests: launcher row is 38 slots with the element id
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 09:57:46 +00:00
Nibu
60a78c2278 Pin CultLib abd1a92e: element ids on every list element type, tests follow the new wire and write rules
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 09:50:22 +00:00
a5536cf150 Merge pull request 'Opens of suite-honest: honest station descriptions, Arcs bay, measured crates, drag test at play ThrustScale, HUD readout decision in Shared, gated Console capture' (#11) from nibu/opens-econ into master 2026-11-11 07:16:44 +00:00
Nibu
f856021997 Ammunition run: say the real window (heat death ~260 s, not ten minutes) and drop a dead debug line
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 07:16:40 +00:00
Nibu
782aee4ae5 Merge nibu/opens-tests into nibu/opens-econ 2026-11-11 06:35:35 +00:00
Nibu
465ab50666 Arcs player gets a bay; Arcs and Pursuit crates sized from a measured run
The Arcs fighter had no hold, so its Autocannon and Cell Blasters went silent after one magazine: it now fits the one free 2x2 bay. The estimated crate counts are replaced by measured draws (ten minutes of play or death by heat) plus margin, authored for every ammunition-drawing shooter; ScenarioAmmunitionRunTests drives both scenarios and fails if any shooter is stocked below its measured draw.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 06:34:46 +00:00
Nibu
dcd27cb3b0 Station-kind descriptions name only goods a recipe makes or takes
Uranium, Hydrogen (and Bacteria, Fungi, Animal Products) were named by mining, volatiles, agriculture, habitat-support and power descriptions with no recipe behind them. Dropped the claims (smaller than authoring a power chain); batch StationKindDescriptions restates the five kinds in the catalog; test pins the rule.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 05:59:44 +00:00
Nibu
58c4fa10c1 ShipProductTests and ShipModCatalogTests capture Console through ConsoleProbe.Capture so restores cannot interleave
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 05:59:30 +00:00
Nibu
eee5f213bf Ammo label visibility is Weapon.ShowsAmmoReadout: the HUD's three AmmoType.IsSet() decisions move into Shared and are tested
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 05:59:30 +00:00
Nibu
036f75a0d8 CoastingTests: a ship launched below top speed keeps it at the play ThrustScale 0.1 and at 1
Reads only the ship's velocity after the zone steps; reintroducing drag below top speed fails both cases (50 -> 18.39 in 10 s).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 05:58:27 +00:00
6cc6414425 Merge pull request 'Make the suite honest: digest repin, Crossing/MiningCut3 causes, authored cargo for Arcs and Pursuit, ConstantWeapon HUD, station descriptions' (#10) from nibu/suite-honest into master 2026-11-11 05:55:07 +00:00
Nibu
3458f0d7b3 TwoAiDigestIsPinned: repin linux-x64 to 52fbb10d and name the flight-model commits that moved it
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 05:20:46 +00:00
Nibu
663d054b02 Merge nibu/ammo-tail into nibu/suite-honest 2026-11-11 05:15:55 +00:00
Nibu
601ce3cc18 Catalog: mining names Diamond, volatiles names Ammonia (economy author ExtractionKindDescriptions)
Applied through AetherDb: 0 added, 2 changed (station-kind:mining, station-kind:volatiles), 0 removed. economy report fault count unchanged at 126.
GameData/Aetheria.cc sha256 956a1573fa2aa69d7f72861e10dd17d7d3255d114e878da81802869efcfe31e9 (before: 0f81d35d4cec8f57178220f20bca98ffaa6709783349efe3cc28aa64ea1f02b1).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 05:14:40 +00:00
Nibu
ee49f95843 AetherDb economy: Author takes the scratch root; TheTrialCopyIsRemoved audits its own, not the shared temp folder
The test counted aetherdb-economy-* directories in the machine's temp folder, which every parallel test running the command also writes to.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 05:07:47 +00:00
Nibu
85f1a933d4 GetAllChildClasses: the type memo is concurrent
A plain Dictionary written by parallel catalog loads corrupted itself ("Operations that change non-concurrent collections must have exclusive
access") and failed unrelated tests at random, through ValidateStatModifiers.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 05:07:47 +00:00
Nibu
b2a2da9d27 MiningCut3Tests: ChunkInfo's pinned bits are per host class; the Linux bits are the base's own
ChunkInfoIsBitIdenticalToItsValueBeforeTheExtraction never passed on Linux: at c86f28e93 (the commit that added it) it already measures 1039274088 for the second observer where the recording says 1039274086, and base 12dfcef5, the code the recording claims to be taken from, measures the same ...088 on Linux (CultMath 0.4.1 and 0.5.0 alike). The sensor's bearing term (acos, curve) is libm arithmetic, which rounds differently on Windows, where the recording was made. It is a host-class recording read as universal, not a regression: no commit moved it.

The pin is now per host class like the two-AI digest (ruling replays-per-host-class): windows-x64 keeps the original recording, linux-x64 is base 12dfcef5 run on Linux, and the current code equals it. A host with no recording fails and prints its bits. RunStartTests.HostClass is now internal, the one host-class name.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 05:06:09 +00:00
Nibu
0e9b10c3ae Crossing: the crosser is launched at the speed it should cross at, since a hull no longer decays below top speed
845f6c3aa (aetheria-gravity:ruling:no-drag-below-top-speed) removed hull drag below a hull's top speed. The crosser was staged at the Djinni's 50 m/s cap on the premise that drag slowed it to ~25 m/s at the bow line; it now holds 50 m/s and crosses at 2.57 s, 50 m/s relative, 1.1 rad/s, outside the tuned encounter (3.6 s, 25 m/s, 0.56 rad/s) that the Brief, the pass window and CrossingHoldsAcrossTheStartWindow all describe. CrossingConditions and CrossingHoldsAcrossTheStartWindow failed on that stale tuning, not on a defect.

The encounter is restaged to reproduce its tuning under the ruled physics: launched at 25 m/s from 90 m out (probed over speed x start; constant-speed passes are dx / v seconds, 45 m ahead). The pass lands at 3.63 s, 44.7 m, 24.9 m/s relative, 0.56 rad/s. The test's launch-speed assertions now pin the scenario's 25 m/s instead of "most of the cap"; the time, distance, relative-speed and angular-rate windows are unchanged. If drag below top speed returns, the crosser decays and the pass leaves the window.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 05:03:57 +00:00
Nibu
bd3563dee3 Scenarios: the Arcs turret and the Pursuit player carry the crates their guns reload from
Arcs' hostile turret fits two 100-round Light Machine Guns and had no hold, so it fell silent after one magazine; it now fits a bay and carries 30
crates of Ammo (about 8 minutes of both guns firing without pause). Pursuit's authored cargo had no Mines, capping the player at one magazine of six;
it now carries 10 crates (sixty-six mines). ScenarioStage.Cargo admits a commodity name as one unit, so authored cargo can state crates.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 04:44:31 +00:00
Nibu
908712b2ee HUD: a weapon says what its ammunition label shows; a beam reads its reserve alone
ConstantWeapon names an AmmoType but has no magazine (a crate per AmmoInterval straight from the cargo), so the label printed its unfilled
magazine ("1/N"). Weapon.AmmoReadout owns the label's text, HasMagazine says whether there is a magazine to show, and SchematicDisplay reads it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 04:36:56 +00:00
Nibu
ac45a5c836 AetherDb: mining and volatiles descriptions name Diamond and Ammonia; the ExtractionKindDescriptions batch restates them
Every commodity a kind extracts (a recipe with no inputs) is named in that kind's description: checked over the shipped catalog, only these
two kinds broke it. The batch applies in the catalog commit that follows; until then the catalog tests for it fail.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 04:35:18 +00:00
Nibu
1013e2a2e4 Test: the Economy console-never-written probes keep only the calling thread's writes
The two tests capture Console.Out to prove the commands write to the writer they are given. Console is process-global, so in a full-suite run
other tests' diagnostic prints landed in the capture and failed the author dry-run test. ConsoleProbe keeps only writes made on the thread
running the command, and serialises probes so two cannot restore each other's writer.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 04:35:18 +00:00
16bb2e4c8f Merge pull request 'Authored ships carry crates; ballistic guns and mines draw rounds; the munitions chain is sourced' (#9) from nibu/ammo-data into master 2026-11-11 04:26:31 +00:00
Nibu
36a74478b6 Test: a Loadout-built ship is stocked by Materialize's default
Pins the default path the boss and the console fly use: a fed gun leaves the
ship with AmmunitionCrates, a gun that draws nothing leaves none. Removing the
default StockAmmunition call fails the fed case.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 04:26:16 +00:00
Nibu
afa048641f Merge remote-tracking branch 'origin/nibu/ammo-stock-code' into nibu/ammo-data 2026-11-11 03:54:40 +00:00
Nibu
ded74e8b10 Scenario fits are stocked unless the scenario authors their cargo
Materialize takes stockAmmunition (default true: boss, console ship). ScenarioStage
passes false and stocks at the end of staging only the fitted entities whose cargo
the scenario did not author with Cargo, so a scenario that names what a hold
carries gets exactly that. A packed (saved) fit is never stocked.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 03:40:33 +00:00
Nibu
c21fad28f5 Ammunition stock has one owner; a named AmmoType makes a one-round magazine
Loadouts.StockAmmunition is the single owner of crate stocking. The generator
calls it for generated ships and turrets, and Loadouts.Materialize calls it at the
end, which covers every Loadout-built entity: scenario stage.Fit/Preset, the boss
in ZoneGenerator, and the console-built ship. Paths left alone: Unpack of a pack
or save (an entity's cargo is its own and a saved game's cargo is never touched on
load), scenario stage.Cargo (adds on top of the stock), the LoadoutCommit
validation build (discarded). The new-run player ship is stage.Generated and so
already stocked by the generator. A hull with no bay gets no crates and a log line.

InstantWeapon: a weapon that names an AmmoType is magazine-fed with an effective
magazine of max(1, MagazineSize): every round leaves the magazine and the reload
takes a crate. A weapon with no AmmoType and a magazine of 0 or 1 stays free.
HUD shows rounds/reserve for every AmmoType weapon. ConstantWeapon keeps its own
per-interval crate draw.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 03:36:58 +00:00
Nibu
8948b99e59 GameData/Aetheria.cc: Munitions + MunitionsFeed apply (chain sources, Mines, gun ammo)
sha256 0f81d35d4cec8f57178220f20bca98ffaa6709783349efe3cc28aa64ea1f02b1
economy author Munitions MunitionsFeed apply: 14 extraction/processing recipes (Rock, New Metals, Gold, Potassium, Diamond, Water,
Methane, Ammonia, Algae, Oxygen, Steel, Cellulose Pulp, Circuit Board, Actuator), Mines commodity and recipe, Zhestokost depot
stand-ins for mining, volatiles and agriculture. AmmoType=Ammo on Slug Rifle, Long Slug Rifle, Light Machine Gun; AmmoType=Mines on the
Mine Launcher. Stat change: Light Machine Gun MagazineSize 0 -> 100, ReloadTime 1 -> 3 s.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 03:32:54 +00:00
Nibu
54632d4eb9 Tests: pin Mines in the commodity count; the stand-in fixture uses salvage, since Zhestokost now stands in for mining
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 03:32:45 +00:00
Nibu
1f93e22239 AetherDb: MunitionsFeed gives the munitions chain real sources; Mines; every round-firing gun names its round
MunitionsFeed (run after Munitions) authors the chain's leaf recipes: extraction at mining (Rock, New Metals, Gold, Potassium, Diamond)
and volatiles (Water, Methane, Ammonia), Algae at agriculture, Oxygen/Steel/Cellulose Pulp at processing, Circuit Board/Actuator at
fabrication. Munitions adds the Mines commodity and recipe, AmmoType=Ammo on Slug Rifle, Long Slug Rifle and Light Machine Gun, AmmoType=Mines
on the Mine Launcher, a real Light Machine Gun magazine (0 -> 100 rounds, reload 3 s), and Zhestokost depot stand-ins for mining,
volatiles and agriculture so the new recipes' station kinds are placed. Tests read the shipped catalog (pending the blob commit).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 03:19:46 +00:00
1a8ced9ab6 Merge pull request 'Launchers draw real missile rounds; reloads cost a crate' (#8) from nibu/launcher-ammo into master 2026-11-11 03:12:50 +00:00
Nibu
35fa50f256 Generated turrets are stocked with the crates their weapons reload from
GenerateTurretLoadout calls the same StockAmmunition as ships; an ammo-fed turret otherwise went quiet after one magazine.
Test: generated turrets hold exactly the crates for each ammunition type they draw.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 03:12:36 +00:00
Nibu
5ec368c11e GameData/Aetheria.cc: Munitions re-apply (Missiles shape and stack, recipe lore)
economy author Munitions apply; rerun reports 0 changed. sha256 b737d1c74f48c3c0a2e911efd2824345c8491cd8a0c0d3754d78b85d3ea29c40

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 02:55:39 +00:00
Nibu
386f29bf0d Generated ships carry the crates their weapons reload from; Missiles gets a cargo shape; comment and lore fixes
LoadoutGenerator.GenerateShipLoadout, the one owner of NPC and generated-scenario fitting, now stocks AmmunitionCrates (3) of every
distinct AmmoType the ship's weapons draw, after the consumable roll and without touching the random stream; it logs and goes on if
no hold takes them. Missiles is authored with Ammo's 1x1 shape and a stack of 5 (a shapeless commodity cannot be stored at all).
Tests: generated ships hold exactly the crates they draw and none of an ammunition they do not; a magazine weapon with no AmmoType
still reloads free. weapon-ammo moves so RangeFalloff keeps its doc comment; the Munitions comment and lore now match the recipe
(warhead and motor, magazines 2 to 288).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 02:55:39 +00:00
Nibu
fdbf0b6851 GameData/Aetheria.cc: Munitions apply (Missiles commodity and recipe, AmmoType on five launchers)
economy author Munitions apply on the latest origin/master catalog; rerun reports 0 added, 0 changed. sha256 d1c96c6ed8530a4e17246604580eca3a45666b3846d56d557f8869ce7c2cc2b3

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 01:58:59 +00:00
Nibu
8f77000844 Launchers draw real rounds: Missiles commodity and recipe, a reload that pays its crate, a reserve readout
Rulings ballistics-real-ammo and ballistics-cycle-power, follow-up launcher-ammunition. The Munitions batch adds the Missiles
commodity (a high-explosive warhead and a rocket motor at the munitions works; guidance waits on the electronics chain) and sets
AmmoType=Missiles on the five launcher designs; reactor energy per shot stays as authored.

InstantWeapon: the reload used to refill the magazine on its timer and never reach the cargo branch in UseAmmo, so no ammunition-fed
weapon ever paid a round. The refill now takes one unit of AmmoType from cargo (TakeReloadRound) and, with none, the magazine stays
empty; UseAmmo only starts a reload when a unit is there. Weapon.Reserve exposes the cargo count and the HUD shows rounds/reserve for
magazine weapons.

Tests: shipped launchers all name Missiles and Missiles has a recipe; a fed weapon fires its magazine and no more without crates,
reloads once per crate; Reserve equals the cargo count and falls per reload. The commodity count pin goes 22 to 23.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 01:58:59 +00:00
Nibu
9135360beb AetherDb: weapon-ammo lists every weapon's energy, magazine, reload and ammunition type
Read-only audit command, so ammunition rulings are checked against the catalog and not against names.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 01:58:59 +00:00
d5890fd259 Merge pull request 'docs: record the Continue hull-layout gate in the release map' (#7) from nibu/changelog-continue-layout into master 2026-11-10 22:11:59 +00:00
Nibu
b3f3c9a0c8 docs: record the Continue hull-layout gate in the release map
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 22:11:56 +00:00
16e34049e0 Merge pull request 'Continue refuses a run whose equipment no longer fits its hull's edited layout' (#6) from nibu/continue-hull-layout into master 2026-11-10 22:11:46 +00:00
Nibu
c6a3bee879 Continue refuses a run whose equipment no longer fits its hull's edited layout
A mod package edited in place keeps its hull key, so RequireDesigns passed while
saved gear could sit outside the new hardpoints or interior cells and be dropped
on load. RequireLayouts applies the equip rules (HardpointData.TakesAt, interior
cells for tools) to each saved entity and names the changed hulls.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 22:10:49 +00:00
db6bda1655 docs: ship concept batch brief (#5) 2026-11-10 20:54:42 +00:00
c33feebde2 Merge pull request 'Moddable ships: starter command, top-speed fix, Wren stand-in package, thrust-scale test pins' (#1) from nibu/moddable-ships-wiring into master 2026-11-10 18:02:25 +00:00
Nibu
07cfa26d6c Merge master into moddable-ships-wiring
#3 landed the same --top-speed fix this branch already carried; both
conflicting files keep this branch's version (same behavior, stronger test).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 17:51:00 +00:00
9f8452818d Merge pull request 'Retire the Wwise catalog fields (SoundBank, AudioStats, faction music)' (#4) from nibu/remove-wwise-catalog-fields into master 2026-11-10 17:50:48 +00:00
25594f480f Merge pull request 'Save standings by faction, not by list position' (#2) from nibu/saved-relationships-order into master 2026-11-10 17:45:16 +00:00
c965962281 Merge pull request 'ship-authoring stats --top-speed adds the VelocityLimit a bare hull lacks' (#3) from nibu/ship-authoring-top-speed-adds into master 2026-11-10 17:39:09 +00:00
Nibu
d97e2714cd Retire the Wwise catalog fields: SoundBank, AudioStats (AudioStat) and Faction music
Nothing reads or writes them (audio is native Unity plus AquaSynth). Keys 21, 22 and 13 to 15 stay
reserved as never-reuse comments, as with the earlier retirements. The shipped catalog still holds old
values; the reader skips unknown keys.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 05:50:28 +00:00
Nibu
b571555e2a ship-authoring stats --top-speed adds the VelocityLimit a bare hull lacks
create without --like makes a hull with no behaviors, Validate refuses a ship hull without a VelocityLimit, and stats --top-speed refused any hull without exactly one: no command could give such a hull a top speed. The first --top-speed now adds the one limit; two or more are still refused.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 15:00:22 +00:00
Nibu
65a6297aee Save standings by faction, not by list position
RunSave.Capture wrote Factions in HomeZones key order and Relationships in
galaxy.Factions order; Galaxy's save constructor paired them by index, so a
galaxy whose two orders differed resumed with standings on the wrong factions.
SavedGame.Standings (Key 16) now carries each standing with its faction ref.
A save without it still reads Relationships by index, the only record it holds.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 11:55:50 +00:00