player.sim.js Deterministic core, zero imports: camera-relative movement, the
state-machine table, wind slow/gust-shove/knockdown. step(dt,t)
is the whole clock — no Date.now, no Math.random, no rAF — so a
storm fast-forwards identically in selftest and in the game.
player.js The view: rig load per the 90sDJsim DEVMANUAL rig rules
(SkeletonUtils.clone, height-normalise off the MEASURED head
bone, canonicalised bone namespace), clip retarget, and
createPlayer() satisfying the Player contract.
interact.js Hold-E with radial progress + wireYardActions (re-rig 2.5 s,
turnbuckle trim 1.2 s, carry-one-item), duck-typed so it no-ops
cleanly until Lane B lands sailRig.repair/trim.
d.test.js 20 asserts in Lane A's harness: 38 pass / 3 skip overall.
Ported from the 2D prototype's shape (game.js:250-252), retuned to m/s: the
slow curve, and shove gated to gusts only and scaling with speed² so gusts have
teeth. Knockdown needs 0.5 s of SUSTAINED overload — deliberately the same rule
as a sail corner letting go, so cloth and people speak one language.
Two decisions worth the review:
- The knockdown pitches the root in code rather than playing the Falling clip's
root. Shared clips must drop Hips.quaternion (a different-orientation source
lays the target flat), so a clip physically cannot lie the body down. Doing it
in code also lets the fall go DOWNWIND of the gust that caused it, which a
canned clip could never do, and keeps it deterministic.
- Gust magnitude is recovered from a slow EMA of local wind rather than widening
Lane C's contract: wind.sample() gives the total and gustTelegraph() only fires
BEFORE a gust, so nothing reports gust size during the hold. The EMA
self-calibrates to whatever storm JSON Lane C authors.
Verified in a real scene, not only in asserts: head bone 1.715 m at fig scale
0.983, all six clips bound, walk/run at the tuned speeds, the body lies down and
gets back up, hold-E fires exactly once per press.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
35 lines
1.5 KiB
Plaintext
35 lines
1.5 KiB
Plaintext
# SHADES animation wishlist — Mixamo search terms, one per line. (Lane D, for M3)
|
|
#
|
|
# Same pipeline as 90sDJsim's dj_wishlist.txt and the op-shop clerk's wishlist.txt:
|
|
# cd ~/Documents/mixamo-fetch
|
|
# node fetch.cjs login # a real browser opens; John logs in by hand, once
|
|
# cp <this file> ./shades_wishlist.txt
|
|
# node fetch.cjs anims # loops the wishlist, downloads each "Without Skin"
|
|
# then add the new FBX to CLIPS in tools/character/build_player_anims.py and rebuild the pack.
|
|
#
|
|
# NOTE: fetch.cjs needs a MANUAL Google login in a real browser window (its README is explicit that
|
|
# Claude never sees the password), so this list is queued for John to run — not something a lane
|
|
# fetches on its own. Everything M0-M2 needs is already on disk and already in player_anims.glb:
|
|
# Idle / Walk / Run / Falling / CrouchToStand / Reaction.
|
|
#
|
|
# '#' and blank lines ignored. Names are fuzzy search terms (top hit wins); a miss is skipped.
|
|
# In-place clips only — the game translates the player itself, and player.js keeps rotation tracks
|
|
# only, so anything with big root travel is wasted.
|
|
|
|
## --- M3: the repair verbs (PLAN3D §5-D.1) ---
|
|
Climbing Ladder
|
|
Turning Key
|
|
Digging
|
|
|
|
## --- M3: worth having while the browser is open (DESIGN.md "limited hands" toolset) ---
|
|
Hammering
|
|
Sweeping Floor
|
|
Picking Up Object
|
|
Carrying Box
|
|
Standing Up Ready
|
|
|
|
## --- storm reactions (better than reusing Reaction for everything) ---
|
|
Covering Head
|
|
Bracing
|
|
Stumble Backwards
|