Persistent game state. Catalog-addressed state (fingerers_owned,
upgrades_earned, achievements_earned) is keyed by STABLE STRING IDS,
not positional indices, so reordering / inserting / removing entries in
FINGERERS, UPGRADES, or ACHIEVEMENTS never corrupts an old save.
Unknown ids in a save are ignored (forward-compat); missing ids default
to zero / absent (backward-compat).
Screen-anchored particle (raw col/row, not biscuit-fractional). Used for
misclick acknowledgement: a small grey “·” at the exact dead-zone click
point so the player knows the click registered but missed every target.
Position is stored as a fraction of the biscuit rect ([0.0, 1.0] on each
axis), matching GoldenCuque. The renderer resolves these fractions
against the current biscuit rect every frame, so particles travel with
the biscuit when the terminal resizes or the user zooms.
First CLENCH_SQUASH_TICKS of a clench draw the biscuit one row shorter
(top blank dropped, art shifted) so each finger reads as a real squish
before springing back. Strict subset of CLENCH_TICKS.
How long the biscuit stays “clenched” (eye→*, color shifts pink, art
vertically squashes by one row). Bumped from 3 to 6 so a single click is
actually visible — at 20Hz, 3 ticks (~150ms) was hard to perceive.
“You can afford this now!” row flash — fires the moment a fingerer or
upgrade transitions from unaffordable to affordable. Brief on purpose:
short enough that it’s clearly an “announcement,” not the longer
purchase flash that fires on actual buy.
Convert an absolute (col, row) screen point into biscuit-fractional
coordinates, clamped to [0.0, 1.0]. Used at click/spawn sites that come
from screen-space input (mouse clicks, RNG within the biscuit rect).