Exact source used by this build. SHA-256: b3a0858bb08337b06b45792a5d168547dbad5ecae304b55545bc6c28cc0ddaff.
1 # Stardew feel checklist for Tamarack
2
3 Goal: make Tamarack *feel* like Stardew Valley, with numbers a coding agent can build against. Everything below comes from frame-level analysis of Stardew gameplay footage plus the Stardew wiki and its modding/decompile notes. No Stardew art or audio is reused; this file only records timings, layouts and behaviors.
4
5 ## How to read this
6
7 Every line is: **behavior**: number or description `[tag]`. *Hint:* how to do it in Phaser.
8
9 Tags:
10 - `[measured]` I measured it from footage (method stated).
11 - `[wiki]` taken from the Stardew Valley wiki or its modding pages (fan-transcribed from game code, so trust but verify).
12 - `[estimate]` my judgment, or remembered from game code but not verified here. Treat as a starting value to tune by eye.
13 - `[not observed]` was not in the footage I pulled; no number is claimed.
14
15 Where a measured number and a wiki number both exist, both are shown. Do not average them.
16
17 ## Units (read this once, then use the numbers verbatim)
18
19 - Stardew art tile = 16 x 16 px, drawn at 4x = **64 px per tile** at its default "zoom 100%". Farmer sprite frame = 16 x 32 art px = **64 x 128 px**. [wiki, and confirmed in footage: rocks and toolbar slots measure about 64 px in a 1280 x 720 capture]
20 - Tamarack is also 16 px tiles at 4x, so **every pixel number below is directly usable as a world-space or UI-space pixel** at the same scale (fishing bar 568 px, catch zone 96 px, toolbar slot 64 px, HUD margins, etc.).
21 - Caveat for phones: "4x" must be defined in **CSS px per art px**, not device px. At 4 CSS px per art px a 390 x 844 phone shows only 6 x 13 tiles in portrait (13 x 6 in landscape), which is far tighter than Stardew ever is. See "Visible area" below and "Mobile controls".
22 - Game logic in Stardew runs at 60 ticks per second. Wiki speeds are px per tick, so px/s = value x 60. [wiki]
23 - Source footage: 7 downloaded segments of 800 to 900 s plus 2 short mobile clips (420 s and 250 s), all 720p. 2 PC first-day clips, 1 PC fishing day, 1 PC fall farm day (evening and fishing), 2 PC mines clips, 1 iPad clip, 2 phone clips. About 45 images viewed, most of them contact sheets. Capture caveat: several clips have duplicated frames (effective 30 fps in a 60 fps container), so per-frame numbers are noisy and I always report sums over 0.5 to 1 s.
24
25 ---
26
27 ## 1. Movement and camera
28
29 - **Run speed (what players actually do all day)**: sustained **4.7 to 5.0 tiles/s** `[measured]`. Method: 60 fps decode of the first-day PC clip, template-matching a background patch between frames 6 apart (0.1 s); steady window read 30 to 32 px per 0.1 s at 64 px/tile, mean of a 1.0 s window = 314 px/s = 4.9 tiles/s, repeated on 3 windows (all 4.7 to 5.0 when steady). Wiki: run = 5 px/tick = 300 px/s = **4.69 tiles/s** `[wiki]`. Measured is within about 5 percent of wiki, inside the frame-duplication noise. Use **300 px/s**. *Hint:* `body.setVelocity(dir.x*300, dir.y*300)` on an arcade body or the same in your fixed-step sim; do not scale by camera zoom.
30 - **Walk speed**: 2 px/tick = 120 px/s = 1.875 tiles/s `[wiki]`. Not seen in footage (every clip was run speed). Include only if you ship a "walk" modifier.
31 - **Terrain slows**: wiki says some terrain reduces speed, floor at 1 px/tick. `[wiki]` *Hint:* per-tile `speedMultiplier` in the tile property layer, clamp so it never drops below 20 percent.
32 - **Start/stop is nearly instant**: no inertia. First 0.1 s window after key-down was already about 60 percent of full speed (18 of 30 px), full speed by the second window; stops within about 0.1 to 0.2 s `[measured]`. *Hint:* set velocity directly; if you smooth, use a linear ramp of 100 ms at most.
33 - **Diagonals and turns**: direction changes take effect within 0.1 s (e.g. dx 25 / dy 4, then dx 18 / dy 20, then dy 31 over three 0.1 s windows) `[measured]`. Diagonal speed normalization not verified. *Hint:* normalize the input vector so diagonals are not faster.
34 - **Camera is locked to the player, no smoothing**: background shift tracks player speed from the first frame of motion; the farmer sits at screen center except near map edges, where the camera clamps and the sprite walks off-center `[measured]`. *Hint:* `camera.startFollow(player, true, 1, 1)` plus `setBounds(mapRect)`; `roundPixels: true` and integer positions to avoid shimmer. Maps smaller than the screen (house interiors) are drawn centered on a black background with no scaling `[measured]`.
35 - **Facing**: 4 directions only; walking/using tools face the last pressed direction `[wiki]`.
36 - **Walk cycle**: each walk frame 200 ms, sequence 0,1,0,2 (so 800 ms per full step cycle) `[wiki]`.
37 - **Run cycle (8 frames)**: down 90,60,120,60,90,60,120,60 ms = 660 ms; side 90,140,100,90,140,100 ms = 660 ms; up same as down `[wiki]`. *Hint:* 6 to 8 frame run animation at about 12 fps with the 120 ms contact frames held longer; that uneven rhythm is part of the look.
38 - **Footstep dust**: while running on dirt, a small tan puff spawns at the feet every few frames and fades in about 0.3 s; a soft oval shadow stays under the sprite `[measured, 15 fps sheet]`. *Hint:* particle emitter on the player, 2 to 3 px puffs, alpha 0.6 to 0, lifespan 300 ms, emit while moving on dirt/sand only.
39 - **Footstep sounds by surface** (grass, wood, stone, dirt/sand) `[wiki]`, see Audio.
40 - **Tool use locks movement**: the farmer is stationary for the whole swing `[measured]`. *Hint:* set `player.state = 'using'` and ignore move input until the animation ends.
41 - **Player collision**: small box at the feet, slides along walls `[estimate]`. *Hint:* about 48 x 32 px box at the sprite's feet so the head can overlap tall objects.
42
43 ### Visible area (what the player sees)
44 - **PC, 1280 x 720, zoom 100 percent**: 20 x 11.25 tiles `[measured]`. Zoom option is 75 to 200 percent in 5 percent steps, UI scale 75 to 150 percent `[wiki]`. At 1920 x 1080 and 100 percent that is 30 x 16.9 tiles `[derived]`.
45 - **Phone, landscape**: about 40 px per tile in a 1280-wide capture, so about **32 x 14.5 tiles** `[measured, two phone clips, same result]`. iPad clip is pinched far out (about 20 px per tile, about 64 tiles wide) `[measured]`; pinch zoom exists on mobile `[wiki]`.
46 - **Tamarack recommendation** `[estimate]`: choose CSS scale so landscape shows 20 to 26 tiles across and portrait 10 to 12: `scale = clamp(viewportWidthCss / (16 * 22), 1.5, 3)`; allow a pinch or settings slider from 1.5x to 3x. At 844 x 390 landscape that is 2x = 32 px tiles = 26 x 12 tiles; at 390 x 844 portrait 2x gives 12 x 26 tiles.
47
48 ---
49
50 ## 2. Tools and farming feedback
51
52 - **Hoe / pickaxe / axe swing, facing down**: 5 animation frames of 150, 40, 40, 170, 75 ms = **475 ms** `[wiki]`. Side-facing 100,40,40,220,75 = 475 ms; up-facing 100,40,40,220,75 = 475 ms `[wiki]`. Measured hoe at 30 fps: arm raised and held about 5 frames (about 170 ms), one blurred strike frame, dirt puff over the next 3 frames, back to idle by about 0.45 s `[measured]`. The two agree. *Hint:* 5-frame animation with those exact per-frame durations; apply the tile effect on the strike frame (end of frame 2), not at swing start.
53 - **Mining swing cadence**: back-to-back pickaxe swings about every 0.5 to 0.6 s when the player spams the button `[measured, 10 fps sheet]`. *Hint:* after the 475 ms lock, accept the next input immediately; there is no extra cooldown.
54 - **Hoe/can charge**: upgraded hoe and can hold the raised frame while charging; the second-to-last frame adds 30 ms x tool power `[wiki]`. "Swift" enchant scales all frame times by 0.66 `[wiki]`. *Hint:* put `speedMultiplier` on the tool and multiply every frame duration.
55 - **Scythe**: 6 frames: 55, 45, 25, 25, 25 ms, then a final frame of `swipeSpeed` (weapon-speed dependent) `[wiki]`. Measured at 15 fps: about 5 to 6 frames (0.3 to 0.4 s) from raise to done `[measured]`. Cutting weeds leaves a short burst of green fiber bits `[measured]`.
56 - **Energy cost per use** at skill 0: hoe, axe, pickaxe, can = 2; fishing cast = 8; each skill level cuts 0.1; scythe, weapons, pan cost 0 `[wiki]`. Exhaustion at 0 energy shows an "X" bubble over the head and slows movement; passing out at -15 `[wiki]`. Energy bar shakes and sweats if energy is under 20 on use; message at under 15 `[wiki]`.
57 - **Target tile highlight**: a translucent light-green square on the tile in front of the farmer when a tool or seed is selected `[measured, PC and phone clips]`. *Hint:* a 64 x 64 rect at 40 percent alpha on the facing tile, snapped to the grid, red/none when invalid.
58 - **Soil**: hoeing turns the tile to a darker brown patch immediately on the strike frame; neighboring tilled tiles auto-connect their edges (rounded outer corners) `[measured]`. *Hint:* autotile bitmask (4-neighbor, 16 variants) on the tilled layer; watered tiles use a darker tint of the same tiles.
59 - **Weeds/stone/wood**: scythe on weeds = green fiber bits; pickaxe on stone = small gray chips; stone then drops a gray chunk (see Items) `[measured]`. Axe chop on wood/stump: brown chips and a short wobble `[estimate]`.
60 - **Harvest**: 4 frames x 100 ms = **400 ms** harvest animation (down 54..57, side 58..61, up 62..65) `[wiki]`. The crop pops out and is held over the head briefly with the pop sound `[wiki cue: harvest]`; this pop was not in my footage `[not observed]`. *Hint:* sprite spawns at the crop tile, tweens up about 16 to 24 px with ease-out over 200 ms into a "held above head" pose, then flies into the toolbar slot.
61 - **Plant seed**: soft dig sound (`dirtyHit`) `[wiki]`; seed sprite appears on the tile on the same frame `[estimate]`.
62 - **Eating**: 9-step animation, 250,400,401,250,250,250,250,250,250 ms (about 2.3 s) facing the screen `[wiki]`.
63
64 ---
65
66 ## 3. Items, drops and pickups
67
68 - **Pickup toast**: a small wooden pill at the **bottom-left** with item icon and name; new pickups stack upward, each fades after about 2 s `[measured]`. A red X "Inventory Full" toast appears in the same spot when the pack is full `[measured]`. *Hint:* a DOM or Phaser container anchored bottom-left, max 4 stacked, slide-up 120 ms, fade last 400 ms.
69 - **Breaking a stone**: a gray chunk spawns at the rock, hops a few px, then flies to the farmer in about **0.5 to 0.6 s** (36 frames at 30 fps) and keeps following even as the farmer walks away; small dust puffs trail the farmer `[measured]`. *Hint:* drop entity with `hop` tween (about 12 px, 180 ms) then, once inside the magnet radius, accelerate toward the player (start about 150 px/s, ramp to about 600 px/s) and despawn on contact with the pop sound.
70 - **Magnet radius**: wiki gives ring bonuses only: Small Magnet Ring +1 tile, Magnet Ring +2 tiles, stacking `[wiki]`. The unmodified base radius is about 2 tiles (128 px) `[estimate, from game code memory, not verified]`.
71 - **Forage/pick-up**: "pop" sound (`pickUpItem`), item goes straight to the pack with a toast `[wiki]`.
72 - **Inventory**: rows of 12; starts with 1 row (the hotbar), unlocks to 3 rows `[wiki]`. Selected slot has a red frame `[measured]`. Stack count printed small at the slot's bottom-right `[measured]`. Number keys or scroll wheel change slot `[wiki]`.
73 - **Barrel/crate/chest**: open sound `openChest`; chest menu is the inventory grid plus a second 12-column grid, a color palette strip above, trash can and OK on the right `[measured, chest menu frame]`.
74
75 ---
76
77 ## 4. Combat and mining
78
79 - **Weapon action time** (swing plus recovery): sword **400 ms**, club 720 ms, slingshot 300 ms; each +1 speed removes 40 ms `[wiki]`. Measured sword spam in the mines at 4 fps: swings land about every 0.5 s `[measured]`, consistent with 400 ms plus input latency. *Hint:* weapon `cooldownMs` per type; hitbox active on frames 2 to 4 only.
80 - **Hit feedback seen**: arc sprite, red blood-colored sparks on the enemy, tiny yellow damage numbers popping off the enemy, enemy knocked back a few px and flashes `[measured, 4 fps sheet]`. Sword sound mixes swing and hit (`hitEnemy`); slime hits use a wet squelch (`slimeHit`); crits use `crit`, a high "zing" `[wiki]`. *Hint:* on hit: 80 ms white flash tint on the enemy, knockback 24 px over 120 ms, floating number tween up 24 px and fade over 600 ms, 3 to 6 particles in the enemy's color.
81 - **Hitstop and screen shake**: I saw no obvious full-screen shake in the combat or mining clips `[not observed]`. Do not add a big shake; at most a 1 to 2 px, 80 ms nudge on heavy damage taken `[estimate]`. The one strong "shake" Stardew does is the energy bar, which wiggles when you use a tool while below 20 energy `[wiki]`.
82 - **Player invincibility after being hit**: about 1.2 s of flicker `[estimate, from game code memory]`.
83 - **Mines look**: extremely dark; you see warm pools of light around wall torches/lanterns and a small radius around the farmer `[measured]`. Brown dirt floor, rounded rock walls, purple mushrooms/rocks as ore nodes. A second vertical bar (health) appears beside the energy bar inside the mines `[measured]`. *Hint:* a full-screen dark multiply layer at about 0.85 alpha with additive radial light sprites (radius about 3 to 4 tiles) over torches and the player.
84 - **Time inside deep mine areas runs slower in real terms (0.9 s per game minute vs 0.7)** `[wiki]`, already in `time-and-multiplayer.md`.
85 - **Auto-attack (mobile)**: when a weapon is selected, nearby enemies are attacked automatically `[wiki]`. Option checkbox "Auto Attack" is in the mobile options `[measured]`.
86
87 ---
88
89 ## 5. Fishing
90
91 Flow (all `[measured]` from the PC fishing clip unless tagged): hold the use button, a small **power meter** appears over the head (orange while charging, green at full); release to cast; the bobber arcs out and lands with a splash; wait; **"!" bubble** over the player's head with the fishBite sound; click within the window; a big gold italic **"HIT!"** floats up from the bobber with a splash; the **minigame panel** opens; on success the fish leaps to the player and an item-get presentation plays.
92
93 - **Cast charge**: hold to charge, max cast = 3 tiles south/north, 4 tiles east/west at level 0, +1 tile per direction at levels 1, 4, 8, 15; "Max" shown if above 99 percent charge; can steer the bobber slightly with movement keys during the cast `[wiki]`.
94 - **Bite wait**: random 0.6 to 30 s base, max shortened 0.25 s per fishing level, 25 percent shorter for the first bite, 50 percent shorter with bait `[wiki]`. *Hint:* `delay = lerp(0.6, 30 - 0.25*level, rand())` seconds, apply multipliers.
95 - **Bite window**: "!" bubble stays about **0.6 to 0.8 s** (6 to 8 frames at 10 fps) before it vanishes `[measured]`. Miss it and the line resets. *Hint:* 700 ms reaction window; mobile can widen to 900 ms.
96 - **"HIT!" text**: shows about 0.8 s, gold with dark outline, drifts up `[measured]`.
97 - **Minigame panel**: appears to the right of the farmer with a speech-bubble tail pointing at them; tall rounded panel about 110 x 435 px at 720p with a blue water column, a **green catch rectangle**, a fish icon bouncing, and a **thin vertical progress strip on the right** (green fill rising, turns orange when low) `[measured]`. Total bar 568 px; catch rectangle 96 px at fishing level 0, +8 px per level (176 at 10) `[wiki]`; measured rectangle about 65 to 70 px in a 720p capture, which scales to 96 px at the native 1080p layout `[measured, consistent]`.
98 - **Controls**: hold = rectangle rises, with momentum, release = it falls; fish moves on its own path; progress rises while the fish is inside the rectangle and falls while outside; empty progress = fish escapes `[wiki]`. Mobile: hold finger anywhere `[estimate]`.
99 - **Duration**: one minigame ran about 14 s in the footage `[measured]`; wiki gives no fixed length.
100 - **Perfect**: if the fish never leaves the rectangle, show "Perfect!" and raise quality one tier `[wiki]`.
101 - **Time and energy**: time pauses during the reel-in animation `[wiki]`. Cast costs 8 energy `[wiki]`. "First catch!" text on a new species `[wiki]`.
102 - *Hint:* implement the minigame as a pure state machine (`barY`, `barVel`, `fishY`, `progress`) in `packages/sim`; render it as a Phaser container. Use a 60 Hz fixed step so its feel matches Stardew.
103
104 ---
105
106 ## 6. HUD
107
108 Positions are at 1280 x 720, UI scale 100 percent `[measured]`.
109
110 - **Toolbar**: bottom center, 12 slots, about 66 px per slot, 790 px wide (62 percent of width), about 78 px tall, about 24 px above the bottom edge; selected slot has a red border; tool icons 4x; stack counts bottom-right `[measured]`. It **moves to the top** of the screen when the player is near the bottom of the map (option "Lock Toolbar" stops this, and a locked toolbar fades) `[wiki, measured both positions]`. Backpack upgrades add rows to the menu, not to the toolbar.
111 - **Clock/date box**: top right, about 280 x 170 px, 16 px from the right edge. Contents top to bottom: day label ("Tue. 2"), weather icon and season icon, time ("9:30 am"); a **sundial dial** on the left with a rotating arm that sweeps across the day `[measured]`. The clock text greys out/blinks while time is paused `[wiki]`.
112 - **Money**: directly under the clock, about 250 x 55 px, "G" plus 8-digit reel in gold digits `[measured]`.
113 - **Journal/quest "!" icon**: under the money box; a second small icon for new mail/notifications sits near it `[measured]`.
114 - **Energy bar**: bottom right edge, vertical green bar with an "E" tag, about 32 x 210 px, fills green to yellow to red; **health bar** appears next to it only after you take damage or enter the mines `[measured]`.
115 - **Pickup toasts**: bottom-left (see Items).
116 - **Mobile HUD differences** `[measured]`: date and time are two compact boxes without the sundial; money below; "!" journal and a hamburger **menu button** stacked on the right; energy (and health) bars bottom right; the toolbar can be **vertical on the left** (option "Vertical Toolbar"); a small controller icon at the top-left is the control-scheme toggle; sliders exist for toolbar size and date-box size `[measured, wiki history]`.
117 - *Hint:* build the HUD as DOM or a Phaser `Container` on a separate UI camera at integer 4x (or the chosen UI scale), anchored by edges with 16 px safe margins, plus `env(safe-area-inset-*)` on iOS.
118
119 ---
120
121 ## 7. Menus and dialogue
122
123 - **Panel style**: wooden 9-slice: dark orange outer border with a lighter inner bevel, warm cream/orange gradient body (lighter at top), 1 art px (4 px) highlight lines; icon-only tabs along the top; close "X" button in the top-right corner; small "OK" and trash buttons beside the grid `[measured]`. *Hint:* one 9-slice texture (corner 8 art px) reused for dialogue, inventory, shop and shipping; `NineSlice` game object.
124 - **Inventory menu**: tab strip across the top (backpack counter like "12/12", then icons for inventory, social, skills, crafting, collections, options); grid of 12 columns x up to 3 rows of 64 px slots; below it a character panel (portrait, name, farm name, funds) `[measured]`.
125 - **Dialogue box**: bottom-anchored, nearly full width (about 98 percent) with a text panel (about 76 percent) on the left and a **portrait panel on the right** (about 270 px wide) holding a framed 64 x 64 art-px portrait and a scroll-style **name plate** below it; "next" arrow at the bottom-right of the text area; the world behind is **not dimmed**; the box appears at full size on its first frame (no slide-in) `[measured]`. The event dialogue I measured was about 433 px tall at 720p (60 percent); everyday NPC dialogue in the game is shorter `[estimate]`. *Hint:* on phones cap the box at 40 percent height and size text by UI scale.
126 - **Typewriter speed**: text appears at about **64 characters per second** (about 15 ms per character): a 56-character line went from 10 percent to 90 percent in 0.70 s `[measured, 60 fps pixel-count of the text area, line "So... You're moving into your grandfather's old cottage."]`. Pressing action while typing completes the line instantly `[estimate]`. *Hint:* reveal characters on a fixed timer, not per frame; skip-to-end on tap.
127 - **Text style**: chunky pixel font, wide letter spacing, dark brown text on tan, line pitch about 54 px at 4x `[measured]`.
128 - **Time during menus and dialogue**: the clock stops `[wiki]`.
129 - **Shop menu**: list rows with icon, name, price and a small coin; item tooltip box on hover `[measured, seed shop frame]`.
130 - **Journal/quests**: parchment panel with a title banner and checklist entries `[measured]`.
131 - **Letters**: parchment 9-slice with handwriting-style font and a small fold arrow bottom-right `[measured]`.
132
133 ---
134
135 ## 8. Day, night, weather
136
137 ### Clock
138 - **Tick length**: the clock advances 10 game minutes every **7.3 s** real time `[measured]`: 12 consecutive tick intervals from a 60 fps decode, all 7.3 s when no menu was open. Wiki: 0.7 real s per game minute = 7.0 s per tick `[wiki]`; the extra 0.3 s I measured is likely the tick landing on the next rendered frame plus tiny pauses, so use **7.0 s** as the design number. Day 6:00 am to 2:00 am = 14 real min; mine/Skull Cavern-type area 0.9 s per minute `[wiki]`. Matches `time-and-multiplayer.md`.
139 - Time pauses in dialogue, menus, cutscenes, and during the fishing reel `[wiki]`.
140
141 ### Evening light (fall footage, spring is later and gentler)
142 - 5:20 pm: faint warm cast; 6:00 to 6:30 pm: orange-pink grade; 6:40 to 7:00 pm: purple; 7:10 to 7:50 pm: deep blue-purple, water turns navy, still readable; not fully dark at 8:00 pm `[measured, fall, 12 frames at 15 s]`. Wiki: "night" (for fish) starts at 6 pm, but it does not get dark until about 8 pm depending on season `[wiki]`. Animals head in at 5 pm, start sleeping at 7 pm, are still by 8 pm `[wiki]`.
143 - *Hint:* one full-screen rect with `Phaser.BlendModes.MULTIPLY`, colour interpolated by clock: about 17:00 (255,240,225), 18:30 (255,200,170), 19:00 (200,160,190), 20:00 (120,110,170), 22:00 (60,70,120) `[estimate]`. Interiors are never tinted by the day cycle `[measured, farmhouse is always warm and bright]`.
144 - **Night light sources**: lamp posts and window glow turn on at dusk and show as soft warm radial halos on top of the dark layer; torches in caves `[measured]`. *Hint:* additive radial gradient sprites (about 3 tile radius) placed per light object and enabled when the clock passes about 18:00.
145 - **Rain** `[measured weakly, capture compression hides streaks]`: global blue-gray darkening, very thin diagonal streaks falling fast, ripples on water and ground puddles. Rain also affects what fish bite and removes the need to water `[wiki]`. *Hint:* a particle emitter in screen space, about 70 drops, speed about 600 px/s, angle about 105 degrees, alpha 0.4; splash ripple sprites on tiles.
146 - **Storm**: rain plus a lightning strike chance every 10 game minutes, with screen flash and thunder; lightning can hit farm tiles `[wiki]`. Flash effects can be disabled `[wiki]`.
147 - **Snow**: opacity adjustable in options (so it is a big overlay) `[wiki]`; not in my footage `[not observed]`.
148 - **Wind**: spring (petals/pollen) and fall (leaves) gusts `[wiki]`; not seen clearly in my footage `[not observed]`.
149 - **Weather forecast**: a TV in the house shows tomorrow's weather `[wiki]`.
150
151 ### Day-end sequence (1 fps resolution, so timings are +/- 1 s)
152 1. Walk into bed; confirm prompt `[wiki]`.
153 2. Screen fades to black over about 1 s `[measured, 1 fps]`.
154 3. **Shipping summary** on a night sky with hills and a few stars: rows slide in one after another about **1 s apart**: Farming, Foraging, Fishing, Mining, Other, then **Total** with a green check button; each row has a category icon and a "+" button, and the gold digits roll up `[measured]`.
155 4. Skill level-ups and new recipes show after the summary `[wiki]`.
156 5. Fade in to the farmhouse bed at 6:00 am, "Your progress has been saved" fades in and out `[measured, mobile clip]`.
157 - *Hint:* the summary is a sequenced `scene.time.delayedCall` chain, 900 to 1000 ms per row, count-up tweens of about 600 ms per number, a coin tick sound per row.
158 - Passing out at 2 am: lose up to 10 percent gold (max 1,000) if outside the house; energy refills to only 50 percent `[wiki]`.
159
160 ---
161
162 ## 9. Ambient life
163
164 All `[measured]` from stills unless noted; animation rates are `[estimate]`.
165 - **Butterflies** (pink and yellow) flutter around flowers/bushes, 2 to 4 on screen in daytime `[measured]`.
166 - **Birds/crows** perch and flap away when you approach `[wiki/known, not clearly captured]`.
167 - **Water**: lily pads on ponds, animated wave pattern on the ocean and lakes, a shore-foam edge at beaches, small seaweed tufts `[measured]`. *Hint:* 2 to 4 frame water tile animation at about 3 fps with slight color shift; foam as a separate animated edge layer.
168 - **Grass**: tall tufts you can cut; they sway when you walk through them `[wiki/known, not observed]`. *Hint:* small tween on the grass sprite's skew or x for 300 ms when the player overlaps.
169 - **Trees**: static in the clips I saw; shake and drop leaves when hit `[wiki cue: leafrustle]`.
170 - **NPCs**: walk fixed daily schedules by clock `[wiki]`.
171 - **Farm animals** go in at 5 pm and sleep by 8 pm `[wiki]`.
172 - **Chimney smoke, fireplace flicker, TV flicker, lantern flicker** indoors `[measured: fireplace and lamps animated]`.
173 - **Not captured**: water shimmer rate, bush rustle timing, falling leaves.
174
175 ---
176
177 ## 10. Audio cue list (cue ids from the wiki; make our own sounds)
178
179 Names are Stardew's internal cue ids `[wiki, Modding:Audio]`. Use them as a *moments to cover* checklist, with original sounds.
180
181 - Footsteps: `grassyStep`, `woodyStep`, `stoneStep`, `sandyStep` (dirt), per surface, on each walk/run contact frame.
182 - Hoe digging: `hoeHit`. Planting: `dirtyHit`. Watering: `wateringCan`. Axe: `axchop`. Pick/hammer: `hammer` (and stone crack variants). Leaves/foliage: `leafrustle`.
183 - Item pickup / forage: `pickUpItem`; generic pop/coin: `coin`; crop harvest pop: `harvest`.
184 - Shipping: `Ship` (items dropping into a wooden box). Chest: `openChest`.
185 - UI: `bigSelect`, `smallSelect` (clicks), `dwop` (soft menu/sprite thunk), `shiny4` (scroll bar), `newRecipe` (page turn), `trashcan`.
186 - Fishing: cast sound, `fishBite` (warbling bite), `fishingRodBend` (creak during minigame), `pullItemFromWater` (splash on catch).
187 - Combat: `hitEnemy` (swing plus hit), `swordswipe`, `daggerswipe`, `clubhit`, `slimeHit`, `crit`, `parry`, `debuffHit`.
188 - Eating/drinking: `eat`, `gulp`.
189 - Jingles: `getNewSpecialItem` (sparkle), `questcomplete`, `achievement`, `secret1`.
190 - Doors: `doorOpen`, `doorClose`.
191 - Ambient: `rainsound`/rain loop, `thunder`, `thunder_small`, animal sounds (`cluck`, etc.), birds in daytime, crickets at night `[wiki/known]`.
192 - Music: a distinct calm track per season, quieter during rain, area-specific tracks (town, mines, beach) `[known]`.
193 - Dialogue: soft per-character "blip" while text types `[estimate]`.
194 - *Hint:* `this.sound.play(key, {volume, rate: 1 + rand(-0.05, 0.05)})` with 2 to 3 variants and small random pitch per cue; never play the same variant twice in a row.
195
196 ---
197
198 ## 11. Mobile controls
199
200 Stardew's own mobile schemes `[wiki and forum notes]`:
201 - **Default: tap-to-move with auto-attack**: tap the ground to walk there; tap a tool target (stone, wood, etc.) to auto-pick the right tool and use it; the hoe and scythe are not auto-picked.
202 - **Invisible joystick with one button**: touch and drag anywhere on the left for movement; a quick tap on the right half of the screen = use tool (PC left click), a long press = action (PC right click).
203 - **Visible joystick plus buttons**: classic on-screen controls.
204 - Options screen has checkboxes for **Vertical Toolbar**, **Auto Attack**, **Item Placement Guide**, and sliders for toolbar size, date-box size, menu padding and toolbar padding `[measured, iPad options frame]`. Pinch zoom exists on mobile `[wiki]`. Text entry uses the system keyboard `[measured]`.
205
206 Tamarack recommendations (architecture says virtual joystick, context action button, tap-to-target):
207 - **Floating left joystick**: appears where the left thumb lands in the bottom-left 40 percent of the screen, 120 CSS px base ring, 12 percent dead zone `[estimate]`. Movement speed is the same 300 px/s at any stick deflection above the dead zone (Stardew has no analog speed).
208 - **Context action button** bottom-right, about 72 CSS px, label/icon changes with the facing target (use tool, talk, harvest, open); **tap-to-target** on a tile faces and uses the selected tool on that tile; **long-press** = secondary action (eat, place, inspect).
209 - **Toolbar**: vertical on the left edge or horizontal at the top in landscape (Stardew's phone layout), 44 to 56 CSS px slots, tap to select; on portrait use a horizontal bottom bar above the thumb zone. Slot hit areas at least 44 CSS px.
210 - **Auto-select tool when tapping a target**: stone to pickaxe, tree to axe, weeds to scythe `[wiki]`. Makes one-thumb play viable.
211 - **Safe areas**: respect iOS notch and home indicator with `env(safe-area-inset-*)`; keep HUD 16 CSS px from edges.
212 - **Menus** use full-width panels and enlarged slots (at least 44 CSS px); dialogue box capped at about 40 percent of screen height.
213 - Haptics: light tick on tool strike, success on catch, medium on damage taken (Capacitor Haptics) `[estimate]`.
214
215 ---
216
217 ## Cross-check summary (measured vs wiki)
218
219 | Item | Measured | Wiki or source | Verdict |
220 | :- | :- | :- | :- |
221 | Run speed | 4.7 to 5.0 tiles/s (314 px/s over 1 s) | 5 px/tick = 4.69 tiles/s | Agree within noise; use 300 px/s |
222 | Hoe swing | about 0.45 s at 30 fps | 150+40+40+170+75 = 475 ms | Agree |
223 | Clock tick | 7.3 s per 10 game min (x12 ticks) | 7.0 s | Agree; build 7.0 s |
224 | Sword cadence | about 0.5 s per swing | 400 ms | Agree (input latency) |
225 | Dialogue speed | about 64 chars/s | not on wiki | Use measured |
226 | Fishing catch rect | about 65 to 70 px at 720p capture | 96 px at level 0 (UI native) | Consistent after scaling |
227 | Tile and slot size | 64 px, slot about 66 px | 16 art px x 4 | Agree |
228
229 ## What I could not measure (honest gaps)
230
231 - Crop harvest pop animation, item-drop bounce physics and exact magnet pull speed (only the 0.5 to 0.6 s fly-in observed), base magnet radius.
232 - Snow, blowing leaves, grass sway, water shimmer rate, bird behavior, screen shake (none seen in the footage; Stardew uses almost none).
233 - Menu open/close animation timing (menus appeared fully formed on the first frame in my captures, which suggests no slide-in, but my frame spacing was too coarse to prove it).
234 - Walk (non-run) speed, diagonal normalization, player collision box, invincibility frames.
235 - Day-end fade durations beyond about 1 s resolution; the summary row timing is +/- 1 s.
236 - Audio: I did not analyze audio waveforms, only cue ids and moments from the wiki.
237 - Default mobile zoom: the two phone clips both show about 40 px tiles at 1280-wide capture, but these players may have changed zoom; treat 32 x 14.5 tiles as an upper bound.
238
239 ---
240
241 ## Top 15 things that make it feel like Stardew (priority order)
242
243 1. **Locked, unsmoothed camera and instant 300 px/s movement** with no inertia, 4-direction facing, integer pixel snapping. (Section 1.)
244 2. **Tool swings that lock the player for about 475 ms** with the 150/40/40/170/75 ms frame rhythm, effect applied on the strike frame, no cooldown on repeat.
245 3. **Immediate, readable world feedback on every action**: soil darkens on the strike frame, a green target-tile highlight, debris bits (fiber, chips) on every hit.
246 4. **Items fly to you**: drops hop, then magnet toward the player in about 0.5 s, with a pop sound and a bottom-left pickup toast stack.
247 5. **The 10-minute clock at 7 s per tick** with the sundial HUD, time pausing in menus/dialogue, and the whole day 6 am to 2 am.
248 6. **The HUD layout**: toolbar bottom center (12 slots, red selected frame, flips to the top near map bottom), clock/date/weather/money top right, energy bar bottom right, journal "!" under money.
249 7. **Wooden 9-slice UI everywhere** (dialogue, inventory, shop, shipping) with a consistent chunky pixel font.
250 8. **Dialogue box**: bottom-anchored, portrait plus name-plate on the right, fast typewriter (about 64 chars/s), tap to skip, no world dimming.
251 9. **Dusk and night as a warm-to-purple color grade** with lamp and window glows, interiors always warm and bright, caves very dark with pools of light.
252 10. **Day-end ritual**: bed, fade to black, shipping summary rows sliding in about 1 s apart with rolling gold digits, then a morning fade-in.
253 11. **Fishing as a three-beat loop**: charge-meter cast, "!" bite window of about 0.7 s then "HIT!", then the vertical bar minigame with a momentum-driven catch rectangle and a side progress strip.
254 12. **Per-surface footsteps and tool sounds**, small random pitch variation, plus calm per-season music.
255 13. **Ambient life on a loop**: butterflies, water animation with foam and lily pads, fireplace flicker, grass sway when walked through, animals and NPCs on schedules.
256 14. **Weather as a mood layer**: rain tint with streaks and ripples, storms with rare lightning, seasonal wind particles; fish and behavior change with weather.
257 15. **Mobile-first controls that keep Stardew's feel**: floating joystick, context action button, tap-a-target to auto-select the tool, vertical toolbar, tile scale chosen so about 20 to 26 tiles are visible in landscape (not a 4x CSS zoom that shows only 13).
258