Full Rescue GDD v2
Mọi sao biển đều phải rời board. L1–L3 dạy Capture thuần; L4 mở Final Tide Sweep; L5 mở Wet pit; L8 mở Current Arrow; L9 nhấn Ripple Preview; L10 là Đại Xoáy tổng hợp.
Shell Tide · Tài liệu sản xuất âm thanh
Production manifest cho toàn bộ hành trình nghe được: UI → đọc FLOW → commit lượt → Xoáy/Capture → combo → Full Rescue → kết quả và trở về map. Mục tiêu âm thanh là làm luật dễ hiểu trước, tạo dopamine sau, không che mất nhịp suy nghĩ của puzzle.
Preview, STOP và Current nghe khác nhau.
Sow tick tạo nhịp và anticipation.
Xoáy, rescue, combo tăng payoff theo tầng.
Full Rescue kết bằng cảm giác an toàn, ấm và nhẹ.
Danh mục này đối chiếu GDD chính với working branch Full Rescue v2 ngày 2026-07-12.
Mọi sao biển đều phải rời board. L1–L3 dạy Capture thuần; L4 mở Final Tide Sweep; L5 mở Wet pit; L8 mở Current Arrow; L9 nhấn Ripple Preview; L10 là Đại Xoáy tổng hợp.
Giữ art direction biển nhiệt đới, menu/map, Bạn Đồng Hành, caregiving fantasy và nhịp cảm xúc của hành trình cứu hộ. Không kéo các luật cũ chưa có trong v2 vào P0.
shell-tide-audio.js đang tổng hợp cue bằng WebAudio để kiểm tra timing và event contract. Các tên file bên dưới là danh mục cần thu/thiết kế, edit, mix, export và tích hợp thành asset production.
Âm thanh sạch, mát, hữu cơ và giàu chuyển động nước; không biến puzzle thành arcade ồn liên tục.
Ripple nhỏ cho preview, splash vừa cho capture, surge rộng cho Sweep. Tránh dùng cùng một splash rồi chỉ tăng volume.
UI/pit dùng shell click, hạt cát mịn và wood tick mềm. Không dùng impact kim loại hoặc click quá sắc.
Plop nước kết hợp mallet/bell ấm; tuyệt đối tránh tiếng kêu đau hoặc âm comic làm sinh vật thành đồ vật.
Marimba mềm, kalimba, glass, ukulele muted, hand percussion nhẹ và pad nước. Combo đi lên theo cùng key với music.
STOP = knock trầm ngắn; Current = whoosh đảo stereo; Wet pit = downward plop; Capture = inward suction rồi splash.
Không phát cue cho mọi hover trên touch. Không chồng objective, combo và win cùng lúc; sequencing giữ payoff đọc được.
Mỗi source cue có một master WAV; runtime encode từ cùng source để tránh lệch version.
| Hạng mục | Contract | Ví dụ |
|---|---|---|
| Tên file | st_[bus]_[system]_[action]_[variant]_v01.wav; lowercase, ASCII, không khoảng trắng. | st_sfx_capture_vortex_large_01_v01.wav |
| Source master | WAV 48 kHz / 24-bit. Mono cho UI/focused gameplay; stereo cho ambience, wide payoff và music. | Archive theo audio/source/. |
| Runtime | Ưu tiên Ogg Opus VBR: SFX mono 48 kbps, SFX directional stereo 64 kbps, ambience stereo 80 kbps, music stereo 112 kbps. Giữ OGG Vorbis làm fallback; WAV chỉ là source master. | game/audio/runtime/*.opus · *.ogg fallback. |
| Loop | Loop point sample-accurate; không click; thêm metadata loop start/end trong manifest. | *_loop_v01.wav |
| Head/tail | UI ≤ 20 ms silence đầu; gameplay ≤ 35 ms; tail không bị cắt. Cue phản hồi input phải có transient trước 80 ms. | Preview/commit ưu tiên latency. |
| Biến thể | Random không lặp lại file vừa phát; pitch random chỉ ±2% trừ sow/combo đã ghi khác. | 01–06 là variant, không phải intensity. |
| Bus | master, music, ambience, sfx, coach. | Lưu riêng mute/volume theo browser. |
UI phải nhất quán giữa menu, map, gameplay HUD, pause và result. Không dùng gameplay splash làm button sound.
| Priority | File production | Trigger | Direction / mix |
|---|---|---|---|
| P0 | st_sfx_ui_tap_{01,02,03}_v01.wav | Button/link hợp lệ, chọn tab, đóng toast. | Shell click 55–90 ms; random 3 variant; không phát trên disabled. |
| P0 | st_sfx_ui_back_01_v01.wav | Back, close modal bằng nút hoặc Escape. | Pitch đi xuống nhẹ; mono; không giống fail cue. |
| P0 | st_sfx_ui_panel_{open,close}_01_v01.wav | Pause/settings/result panel mở hoặc đóng. | Whoosh giấy/vỏ sò ngắn; open sáng, close tối hơn. |
| P0 | st_sfx_ui_toggle_{on,off}_01_v01.wav | Music/SFX/ambience/reduce-motion toggle. | On có sparkle nhỏ; off khô hơn; cue phát trước khi mute master. |
| P0 | st_sfx_ui_confirm_01_v01.wav st_sfx_ui_cancel_01_v01.wav | Confirm destructive action / cancel dialog. | Confirm chắc nhưng không nặng; cancel trung tính. |
| P0 | st_sfx_ui_invalid_{01,02}_v01.wav | Chọn hố rỗng, thao tác không hợp lệ, button locked. | Soft wood knock; cooldown 120 ms; không dùng buzzer đỏ. |
| P0 | st_sfx_ui_pause_01_v01.wav st_sfx_ui_restart_confirm_01_v01.wav | Pause gameplay; xác nhận retry/restart. | Pause duck bus 3 dB; restart có upward pickup để quay lại nhanh. |
Chuỗi âm phải giải thích đúng state machine: pick → preview → STOP → commit → sow → rescue/capture → objective.
| Priority | File production | Runtime event / trigger | Direction / behavior |
|---|---|---|---|
| P0 | st_sfx_pit_pick_{01,02,03}_v01.wav | cup.pick khi chọn sand node có sao. | Cát + shell lift, 90–140 ms; chọn lại không tăng pitch vô hạn. |
| P0 | st_sfx_pit_commit_{01,02}_v01.wav | cup.drop khi legal move được commit. | Transient chắc hơn pick; là mốc tính một turn. |
| P0 | st_sfx_route_preview_{left,right}_01_v01.wav | route.preview khi route trái/phải xuất hiện. | Pan ±20%; cùng timbre, contour khác hướng; debounce 80 ms. |
| P0 | st_sfx_route_stop_01_v01.wav | route.stop khi STOP marker khóa vị trí. | Water knock trầm, 120 ms; luôn rõ hơn preview nhưng dưới commit. |
| P0 | st_sfx_sow_tick_{01,02,03,04,05,06}_v01.wav | sow.tick cho từng sao được rải. | Round-robin; pitch theo index tối đa +5 semitone rồi reset; polyphony 4. |
| P0 | st_sfx_wet_pit_rescue_{01,02,03}_v01.wav | Sao đi vào Wet pit từ L5. | Downward water plop + chime; không dùng capture splash vì không có Xoáy. |
| P0 | st_sfx_vortex_form_{01,02}_v01.wav | Xoáy hợp lệ hình thành trước khi hút cụm. | Inward suction 180–260 ms; sync frame vortex form; duck sow tick 2 dB. |
| P0 | st_sfx_capture_vortex_{small,medium,large}_01_v01.wav | capture.splash, chọn intensity theo số sao 1–2 / 3–4 / 5+. | Không chỉ tăng gain; large thêm low-water body, vẫn giữ transient mềm. |
| P0 | st_sfx_rescue_starfish_{01,02,03,04}_v01.wav | rescue.starfish khi sao vào Vùng Nước An Toàn. | Plop + mallet ấm; tối đa 4 note/turn, số dư gộp thành chord. |
| P0 | st_sfx_current_redirect_{left,right}_01_v01.wav | current.redirect ở L8. | Whoosh stereo đảo chiều, có tonal flip; phải nghe được ngay cả khi không nhìn arrow. |
| P0 | st_sfx_ripple_preview_01_v01.wav | booster.ripplePreview ở L9/booster. | Glass-water scan 350 ms; không cadence thắng, không gợi route tốt nhất. |
| P0 | st_sfx_turn_warning_01_v01.wav | turn.warning khi còn 2 lượt và lần đầu còn 1 lượt. | Hai pulse mềm; cooldown theo state, không phát lại mỗi render. |
| P0 | st_sfx_objective_progress_{01,02}_v01.wav | objective.progress sau khi counter rescue cập nhật. | Chime rất ngắn; bỏ qua nếu Full Rescue để nhường win sequence. |
| P0 | st_sfx_final_sweep_start_01_v01.wav st_sfx_final_sweep_loop_01_v01.wav st_sfx_final_sweep_end_01_v01.wav | Final Tide Sweep từ L4: start → sweep cụm cuối → arrive. | Ba phần để sync duration board; loop 0.6–1.2 s; end nối trực tiếp Full Rescue stinger. |
Combo dùng hệ cao độ tăng dần nhưng vẫn nghe như nước cứu hộ, không biến thành slot machine.
| Priority | File production | Trigger | Thiết kế tầng dopamine |
|---|---|---|---|
| P0 | st_sfx_combo_chain_x{2,3,4,5}_01_v01.wav | combo.wave theo capture chain; x5 là cap audio. | Cùng motif 2/3/4/5 note; mỗi tầng tăng brightness và width, không tăng quá 2 dB. |
| P0 | st_sfx_combo_tidal_rush_01_v01.wav | combo.tidalRush cho chain 3+ nổi bật. | Accent phủ lên chain tier, không thay toàn bộ cue; duck music 5–7 dB trong 0.8 s. |
| P0 | st_sfx_combo_perfect_tide_01_v01.wav | combo.perfectTide khi Full Rescue đúng optimal turns. | Cadence mastery sáng; phát trước result star reveal khoảng 180 ms. |
| P0 | st_sfx_combo_last_tide_save_01_v01.wav | combo.lastTideSave khi cứu sạch ở lượt cuối. | Release sau tension: low swell → major resolve; không dùng alarm. |
| P0 | st_sfx_combo_grand_vortex_01_v01.wav | L10 Đại Xoáy / gate finale. | Signature cue 1.6–2.2 s; vortex, shell horn mềm và wave impact; chỉ dùng một lần/clear. |
vortex_form → capture_vortex → rescue_starfish → combo_chain. Với Full Rescue, bỏ objective_progress, chờ tail rescue 120–180 ms rồi mới phát mastery/win.Rating chỉ xuất hiện sau Full Rescue; cue 1★/2★/3★ không được phát khi board chưa sạch.
| Priority | File production | Trigger | Direction / timing |
|---|---|---|---|
| P0 | st_sfx_result_full_rescue_01_v01.wav | remainingStarfish === 0, sau rescue cuối. | Signature “all safe” 0.8–1.1 s; dùng trước star rating. |
| P0 | st_sfx_result_rating_{1,2,3}star_01_v01.wav | level.win theo band lượt. | Chung cadence, thêm lớp theo số sao; 3★ không lớn gấp ba 1★. |
| P0 | st_sfx_result_fail_01_v01.wav | level.fail khi hết lượt còn sao. | Gentle unresolved chord; không bass drop, không âm phạt. |
| P0 | st_sfx_result_near_miss_01_v01.wav st_sfx_result_near_miss_replay_01_v01.wav | nearMiss và nearMiss.replay. | Near-miss chỉ cụm còn thiếu; replay là watery rewind ngắn, không tiết lộ exact move. |
| P0 | st_sfx_result_retry_confirm_01_v01.wav | retry.confirm. | Pickup 180 ms, nối sạch sang reset ambience/gameplay bed. |
| P0 | st_sfx_result_gate_complete_01_v01.wav | level.gate.complete sau clear L10. | Tail 2–3 s, có khoảng trống cho visual gate; sau đó mới chuyển map/music. |
Music hỗ trợ concentration; gameplay loop không được cạnh tranh với sow tick, Current hoặc combo.
| Priority | File production | Placement | Brief composition |
|---|---|---|---|
| P1 | st_mus_menu_sunlit_shore_loop_v01.wav | Main menu / album. | 92 BPM, major pentatonic, ukulele muted + glass + surf pad; loop 60–75 s. |
| P1 | st_mus_map_rescue_journey_loop_v01.wav | Map level / future hub. | 88 BPM; motif hành trình rõ hơn menu; loop 60–90 s, không resolve liên tục. |
| P0 | st_mus_gameplay_calm_current_loop_v01.wav | L1–L6, puzzle state bình thường. | 84 BPM; mallet tối giản, shaker nhẹ, nhiều khoảng trống; loop 75–90 s. |
| P0 | st_mus_gameplay_mastery_tide_loop_v01.wav | L7–L9 hoặc state mastery. | Cùng key/motif với calm, thêm syncopation và marimba; crossfade 1.5 s. |
| P0 | st_mus_finale_grand_vortex_loop_v01.wav | L10. | 96 BPM, shell drum mềm + low surf pulse; tension có kiểm soát, không boss combat. |
| P0 | st_mus_result_full_rescue_stinger_v01.wav | Full Rescue result. | 3–4 s; nhận motif gameplay và resolve ấm; nhường chỗ cho rating cue. |
| P0 | st_mus_result_gentle_retry_stinger_v01.wav | Fail / near-miss result. | 2–3 s, unresolved nhưng hopeful; không dùng minor sad piano. |
Ambience tạo không gian biển nhưng phải nằm sau gameplay information. Gull và wind không được che preview/STOP ở loa điện thoại.
| Priority | File production | Placement | Behavior |
|---|---|---|---|
| P1 | st_amb_beach_day_loop_v01.wav | Menu/map base. | Stereo 60–90 s; surf xa, cát, không gull baked-in. |
| P0 | st_amb_shore_soft_loop_v01.wav | Gameplay base. | Stereo 45–60 s; low-mid sạch; duck 3–5 dB khi payoff. |
| P0 | st_amb_reservoir_water_loop_v01.wav | Hồ/Vùng Nước An Toàn. | Layer gần, loop 30–45 s; gain theo camera/scene, không theo số sao. |
| P1 | st_amb_palm_wind_loop_v01.wav | Map/menu optional layer. | High-cut để không hiss trên mobile; random gain chậm. |
| P1 | st_amb_gull_distant_{01,02,03}_v01.wav | One-shot map/menu. | Random 12–25 s; không phát trong result hoặc tutorial L1. |
| P0 | st_amb_wet_pit_subtle_loop_v01.wav | Board có Wet pit từ L5. | Layer rất nhẹ, có thể positional; dừng khi scene unload, không cần một loop cho mỗi pit. |
Sản xuất sau khi vertical slice Full Rescue v2 khóa trigger; giữ event contract hiện có để không mất đường tích hợp.
| Priority | File production | Runtime event | Direction |
|---|---|---|---|
| P1 | st_sfx_meta_chest_open_01_v01.wav st_sfx_meta_tide_bond_earned_01_v01.wav st_sfx_meta_coach_unlock_01_v01.wav st_sfx_meta_map_node_unlock_01_v01.wav st_sfx_meta_map_restore_01_v01.wav | progress.chest.open, progress.tideBond.earned, progress.coach.unlock, map.node.unlock, map.restore. | Cùng tonal family; restore lớn hơn unlock nhưng không lớn hơn gate finale. |
| P1 | st_sfx_secret_{reveal,activate,progress,complete}_01_v01.wav | Bốn event secret.*. | Glass-shell motif bí mật; progress có thể pitch theo ratio, complete resolve đầy đủ. |
| P1 | st_coach_dolphin_{intro,cheer}_01_v01.wav | coach.dolphin.intro, coach.dolphin.cheer. | Hai chirp nước nhanh, sáng; không giả tiếng cá heo tự nhiên quá gắt. |
| P1 | st_coach_turtle_{hint,recap}_01_v01.wav | coach.turtle.hint, coach.turtle.recap. | Wood/marimba trầm, chậm; recap bình tĩnh, không phán xét. |
| P1 | st_coach_whale_{calm,gate}_01_v01.wav | coach.whale.calm, coach.whale.gate. | Low harmonic swell; mono-compatible; tránh sub dưới 80 Hz trên mobile. |
Adapter giữ event semantic; sound engine chọn variant/intensity và chịu trách nhiệm cooldown, polyphony, ducking.
| Runtime event | Asset hoặc rule chọn file | Detail contract | Voice policy |
|---|---|---|---|
ui.tap | st_sfx_ui_tap_01–03 | Không cần detail. | Max 3 voice / 80 ms. |
cup.pick / cup.drop | pit_pick_01–03 / pit_commit_01–02 | Source node optional. | Pick thay voice cũ; commit không bị cắt. |
route.preview | route_preview_left/right | { direction: -1 | 1 } | Debounce 80 ms, thay preview cũ. |
route.stop | route_stop_01 | Node index optional. | Priority trên preview. |
sow.tick | Round-robin sow_tick_01–06 + pitch theo index. | { index: 0…n } | Max 4 voice; không drop tick đầu/cuối. |
capture.splash | Size 1–2 small, 3–4 medium, 5+ large; form cue phát trước. | { size: 1…12 } | Priority 3; duck ambience 2 dB. |
combo.wave | Clamp tier x2–x5. | { combo: 2…5 } | Một cue/tier/turn. |
rescue.starfish | Round-robin 4 variant; 1–4 note, lớn hơn gộp chord. | { count: 1…16 } | Max 4 voice; priority dưới combo. |
current.redirect | current_redirect_left/right | { direction: -1 | 1 } | Không drop; pan capped ±35%. |
level.win | Full Rescue stinger → rating 1/2/3 star. | { perfect, rating } | Ngắt gameplay loop bằng fade 250 ms. |
level.fail / nearMiss | Fail cue; near-miss thay bằng cue riêng nếu gate đạt. | { remaining, ratio } đề xuất. | Không phát đồng thời hai cue. |
level.gate.complete | result_gate_complete_01 | L10 only. | Priority cao nhất; tail không bị scene cut. |
wetPit.rescue, finalSweep.start/loop/end, combo.grandVortex và rating 1/2/3. Không map các state mới này tạm vào capture.splash vì sẽ làm sai nghĩa gameplay.Final mix được đánh giá trên loa điện thoại trước headphone.
Master gameplay khoảng −16 đến −14 LUFS-I, peak ≤ −1 dBTP. Music loop khoảng −20 LUFS-I, ambience −26 đến −24 LUFS-I; SFX chỉnh theo perceived loudness, không normalize từng file về cùng peak.
Gate/Full Rescue 5 → combo/capture 4 → commit/Current/STOP 3 → sow/UI 2 → ambience/music 1. Khi quá voice budget, drop ambience one-shot trước.
Capture duck music 3 dB/0.35 s; combo 5–7 dB/0.8 s; Full Rescue/gate 8–9 dB/1.0–1.5 s.
Kiểm tra speaker mono, low-volume và Bluetooth latency. Không đặt thông tin hướng chỉ bằng sub hoặc phase stereo.
Mọi STOP, warning, Current, fail và Full Rescue vẫn có visual/text. Respect mute, reduce motion và page visibility.
UI + core gameplay preload trước level; finale/meta lazy-load. Decode trước input đầu; dispose loop/timer khi scene unload.
| Gate | Điều kiện pass |
|---|---|
| Luật nghe được | Blind watch vẫn phân biệt preview, STOP, commit, Wet pit, Capture và Current. |
| Combo không vỡ mix | Chain x2–x5 tăng cảm giác nhưng master không pump, clip hoặc che rescue count. |
| L1 sạch | Không ambience one-shot dày, không warning thừa, không music accent giả hướng đúng. |
| L4/L5 đúng bài | Sweep khác Capture; Wet pit khác Xoáy; player không hiểu nhầm hai mechanic. |
| L10 có signature | Grand Vortex → Full Rescue → gate complete là ba nhịp liên tục, không chồng thành một khối ồn. |
| Lifecycle | Pause/tab hidden không tạo timer/loop trùng; retry 20 lần không tăng voice, CPU hoặc gain. |
| Settings | Mute và 5 bus volume lưu đúng; toggle off không phát tail ngoài ý muốn. |
| Export | Không click loop, không silence đầu quá chuẩn, metadata và version khớp manifest. |
Những cue dưới đây có trong GDD cũ hoặc event contract hiện tại nhưng chưa có trigger trong working branch v2.
| Trạng thái | Event / asset cũ | Lý do giữ ngoài P0 | Điều kiện mở lại |
|---|---|---|---|
| HOLD | sandLock.hit, sandLock.break | Full Rescue v2 không dùng Sand Lock; L10 tổng hợp luật đã học. | Level pack v2 thêm blocker và solver proof bao gồm durability. |
| HOLD | sunny.bonus và mọi Heat loop/alarm | V2 dùng giới hạn lượt, không có timer thời gian thực; Sun Heat thuộc GDD cũ. | Product owner khóa lại Environmental System trong runtime v2. |
| HOLD | booster.shellSwap, booster.rescueWave | Không có trong Full Rescue v2; Rescue Wave làm yếu agency nếu tự cứu cụm cuối. | Booster spec và solver contract được duyệt. |
| HOLD | VO thoại dài cho AI companion | Jam scope ưu tiên motif non-verbal; VO kéo theo script, casting, localization và lip-sync. | Dialogue list, ngôn ngữ, budget và recording plan được khóa. |
| HOLD | Daily/weekly/streak/shop/gacha audio | Thuộc long-term retention, không nằm trong 10 level v2. | Feature vào production backlog chính thức. |