fix(ui): calculator polish — smart input steps, unified tech/MAT lock idiom, tech floor, speed-lock ceiling fix
- pkg/calc: DriveForSpeed treats restMass==0 as a valid ceiling-only case (every positive drive solves it), so locking the displayed speed of a D=1, W=A=S=C=0 ship is no longer a phantom "infeasible". - ship-design-area: drive/weapons/shields/cargo inputs use a JS-driven smart step on ArrowUp/ArrowDown (0↔1 jump, otherwise ±0.1) and hide the native spinner so it cannot produce invalid (0, 1) values; armament keeps its native step 1. - Tech and planet MAT cells follow the same lock idiom as goal-seek locks: open padlock (🔓) over the inherited value → click to open an input with a closed padlock (🔒). The padlock slot is always reserved, so the column width is stable. - Tech overrides (design area and modernization target) are floored at the player's current tech on this turn — a lower value is flagged as invalid.
This commit is contained in:
@@ -24,8 +24,18 @@ in as a per-ship result rather than a separate mode.
|
||||
|
||||
1. **Ship Class design area** — five blocks (drive, armament, weapons,
|
||||
shields, cargo) and four tech levels (drive, weapons, shields,
|
||||
cargo). Tech defaults to the player's current tech and shows a lock
|
||||
icon once overridden; clicking it resets to the default.
|
||||
cargo). Tech defaults to the player's current tech: the cell renders
|
||||
the inherited number with an open padlock; clicking the open lock
|
||||
activates an input (closed padlock), where the player may type an
|
||||
override at or above their current tech. Clicking the closed
|
||||
padlock resets to the default. The padlock slot is always reserved,
|
||||
so the column width does not shift as the lock state toggles. The
|
||||
four ship-class blocks (drive, weapons, shields, cargo) use a smart
|
||||
keyboard step that respects the engine value rule (`0` or `≥ 1`):
|
||||
ArrowUp from 0 jumps straight to 1, otherwise +0.1; ArrowDown from
|
||||
1 collapses to 0, otherwise −0.1, never producing an invalid value
|
||||
in `(0, 1)`. The native spinner is hidden on these inputs (it would
|
||||
produce invalid intermediates); armament keeps its native step 1.
|
||||
2. **Calculator area** — derived results: empty/loaded mass, empty/
|
||||
loaded speed, attack, defence, bombing (per ship), cargo capacity.
|
||||
A load toggle (empty / full / custom) sets the cargo load (in cargo
|
||||
@@ -35,17 +45,27 @@ in as a per-ship result rather than a separate mode.
|
||||
the load is pinned to empty and the toggle is disabled.
|
||||
3. **Planet area** — when an own planet is selected on the map, shows
|
||||
its MAT (overridable) and the single-turn build rate (ships per turn,
|
||||
turns per ship). The realistic multi-turn forecast with CAP/COL
|
||||
turns per ship). The MAT follows the same lock idiom as the tech
|
||||
cells: the planet number renders with an open padlock, clicking
|
||||
opens an input with a closed padlock, and the closed padlock resets
|
||||
to the planet value. The realistic multi-turn forecast with CAP/COL
|
||||
supply is planned (see ../ROADMAP.md).
|
||||
|
||||
## Locks and goal-seek
|
||||
|
||||
Two distinct lock semantics share one icon (a closed padlock; it only
|
||||
appears once a value is pinned, click to release):
|
||||
Two distinct lock semantics share one padlock affordance. Both follow
|
||||
the same idiom — an open padlock (🔓) means *value is inherited /
|
||||
derived, click to override*; a closed padlock (🔒) means *value is
|
||||
pinned by the player, click to reset*:
|
||||
|
||||
- **Override locks** on inputs that have a default — the four techs and
|
||||
the planet MAT. Editing one overrides the default; the lock resets it.
|
||||
Any number may be overridden at once.
|
||||
the planet MAT. By default the cell shows the inherited number plus
|
||||
an open padlock; clicking it switches to an input plus a closed
|
||||
padlock for typing the override. Closing (clicking the closed
|
||||
padlock) resets to the default. Any number may be overridden at once.
|
||||
Tech overrides are floored at the player's current tech on this
|
||||
turn — a lower value is flagged as invalid. The same floor applies
|
||||
to the modernization target tech.
|
||||
- **Goal-seek locks** on derived results. Pinning a result back-solves
|
||||
the single input it claims, which then renders read-only (computed):
|
||||
|
||||
@@ -60,12 +80,16 @@ appears once a value is pinned, click to release):
|
||||
|
||||
Only **one** result may be locked at a time (the others' lock
|
||||
affordances disable with a tooltip). An unreachable target — e.g. a
|
||||
speed at or above the stripped-hull ceiling `20 × driveTech`, or a
|
||||
speed above the stripped-hull ceiling `20 × driveTech`, or a
|
||||
solved block that fails the value rules — leaves the locked cell in a
|
||||
red error state and does not apply. Inverse solving lives in
|
||||
`pkg/calc/solve.go`; the bisection for defence → shields is the only
|
||||
non-analytic case. Locking a speed is disabled when the drive block is
|
||||
zero (a deliberately immobile ship has no speed to back-solve).
|
||||
zero (a deliberately immobile ship has no speed to back-solve). With
|
||||
the drive block as the only non-zero mass the displayed speed equals
|
||||
the ceiling exactly (every positive drive gives the same speed), so
|
||||
the solver accepts that ceiling target as a feasible lock and any
|
||||
positive drive solves it.
|
||||
|
||||
## Validation and display
|
||||
|
||||
|
||||
Reference in New Issue
Block a user