- Global: arrows or WASD to move. Everything else is printed on screen. - Tidepool: swim into small green motes and smaller teal cells to grow; avoid big red spiked cells (3 hull hearts, knockback + grace period). - Evolver: 1 2 3 buy fins / eyes / spikes (costs 2/4/6), ENTER to grow on. A rotating 3D wireframe portrait of the creature spins beside the part buttons and reshapes live as parts are bought; left/right arrows (or A/D) spin it manually. - Wanderer: touch tufts and small grazers to hunt (big grazers need spikes); slow down near amber slinkers and press F to sing inside your sight ring to befriend. Meat and bond fill one meter. - Tribe: you are the chief with two follower mates. Bump bushes to gather 14 stores before dark; bump red raiders to fight them off (damage = 1 + spikes). R retries a lost night, R on victory starts a new line.
One-line pitch: grow a lone tidepool cell into a wandering beast and then a food-gathering tribe, spending evolution points on fins, eyes and spikes that visibly reshape your creature and change its stats. INTERESTING TECHNICAL DECISION One sprite, zero clones, everything pen-drawn from lists. All three stages share a single entity table (ex/ey/evx/evy/ek/eok/esz/etm, 16 slots) whose meaning is reinterpreted per stage, and every sim pass lives in a func so it runs without screen refresh — one forever iteration is exactly one frame. Key input throughout is release-edge latched: loop iterations are not wall-clock (faster machines step more ticks per rendered frame), so press-edge repeats would buy parts or fire songs a different number of times per computer. Mates use direct global write-back instead of packed return values after a rewrite showed param-named assignment was too subtle to trust. The evolver's 3D portrait is a parametric mesh built from the part levels: poles + 3 latitude rings x 8 longitudes form the ellipsoid body (26 verts, 32 faces); the tail fin is one double-sided triangle whose span grows with fins; each spike level adds a tetrahedron on the spine (3 side faces, base buried in the body); each eye level adds a stalk segment plus a double-sided diamond ball. One Ry(yaw)*Rx(18°) matrix is composed per frame, then a perspective divide; faces are culled by the sign of the cross-product normal dotted with the eye-to-face vector (positive = back face), the same test as the wireframe-3d renderer. Flat parts carry both windings so exactly one survives the cull from either side. The mesh rebuilds only when a part is bought (cached levels); rotation just re-transforms the same lists, and the evolver runs no sim, so the panel costs one transform of <=59 verts plus <=49 small faces per frame. HONEST LIMITATIONS - The shared bg void backdrop stands in for all three biomes; stages are distinguished by pen-drawn set dressing only (bubbles, grass, nest). - No dash attack and no mouse control; raiders want food, not blood, so the chief has no HP — losing stores is the wound. - The points meter shows two digits (capped at 99); surplus stays spendable. - Tribe mates follow and gather but never fight; the chief does the fighting. - Balance was verified by Python sims of the same math (greedy cell grows in ~24 s, optimal tribe stores 14 in ~6 s of a 90 s night), not by a harness run — the shared VM harness had no installed modules on this machine. - The 3D portrait was verified the same way: a Python mirror of the exact mesh/rotation/cull code passes projection sanity (nose/tail swap sides at 0°/180°, meet on the centre line at 90°), front-kept/back-culled on the equator band, split double-sided pairs for fin + all three eye-balls, and a full 360° sweep over all 64 part combos keeps every point on-stage and inside y 54..135 (clear of the title and points row). The headless harness was unavailable (its /tmp/svm modules are cleared and nothing provides scratch-vm), so no live-VM capture of the evolver screen exists. - banner.png was left untouched: it shows the 2D glyph arc and is still accurate; re-rendering it for the portrait was not cheap enough to bother. All original - code, art and sound. See Inside is open.