2026-09-17 12:31:37 +02:00
|
|
|
# Stats and Power Target
|
|
|
|
|
|
|
|
|
|
Date: 2026-09-17
|
|
|
|
|
|
|
|
|
|
Status: target, design rulings only. No substrate map or cut map yet. This
|
|
|
|
|
document owns the ends; a cut map will own the means. Where it lands in the
|
|
|
|
|
order relative to `docs/headless-playground-cut.md` (lifecycle, fire control)
|
|
|
|
|
is not decided.
|
|
|
|
|
|
|
|
|
|
## Why
|
|
|
|
|
|
|
|
|
|
Two current mechanisms need a better shape:
|
|
|
|
|
|
|
|
|
|
- **Power.** Every draw succeeds and overdraw becomes reactor heat, so players
|
|
|
|
|
cannot prioritize energy use. There is already a hidden priority: behavior
|
|
|
|
|
execution order decides who drains capacitors first.
|
|
|
|
|
- **Stats.** `PerformanceStat` is authored catalog data that also stores runtime
|
|
|
|
|
modifier state per entity. Every read recomputes every factor. `StatModifier`
|
|
|
|
|
snapshots its value once and matches targets by exact type name.
|
|
|
|
|
|
|
|
|
|
## Power (operator direction, 2026-09-17)
|
|
|
|
|
|
|
|
|
|
- **Priority tiers.** Critical is fed first; each following tier divides what is
|
|
|
|
|
left, so low-priority subsystems starve first. Reactor throttling is a player
|
|
|
|
|
choice.
|
|
|
|
|
- **All draw is continuous.** Instant-activation items get an input-only
|
|
|
|
|
capacitor that the bus charges and an activation spends. Operator's words:
|
|
|
|
|
"convert instant activation items into having a sort of input-only capacitor
|
|
|
|
|
that needs to be charged, that way all power draw is continuous". A partial
|
|
|
|
|
grant fills the buffer slower; no item receives a fraction of a shot.
|
|
|
|
|
- **Continuous consumers brown out** through a power supply curve on their
|
|
|
|
|
performance stats. An exponent is enough. Operator's words: "I really want
|
|
|
|
|
performance stats on those continuous consumers to have a power supply curve.
|
|
|
|
|
Just an exponent is plenty, but we don't wanna pay that cost for every stat
|
|
|
|
|
evaluation."
|
|
|
|
|
|
|
|
|
|
## Stats: one stat authority (operator direction, 2026-09-17)
|
|
|
|
|
|
|
|
|
|
- **A stat declares only the terms it uses.** Operator: "PerformanceStat would
|
|
|
|
|
hold only the modifiers it uses." It also unifies with `StatModifier` "for a
|
|
|
|
|
single stat authority".
|
|
|
|
|
- **A term is a source plus an application.**
|
|
|
|
|
- Item-local sources: heat, durability, quality of a named design role, power
|
|
|
|
|
supply, consumable progress.
|
|
|
|
|
- External sources: another item's resolved stat, attached by a modifier.
|
|
|
|
|
- **Applications (ruled: "Scale and constant only" for modifiers).** Declared
|
|
|
|
|
terms apply inside the stat's min/max interpolation as exponents. Modifier
|
|
|
|
|
terms apply only as scale or constant after it. An effect on a condition,
|
|
|
|
|
such as cooling, is expressed by changing that condition.
|
|
|
|
|
- **One resolver per entity owns every stat value.** It recomputes a stat only
|
|
|
|
|
when one of its terms' sources changes, and behaviors read resolved values.
|
|
|
|
|
- **Validation on assignment is the guard.** A stat that decides a power
|
|
|
|
|
request may not depend on power supply, directly or through a modifier chain,
|
|
|
|
|
and no stat may depend on itself. The check runs at catalog load and Studio
|
|
|
|
|
save against what is possible, and when a term attaches at equip time against
|
|
|
|
|
what is on the ship. It fails loudly and names the items and the stat.
|
|
|
|
|
|
|
|
|
|
## Quality can change: item upgrades (operator direction, 2026-09-17)
|
|
|
|
|
|
|
|
|
|
- **Quality is not immutable.** Operator: "don't say never on quality, that'd be
|
|
|
|
|
a footgun when we inevitably add the ability to upgrade items at special
|
|
|
|
|
stations".
|
|
|
|
|
- **Upgrades target a design role.** Example: improving a laser's range by
|
|
|
|
|
upgrading its focusing array. The affordance exists today: `Lot.Roles` holds
|
|
|
|
|
per-role quality, `Lot.QualityForRole` reads it, and a stat names its role.
|
|
|
|
|
The catalog authors no roles yet.
|
2026-09-17 12:35:47 +02:00
|
|
|
- **Authoring roles is required, not optional (operator, 2026-09-17).** Until
|
|
|
|
|
designs carry roles, every item is one-dimensional. Operator's words:
|
|
|
|
|
"authoring roles for the catalog is what creates generative depth in the item
|
|
|
|
|
selection for the game, until then every item is literally one-dimensional,
|
|
|
|
|
it's not optional."
|
|
|
|
|
- Agents generate the role data, and the operator reviews it.
|
|
|
|
|
- The data is written through the catalog's own types (AetherDb or a scratch
|
|
|
|
|
console over `Aetheria.Shared`), never through hand-copied schemas.
|
|
|
|
|
- Validation refuses a stat term that names a role its design lacks.
|
2026-09-17 12:31:37 +02:00
|
|
|
- **Upgrade stations are exploration content.** Finding the station, and perhaps
|
|
|
|
|
a small quest to unlock it, is something to discover in each boss-gated region
|
|
|
|
|
of Terminus.
|
|
|
|
|
- **Consequence for provenance.** Lots are immutable, and units of one lot are
|
|
|
|
|
identical (`docs/item-provenance-target.md`, F4). An upgrade therefore produces a
|
|
|
|
|
new lot whose provenance names the original lot, the station and the inputs,
|
|
|
|
|
and the upgraded item points at it. The resolver treats a change of lot as a
|
|
|
|
|
change to that item's quality terms.
|
2026-09-18 06:26:00 +02:00
|
|
|
|
|
|
|
|
## Negentropy items (operator direction, 2026-09-18)
|
|
|
|
|
|
|
|
|
|
Adrasteian **negent** gear cools below ambient. Untended it is an infinite-DPS exploit:
|
|
|
|
|
heat is what limits sustained fire, so a free heat sink removes the limit.
|
|
|
|
|
|
|
|
|
|
- **It runs on a consumable, and that is the balance.** Operator: "I like the consumable
|
|
|
|
|
option... That would make it expensive to run". The charge is a lot like any other, with a
|
|
|
|
|
maker, a process and a price (`docs/item-provenance-target.md`), so a damage ceiling
|
|
|
|
|
becomes a supply line, priced by the economy rather than by a cap.
|
|
|
|
|
- **Embrittlement needs no new mechanic.** Operator: "embrittlement isn't a joke, either,
|
|
|
|
|
running gear that cold already causes rapid wear". `Entity.cs:1386` already derives `Wear`
|
|
|
|
|
from distance off `OptimalTemperature` (`ItemData.cs:409`) and from `deltaTemp`, so negent
|
|
|
|
|
wears gear twice: off-optimum, and by the speed of the swing. Weapons already spend that
|
|
|
|
|
wear as durability damage (`Behaviors.cs:77`, `InstantWeapon.cs:192`,
|
|
|
|
|
`ConstantWeapon.cs:135`). Do not author a negent-specific wear rule.
|
|
|
|
|
- **Cooling is a change to a condition, not an effect on a stat.** It lowers temperature and
|
|
|
|
|
every stat that names heat responds on its own, the pilot included. That is the rule this
|
|
|
|
|
document already states for conditions; negent is its sharpest case, not an exception.
|
|
|
|
|
- **The pilot stays exposed.** Dying hot is the default failure and the cultural nightmare;
|
|
|
|
|
negent moves a ship toward the other end, where hypothermia is waiting. The safe band
|
|
|
|
|
narrows from both sides and the thing saving the ship is what kills the crew.
|
2026-09-18 06:32:19 +02:00
|
|
|
|
|
|
|
|
- **A weapon is the sharpest case.** An Adrasteian gun whose ammunition is the
|
|
|
|
|
ship's thermal load inverts the whole heat loop: `docs/negent-weapons-concept.md`.
|