hedgepets

Motion

Every transition in HedgePets goes through scripts/anim/motion.gd (Motion). Nothing pops, snaps or fights.

What How
a pet arrives / leaves appear (scale in with overshoot) / walks out through the gap, then vanish
regraft (✂️, 🍃/F) a burst of the old leaves, shed_leaves, swap (squash, change, spring back), grow_leaves
viewer ‹ › HedgePetNode.become: the same as a regraft, then the camera springs to the new framing
detail level (LOD) each leaf scales to its stalk over a soft band in leaf.gdshader; set_detail tweens the level
plant grows a stage the new stage scales up from the old one’s size while the old shrinks away underneath
seedbed, gift, emote appear; gifts drop with a bounce, then bob; collected gifts and emotes float_away
yank / haul (garden_grab.gd) lean and shake with strain, a hop on breaking free, spring-follow when hauling (stiffness by weight), drop with a bounce, an elastic settle if you let go too soon, tweened into the wheelbarrow
moods (asleep, curious, shaking) each a 0..1 value eased every frame: eyes close, breaths slow, head droops; the head tilts; a shiver that dies away
a surprise flower appear, slow
strain ring fade in/out, the fill eased with approach
camera (garden orbit, viewer) Motion.spring on yaw / tilt / distance: eases in and out, tight under a finger, unhurried on big turns, a glide after a fling
toast the old one fades, the new one slides in, holds, fades
tools, seeds opacity and scale ease to the selection
seed bar, journal slide_in / fade
coins count rolls the number, pulse taps it

Rules for new code: never set a visible property in one jump (visible, scale, position, modulate, a shader value) when the player can see it. Use a Motion verb, or add one here.

Check

godot --headless --path . --script tools/motion_check.gd --fixed-fps 60

The check drives every transition above in real time and fails on any frame-to-frame jump over its limit.