Commit graph

4,287 commits

Author SHA1 Message Date
1c47036b7c Merge pull request 'Credits screen: one attribution list, reachable from the main menu' (#16) from nibu/credits-screen into master 2026-11-12 16:27:16 +00:00
Nibu
63403c8441 Credits: ship the Ubuntu Font Licence 1.0 and SIL OFL 1.1 texts beside the fonts
UFL-1.0.txt is the upstream Ubuntu Font Licence 1.0 text (google/fonts ufl/ubuntu/UFL.txt).
Montserrat-OFL-1.1.txt is the OFL 1.1 body, byte-for-byte the text already shipped with
Liberation Sans, headed by the copyright the Montserrat font embeds (Copyright(c) 2014 by
Julieta Ulanovsky) rather than the project's later authors line. The Ubuntu and
Montserrat credits now name these files as their LicenceFile; the test checks each
carries its licence, sits beside its fonts, and (OFL) the embedded holder.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-12 16:20:52 +00:00
Nibu
43be42fb52 Credits: credit the works whose notice is only a source header; test scans headers
Commit 16cb82d09 said every third-party work whose own text states holder and licence
was credited. That was false: header-only notices were missed. Now credited, holder
and licence taken from each file's own text: Academy of Motion Picture Arts and
Sciences (ACES.hlsl, 2015), Unity Technologies 2016 MIT (the built-in shader sources
Particle Standard Unlit, StretchedSkybox, MaskedWorldSpaceUI, MaskedWorldSpaceAdditiveUI
and the three AdditiveUI shaders), Supyrb 2017 (AdditiveUI shaders; the header states
no licence for that portion), and Stefan Gustavson 2011 MIT (Celestial Body
SimplexNoise2.cginc).

The discovery test now also scans every Copyright line in .shader/.hlsl/.cginc/.cs/.compute
under Assets; its holder must appear in a credit notice or in ReviewedHeaders with the
reason. Microsoft Open Technologies (UniRx headers, no licence stated, points at a
License.txt that is not in the repo) is the one reviewed entry. The Unity headers point
at a license.txt that is likewise not in the repo.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-12 16:16:25 +00:00
Nibu
a04c6414e1 Credits test: follow a reviewed font to its SDF asset and fallback tables
Prefabs reference the TMP SDF asset made from a font, not the .ttf, so matching the
font file guid alone could never fail. The unreferenced-font check now follows the
font guid and the guid of every Assets/Fonts file that references a guid already
followed (the font's own SDF asset, any SDF asset listing it as a fallback); a file
outside Assets/Fonts naming any of them is a use.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-12 16:10:24 +00:00
Nibu
1537bc2c52 Credits: credit the Ubuntu and Montserrat fonts from their embedded notices; review unreferenced fonts; stop skipping obj/bin/Library under Assets
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-12 14:37:48 +00:00
Nibu
390b4c7a45 Credits screen: one row per notice line, refuse a missing attribution file, follow the New Game focus handling
ShowCredits renders the selected credit as property rows instead of one multi-line label, refuses with a dialog when
the attribution TextAsset is missing or malformed, takes list rows out of automatic navigation, steps with Up/Down on
the focused Back button and leaves on Cancel. ScenarioPicker's focus hold moves to FocusHold so both screens share it.
The menu wiring test now strips comments before matching.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-12 12:48:52 +00:00
Nibu
16cb82d096 Credits: credit every third-party work whose own text states holder and licence; test discovers all licence-like files
Adds Liberation Sans (OFL), UniRx, KDTree, webgl-noise simplex noise and ambientCG to the list. CreditsTests now
matches LICEN[CS]E, COPYING, NOTICE, README, SOURCES, OFL files under Assets and requires each to be credited or
listed as reviewed-not-credited with a reason; credit notices are checked against what their files state. The
attribution heading is checked rather than skipped, the test states independent expectations, and the split Hurricane
line is joined.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-12 12:43:50 +00:00
Nibu
b367f80e6d Credits screen: one attribution list in Shared, reachable from the main menu
Twemoji, Playdead and the Noun Project icon credits, held against the licence files under Assets by CreditsTests.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-12 09:47:53 +00:00
b1a6fbf880 Merge pull request 'element-ids doc: retired slots held placeholders, why nakovalnya shrank' (#15) from nibu/element-ids-doc-fix into master 2026-11-11 13:44:40 +00:00
Nibu
7f148f08f1 element-ids doc: retired slots held placeholders, and why nakovalnya shrank
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 13:44:38 +00:00
73d36698b0 Merge pull request 'Pin CultLib abd1a92e: element ids on every list element type' (#12) from nibu/cultlib-pin-abd1a92e into master 2026-11-11 13:44:28 +00:00
Nibu
344ef3265c Regenerate the shipped mod ship.cc files off the retired HullData slots; blind element ids only where they are irrelevant
AetherDb ship-authoring regenerate rewrites a package under the current schema and requires it to read back identical. ElementIdUpgradeTests gains content preservation and a shipped-packages-writable check; ShipModCatalogTests compares mod records unblinded where the same packages are composed twice.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 13:10:31 +00:00
Nibu
7675296ec4 Pin CultLib cultlib-unity-v3.0.0 (7225835d) and CultMath cultmath-unity-v0.5.1 (f1edfa45) in the manifest and the headless build
The v3.0.0 plugin GameCult.Caching.dll exports CultElementIdAttribute; caching-unity stays at v2.0.0 (editor tooling, unchanged).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 13:10:31 +00:00
Nibu
6cb7b94551 element-ids doc: the old pin refuses v3, shipped mod packages are not rewritable, Unity cannot compile the attribute yet
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 13:10:31 +00:00
Nibu
9512e35d62 EmissionTests: launcher row is 38 slots with the element id
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 13:10:31 +00:00
Nibu
ff54fe7b46 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 13:10:31 +00:00
2c087bf2b0 Merge pull request 'Scenarios batch-4 minors: gun moves within its own hardpoint; station reactors regain quality spread' (#14) from nibu/scenarios-batch4-minors into master 2026-11-11 13:10:14 +00:00
Nibu
156d7c5a19 Determinism ledger: record why the station-reactor spread moves the two-AI digest
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 13:10:13 +00:00
Nibu
4c6dcfea73 AetherDb station-reactor-spread [apply]: station reactor products regain their sources' quality spread
f458206c7 authored the five per-manufacturer station reactor products with bare
ProductRole entries (the .5 / .15 default). The command copies each source product's
Mean and StandardDeviation per role to a role still at the default, and was applied
to the catalog. TwoAiDigest repinned for the catalog move.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 12:43:37 +00:00
Nibu
b1dae6218e Entity.ItemFits: an equipped item is judged without its own cells, so a gun moves within its hardpoint
The public ItemFits(item, coord) the inventory drag asks counted the dragged equipped
item's own cells as occupied, so a nudge overlapping its current cells was refused.
The private rule now takes the item being moved as an excluded occupant. TryEquip
and TryFindSpace pass none and stay strict, so equipping an equipped item twice is
still refused; the UI keeps TryUnequip then TryEquip (cargo bay emptiness rule).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 12:43:37 +00:00
5e443569c3 Merge pull request 'Shaders use cultmath_snoise from CultMath.hlsl' (#13) from nibu/shaders-use-cultmath-hlsl into master 2026-11-11 12:10:41 +00:00
Nibu
3c78dbcbd1 Fauna map B29: Aetheria pins cultmath-unity-v0.5.0
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 12:10:37 +00:00
Nibu
b6c428d682 Shaders: GalaxyMap, Clouds, SimplexBrush and Lightning.compute call cultmath_snoise
The previous commit deleted the GPU Noise includes; this one carries the call-site
edits it described. Release map notes Background's remaining 2D gradient copy.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 12:08:15 +00:00
Nibu
feb7cf8606 Shaders: GalaxyMap, Clouds, Lightning, SimplexBrush use cultmath_snoise from CultMath.hlsl
CPU snoise (CultMath C#) and the GPU shaders now share one implementation, so
fBm agrees. Deletes the GPU Noise copies nothing includes any more (Classic 2D/3D,
Simplex 3D, SimplexGrad 3D). Background.shader keeps SimplexNoise2D/SimplexNoiseGrad2D:
CultMath has no 2D gradient (cultmath_snoise_grad is float3 -> float4 only).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 11:53:16 +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