diff --git a/GameData/Aetheria.cc b/GameData/Aetheria.cc index e4dc75607..6e35ff70d 100644 --- a/GameData/Aetheria.cc +++ b/GameData/Aetheria.cc @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cfb2c1e79fff9330023de3405ad872e1c46e464b45e7719e86509f148493d85a -size 12682801 +oid sha256:bd5419b1047cca83f1e8fc541507f0ca4fa8e208550ac72dca36cf1e95a74a57 +size 12686723 diff --git a/docs/stats-power-cut7-roles.md b/docs/stats-power-cut7-roles.md new file mode 100644 index 000000000..d40a58b5c --- /dev/null +++ b/docs/stats-power-cut7-roles.md @@ -0,0 +1,202 @@ +# Cut 7 (Roles Authored): Operator Review + +Generated by `dotnet run --project tools/AetherDb -- roles-migrate` (dry run captures this exact table; `apply` +landed it in `GameData/Aetheria.cc`). Regenerate with `roles-migrate` any time the catalog changes — this file is +a snapshot for review, not a second source of truth. + +Role vocabulary is small and shared within a kind: the same handful of part names cover every design of that +kind, not one bespoke name per item. A stat is only pointed at a role when it both carries a `Quality` term and +actually varies with quality (`Min != Max`) — Cut 1's flat placeholder stats (`Min == Max`, a harmless leftover +`Heat^1` term) have no observable role-vs-workmanship difference, so pointing a role at one would be authoring +fiction, not content. + +Product role means below are almost all **generic placeholders** (deterministic per product+role, not hand-tuned) +flagged "needs operator review" — the one exception is Arctica/Alakrita, where `docs/item-provenance-target.md` +already states a brand identity ("optimizing for heat efficiency"). Every other product is waiting on the +operator to decide who is actually good at what; right now they only differ from each other by an arbitrary seed, +not by authored intent. + +## Designs and their roles, by item kind + +### AetherDrive + +| Design | Roles | Stat → role | +|---|---|---| +| Traction | coupling, rotor | `AetherDriveData.MaximumRpm` → rotor · `AetherDriveData.Torque` → rotor · `AetherDriveData.CouplingEfficiency` → coupling · `AetherDriveData.EnergyDraw` → coupling · `AetherDriveData.PassiveCoupling` → coupling | + +**Role meanings:** *rotor* — the spinning core that produces RPM and torque. *coupling* — how efficiently that +output couples into drive and how much bleeds off passively. + +### CargoBay, ControlModule, DockingBay, Hull/Station, Hull/Turret — no roles + +SafeStuff II, Store-All Enterprise Edition, Store-All Plus, Store-All Plus Mini (CargoBay); Cockpit 2x2, Turret +Control Module (ControlModule); Medium Docking Bay (DockingBay); Zenith (Hull/Station); Turret (Hull/Turret). + +**Why:** none of these kinds' behaviours read `StatSource.Quality` at all today (cargo capacity, docking, cockpit +draw and hull cross-section on these particular designs are flat or non-quality stats) — there is no per-part +distinction for a role to express yet. Generic quality stays. Turret's own `ReflectorData.CrossSection` is present +but authored flat (`Heat^1`, no `Quality` term), unlike LonginusX's. + +### Hull/Ship + +| Design | Roles | Stat → role | +|---|---|---| +| LonginusX | plating | `ReflectorData.CrossSection` → plating | + +**Role meaning:** *plating* — the hull's armor/stealth coating, which is what actually governs radar cross-section. + +### Radiator + +| Design | Roles | Stat → role | +|---|---|---| +| Arctica | fins, pump, reservoir | `Emissivity`→fins · `WasteHeat`→fins · `PumpedHeat`→pump · `EnergyUsage`→pump · `ThermalMass`→reservoir | +| cold like my heart | fins, pump, reservoir | same five fields, same roles | +| OK Disperser | fins, pump, reservoir | same five fields, same roles | +| Iapyx | reservoir | `ThermalMass`→reservoir only (Emissivity/PumpedHeat/WasteHeat/EnergyUsage are authored flat, `Heat^1`, no Quality term) | +| Skiron | reservoir | same as Iapyx | + +**Role meanings:** *fins* — the radiating surface (emissivity, waste heat). *pump* — the coolant pump (heat moved, +its own energy cost). *reservoir* — the thermal mass of the coolant loop itself. + +### Reactor + +| Design | Roles | Stat → role | +|---|---|---| +| Core Power | core, regulator | `Efficiency`→core · `OverloadEfficiency`→regulator · `ThrottlingFactor`→regulator (Charge authored flat here) | +| Manhattan | core, regulator | `Charge`→core · `Efficiency`→core · `OverloadEfficiency`→regulator · `ThrottlingFactor`→regulator | +| MoveOnPro | core, regulator | same four | +| Notorious | core, regulator | same four | +| Vulcan | core, regulator | same four | + +**Role meanings:** *core* — the primary reaction chamber (raw charge and efficiency). *regulator* — the safety and +throttling electronics (overload behaviour, throttling). + +MoveOnPro also carries a `StatModifierData.Modifier` (Quality-termed) — left at generic quality: it modifies an +external stat rather than the reactor's own part, so no reactor role fits it. + +### Sensors + +| Design | Roles | Stat → role | +|---|---|---| +| not if i see you first | emitter, receiver | `Sensitivity`→receiver · `PingBoost`,`PingEnergy`,`PingVisibility`,`PingRange`,`PingCooldown`→emitter | +| The Bat | emitter, receiver | `Sensitivity`→receiver · `PingBoost`,`PingVisibility`,`PingRange`,`PingCooldown`→emitter (`PingEnergy` authored flat here) | +| Tractor Beam | *(none)* | dead design (S1, Cut 1 findings): every field is flat, nothing to point | + +**Role meanings:** *receiver* — passive sensitivity. *emitter* — the active ping subsystem (boost, cost, +visibility, range, cooldown). + +### Thruster + +| Design | Roles | Stat → role | +|---|---|---| +| deep space burnout | injector, nozzle | `Thrust`→nozzle · `Visibility`→nozzle · `Heat`→injector (`EnergyUsage` authored flat 0/0, no terms) | +| Large Drive | *(none)* | every field authored flat (`Heat^1`/`Quality^1` but `Min == Max` throughout) | + +**Role meanings:** *nozzle* — exhaust output and plume (thrust, visibility). *injector* — fuel/power feed, whose +byproduct is heat. + +### Tool + +Tool is not a shared kind the way a laser or radiator is — each design is its own bespoke gadget, so roles are +authored per design rather than from one shared field map. + +| Design | Roles | Stat → role | +|---|---|---| +| Industrial Thermostatic Heater | heating element | `EnergyDrawData.EnergyDraw`→heating element · `HeatData.Heat`→heating element | +| PotaT+- | converter, storage cell | `CapacitorData.Capacity`→storage cell · `CapacitorData.Efficiency`→converter | +| Assembly Line, Deep Ore Extractor, Refinery, Shipyard, Surface Ore Extractor | *(none)* | carry no `PerformanceStat` behaviour at all in the current catalog | + +### Weapon/Ballistic + +| Design | Roles | Stat → role | +|---|---|---| +| 6k Shooter | barrel, feed mechanism | `Damage`,`Range`,`Velocity`→barrel · `Heat`,`Visibility`,`Spread`→feed mechanism | +| Earp | barrel, feed mechanism | same shape as 6k Shooter | +| ClearPath | barrel, feed mechanism | `Damage`,`Range`,`Velocity`→barrel · `Cooldown`,`Energy`,`Heat`,`Visibility`,`Spread`→feed mechanism | +| DeathCluster | barrel, feed mechanism | same shape as ClearPath | +| pretty pretty bang bang | barrel, feed mechanism | same shape as ClearPath (charged weapon, same field names) | +| Autocannon | *(none)* | dead design (S1, Cut 1 findings): every field flat | + +**Role meanings:** *barrel* — the part that decides damage, range and muzzle velocity. *feed mechanism* — cycling: +rate of fire, spread, heat and signature it generates, and (where authored) its energy cost. + +### Weapon/Energy + +| Design | Roles | Stat → role | +|---|---|---| +| CShot RainbowLite Lazer | focusing array, power coupling | `Damage`,`Range`→focusing array · `Cooldown`,`Energy`,`Heat`,`Visibility`,`Spread`→power coupling | +| ColdFire | focusing array, power coupling | same shape | +| Spectra | focusing array, power coupling | same shape | +| FastBlast+- | focusing array, power coupling | `Damage`,`Range`,`Velocity`→focusing array · `Cooldown`,`Heat`,`Visibility`,`Spread`→power coupling | +| ChargeBlast SG | focusing array, power coupling | `Damage`,`Range`,`Velocity`→focusing array · `ChargeTime`,`ChargeHeat`,`Cooldown`,`Visibility`,`Spread`→power coupling | +| ChargeBlast+- | focusing array, power coupling | same shape as ChargeBlast SG | +| plight | focusing array, power coupling | `Damage`,`Range`→focusing array · `ChargeTime`,`ChargeEnergy`,`ChargeHeat`,`Cooldown`,`Heat`,`Visibility`→power coupling | + +**Role meanings:** *focusing array* — the beam optics that decide damage, range and velocity. *power coupling* — +everything about how the weapon draws, stores and discharges energy (including charge-up on charged lasers) and +the heat/signature that produces. + +### Weapon/Launcher + +| Design | Roles | Stat → role | +|---|---|---| +| GT 3K | guidance system, thruster, warhead | `Damage`,`DamageSpread`→warhead · `LockSpeed`,`SensorImpact`,`LockAngle`,`DirectionImpact`,`Decay`,`Range`,`Cooldown`,`Energy`,`Heat`,`Visibility`→guidance system · `Thrust`,`MissileVelocity`,`Velocity`→thruster | +| pswarm | guidance system, thruster, warhead | `Damage`,`DamageSpread`→warhead · `Cooldown`,`Range`,`Energy`,`Heat`,`Visibility`→guidance system · `Thrust`,`MissileVelocity`,`Velocity`→thruster | +| scorched void policy | guidance system, thruster, warhead | same shape as pswarm | +| LRMM72, SRMM72 | *(none)* | dumbfire volleys authored fully flat: every field `Heat^1`, nothing varies | + +**Role meanings:** *warhead* — payload (damage, damage spread, penetration). *guidance system* — the seeker +(lock speed/angle, sensor and direction sensitivity, decay, targeting range, cooldown, its own energy/heat/ +signature). *thruster* — the missile's own motor (thrust, flight/missile velocity). + +## Product role quality authored + +37 products exist; 28 got role-quality entries this pass (the rest sell a design that authored no role, or are +one of the two-missile launchers left flat). All means/deviations are **generic placeholders** except Arctica's +`fins`, and every row below needs an operator pass to become real brand identity rather than an arbitrary seed. + +| Product (= design; content pass to split brand vs. design names is separate scope) | Role | Mean | Dev | Basis | +|---|---|---|---|---| +| Arctica | fins | 0.78 | 0.07 | **lore**: Alakrita brands on heat efficiency (`item-provenance-target.md`) | +| Arctica | pump | 0.47 | 0.11 | generic — needs review | +| Arctica | reservoir | 0.53 | 0.14 | generic — needs review | +| cold like my heart | fins, pump, reservoir | 0.54 / 0.74 / 0.73 | 0.17 / 0.17 / 0.09 | generic — needs review | +| OK Disperser | fins, pump, reservoir | 0.61 / 0.57 / 0.59 | 0.14 / 0.10 / 0.18 | generic — needs review | +| Iapyx | reservoir | 0.61 | 0.17 | generic — needs review | +| Skiron | reservoir | 0.64 | 0.16 | generic — needs review | +| Manhattan | core, regulator | 0.48 / 0.63 | 0.08 / 0.12 | generic — needs review | +| MoveOnPro | core, regulator | 0.62 / 0.46 | 0.15 / 0.15 | generic — needs review | +| Notorious | core, regulator | 0.65 / 0.46 | 0.15 / 0.17 | generic — needs review | +| Vulcan | core, regulator | 0.75 / 0.58 | 0.12 / 0.16 | generic — needs review | +| not if i see you first | emitter, receiver | 0.71 / 0.75 | 0.09 / 0.18 | generic — needs review | +| The Bat | emitter, receiver | 0.45 / 0.57 | 0.09 / 0.16 | generic — needs review | +| deep space burnout | injector, nozzle | 0.64 / 0.67 | 0.12 / 0.14 | generic — needs review | +| Traction | coupling, rotor | 0.69 / 0.65 | 0.10 / 0.10 | generic — needs review | +| LonginusX | plating | 0.48 | 0.13 | generic — needs review | +| PotaT+- | converter, storage cell | 0.67 / 0.53 | 0.17 / 0.11 | generic — needs review | +| 6k Shooter | barrel, feed mechanism | 0.59 / 0.46 | 0.14 / 0.14 | generic — needs review | +| ClearPath | barrel, feed mechanism | 0.71 / 0.57 | 0.10 / 0.10 | generic — needs review | +| DeathCluster | barrel, feed mechanism | 0.65 / 0.68 | 0.17 / 0.11 | generic — needs review | +| Earp | barrel, feed mechanism | 0.73 / 0.68 | 0.13 / 0.10 | generic — needs review | +| pretty pretty bang bang | barrel, feed mechanism | 0.51 / 0.63 | 0.10 / 0.09 | generic — needs review | +| CShot RainbowLite Lazer | focusing array, power coupling | 0.71 / 0.54 | 0.16 / 0.11 | generic — needs review | +| ChargeBlast SG | focusing array, power coupling | 0.51 / 0.54 | 0.09 / 0.10 | generic — needs review | +| ChargeBlast+- | focusing array, power coupling | 0.45 / 0.51 | 0.17 / 0.18 | generic — needs review | +| ColdFire | focusing array, power coupling | 0.68 / 0.58 | 0.10 / 0.13 | generic — needs review | +| FastBlast+- | focusing array, power coupling | 0.74 / 0.61 | 0.11 / 0.13 | generic — needs review | +| Spectra | focusing array, power coupling | 0.75 / 0.63 | 0.09 / 0.13 | generic — needs review | +| GT 3K | guidance system, thruster, warhead | 0.69 / 0.63 / 0.58 | 0.15 / 0.17 / 0.16 | generic — needs review | +| scorched void policy | guidance system, thruster, warhead | 0.61 / 0.61 / 0.68 | 0.08 / 0.12 / 0.15 | generic — needs review | + +**Not authored (no product sells the design, so nothing to author):** Core Power, Industrial Thermostatic Heater, +pswarm, plight (all previously flagged "no product sells" in the Cut 1 census; still true here). + +## O7 — what the operator should actually do with this + +Everything above the "generic — needs review" line is mechanically correct (verified: `census`'s new +"(product, role) pairs where a sold, role-bearing design authors no matching spread" check reports 0, and two +products of one design with different means resolve a role-termed stat to different, deterministic values — +`RoleAuthoringTests.TwoProductsOfOneDesignWithDifferentRoleMeansResolveDifferentValues`). What it is *not* is +real market segmentation: every design still has exactly one product, so nothing yet demonstrates "a second +product with a role pumped up." That is next scope, and it needs the operator's judgment on which manufacturer +is good at what — this table is the jumping-off point, not the destination.