Shell Tide · Working Design Branch

Full Rescue GDD v2

Mỗi level chỉ thắng khi toàn bộ sao biển đã vào Vùng Nước An Toàn. Các node chạy quanh chu vi vuông; hồ trung tâm kể câu chuyện nguồn nước nhưng không tham gia state solver.

Tách biệt GDD chính Đã tích hợp playable data-driven 10/10 map có exact solver proof Starfish-only Wet pit là modifier từ L5 Hồ trung tâm visual-only Solver-gated
Trạng thái: level pack full-perimeter đã có proof cho 10/10 map và được playable data-driven sử dụng trực tiếp. Các con số dưới đây là kết quả exact BFS; vẫn cần playtest cảm xúc trước khi khóa production balance.

North Star: cứu hết, không cứu một phần

Player promise mới: “Mình đã tự mở Dòng Chảy và đưa tất cả sao biển về vùng nước an toàn.” Mỗi token biến mất khỏi board phải mang ý nghĩa cứu hộ, không phải dọn filler.

Chọn hố cát
So sánh hai FLOW
Canh STOP
Tạo Xoáy
Cứu sạch board
Clarity

Một token, một mục tiêu

10 level đầu chỉ có sao biển. Không dùng sò làm filler vì làm loãng ý nghĩa cứu hộ.

Agency

Không tutorial lock

Player được chọn mọi hố và hướng hợp lệ. Preview giải thích outcome nhưng không auto-pick.

Payoff

Full Rescue là khoảnh khắc thắng

Level không kết thúc sớm khi mới cứu một phần. Cụm cuối phải rời board trước màn kết quả.

Mở đầu player mới: bài hát mùa hè → lời kêu cứu

Trạng thái: thiết kế onboarding đã chốt để triển khai sau; chưa được xem là runtime hoàn chỉnh. Flow này chỉ chạy khi splash xác định isNewPlayer === true. Returning player bỏ qua toàn bộ cinematic và vào thẳng menu sau khi preload hoàn tất.

Ngâm nga mùa hè
Ra bãi biển
Nước và dấu chân xuất hiện
Cá Heo cầu cứu
Tạo hồ sơ player

State machine và choreography layer

StateVisual / chuyển độngCopy và inputĐiều kiện chuyển
NEW_PLAYER_CHECK Đọc rescueFlowPlayerProfileV1 và legacy progress. Nền cát được phép hiện ngay; khung loading thường bị ẩn. Không yêu cầu input. Nếu storage bị chặn, tiếp tục bằng profile trong phiên và ghi cờ persistenceAvailable: false. Chỉ vào flow dưới đây khi isNewPlayer === true; player cũ chuyển thẳng sang preload menu.
HUMMING_INTRO Tạm ẩn hoàn toàn foreground biển/foam và toàn bộ footprint. Chỉ giữ bãi cát. Lyrics nằm ngay trong dialogue box RPG ở vùng bottom với speaker “Bạn”. Câu hát dùng cùng typography và căn lề như lời thoại thường; một icon nhạc nhỏ đứng cạnh câu để thể hiện Player đang ngân nga. Karaoke chạy lần lượt: “Chớ âu lo để làm gì” → “Hè về là ta phải đi thôi” → “Tuổi xuân nào đâu có chờ đợi...”. Chữ chưa đến lượt không được hiện mờ. Icon nhạc và câu cuối hoàn tất chu kỳ mở đầu khoảng 10 giây.
PLAYER_MONOLOGUE Lyrics rút khỏi màn hình. Mở dialogue box RPG ở đáy màn hình, có speaker label của player, typewriter nhanh và affordance tiếp tục. Player: “Ôi mấy nay trời nóng quá, phải đi tắm biển thôi...” Player bấm/click hoặc nhấn Space/Enter để tiếp tục. Player xác nhận hội thoại; không tự bỏ qua câu đầu nếu chưa có input.
TIDE_REVEAL Foreground biển/foam chuyển từ alpha 0 → 1 bằng fade mềm khoảng 1,2–1,6 giây. Không slide nguyên layer và không flash trắng. Sau câu “phải đi tắm biển thôi”, dialogue box ẩn hoàn toàn trong khoảng 8 giây để Player quan sát footprint đi dạo trên bãi biển. Hết khoảng nghỉ mới hiện dialogue bottom: Player: “Nước biển mát quá! Tắm biển thật tuyệt vời.” Foreground đạt alpha 1 và asset đã decode.
BEACH_WALK Footprint trái/phải dùng lại route chéo cũ dọc theo mép biển, xuất hiện so le với khoảng bước ổn định. Mỗi dấu vẫn có random offset/rotate nhỏ; dấu cũ fade trước khi loop reset. Route giữ một hướng đi rõ ràng và không cắt vào vùng nước. Dialogue bottom có thể chạy 1–2 câu ngắn như “Cát ấm thật, nhưng sát mép nước thì dễ chịu hơn nhiều.” Không chặn flow quá lâu. Sau một vòng đi ngắn hoặc khi player advance dialogue.
DOLPHIN_ENTRANCE Dùng visual Cá Heo từ prototype Agent Cá Heo. Avatar đi từ ngoài border phía trên xuống rìa bãi biển, opacity tăng dần 0 → 1 và dừng trên phần cát sát foam. Trong onboarding phải ẩn nút mở chat panel và nút realtime speech; mic cũng tiếp tục hidden. Không cho kéo avatar trong cinematic. Bubble Cá Heo xuất hiện sau khi avatar đã đọc được rõ, không xuất hiện trước nhân vật. Avatar đến anchor shoreline và entrance animation kết thúc.
RESCUE_REQUEST Giữ Cá Heo ở rìa bãi biển; dialogue box RPG lớn phía dưới luân phiên speaker “Cá Heo” và “Bạn”. Tạm ẩn speech bubble nhỏ trên đầu Dolphin để tránh hiển thị hai khung thoại cùng lúc. Có nút xác nhận rõ, không dùng chat tự do ở bước này. Cá Heo: “Bạn ơi, giúp mình với! Mấy bạn sao biển ham chơi nên chưa kịp về trước khi thủy triều rút. Nếu không đưa các bạn ấy về nước ngay, nắng nóng sẽ làm các bạn ấy kiệt sức mất!”
Player choice: “Được, mình sẽ giúp!”
Disabled choice: “Mình không rảnh” chỉ hiển thị làm lựa chọn phụ, luôn mờ và không thể bấm trong onboarding.
Player bấm nút đồng ý. Không tự đồng ý thay player.
PROFILE_SETUP Mở popup profile trên nền scene hiện tại; khóa input phía sau nhưng vẫn giữ Cá Heo và bãi biển như context. Cá Heo hỏi thông tin cơ bản. Form gồm Nam/Nữ, nicknamengôn ngữ. CTA chính: “Bắt đầu cứu hộ”. Form hợp lệ; profile được lưu và đồng thời upsert vào global shared memory. Nếu storage bị chặn, chấp nhận fallback trong phiên.
WELCOME_COMPLETE Đóng popup, giữ Cá Heo làm coach mặc định và chuyển thẳng vào Level 1 tại game/play/shell-tide-playable.html, bỏ qua menu ở lần đầu. Không phát lại cinematic ở lần mở sau. Set welcomeStatus: "completed"welcomeCompletedAt.

Contract dialogue RPG

Presentation

Một dialogue box xuyên suốt, không phải chat panel

Lyrics và lời thoại dùng chung dialogue box RPG ở bottom. Khi ngân nga, box vẫn hiển thị speaker “Bạn” và text như lời thoại thường, chỉ thêm một icon nhạc nhỏ; từng câu được thay nguyên dòng theo nhịp thay vì chạy màu karaoke. Khi trò chuyện, cùng box dùng typewriter ngắn và indicator tiếp tục. Chat tự do/realtime speech không xuất hiện trong onboarding vì làm loãng nhịp kể chuyện và xin thông tin quá sớm.

Input

Player chủ động advance

Click/tap, Space hoặc Enter chỉ advance khi câu hiện tại đã render xong; input đầu tiên khi typewriter đang chạy chỉ hoàn tất câu, input tiếp theo mới chuyển câu.

Tone

Khẩn cấp nhưng thân thiện

Nguy cơ nắng nóng phải rõ để tạo động lực cứu hộ, nhưng production copy ưu tiên “kiệt sức” thay cho mô tả quá graphic. Cá Heo lo cho bạn bè, không trách mắng sao biển.

Skip policy

Chưa cho skip trước lời cầu cứu

Bản đầu tiên không hiện nút skip trước khi player hiểu lý do cứu sao biển. Sau khi profile đã lưu, mọi lần mở tiếp theo bypass toàn bộ sequence.

Popup hồ sơ player và persistence

FieldUI / validationStorage contract
Giới tínhHai lựa chọn Nam/Nữ, một lựa chọn tại một thời điểm.gender: "male" | "female"
NicknameTrim khoảng trắng; 2–16 ký tự; báo lỗi inline; không dùng nickname làm định danh kỹ thuật.nickname; player identity vẫn dùng playerId.
Ngôn ngữMặc định theo locale browser nếu hỗ trợ, fallback tiếng Việt. Cho player đổi trước khi submit.locale: "vi" | "en" ở scope profile/settings.
Shared memoryNickname, giới tính và ngôn ngữ là thông tin do Player xác nhận, hữu ích cho mọi Tide Coach. Đánh dấu chính sách Important + Durable + Safe + Shared và mức ưu tiên sản phẩm very-important.Upsert player.nickname, player.gender, player.localeplayer.profile_importance = "very-important" vào shellTide.globalSharedMemory.v1.
OnboardingChỉ complete sau khi form hợp lệ và CTA được bấm.welcomeStatus: "completed", welcomeCompletedAt.

Coach briefing khi vào thẳng Level 1

NhịpChủ đềCopy ngắn của Cá Heo
1/4Mục tiêuĐưa tất cả sao biển về Vùng Nước An Toàn trước khi hết lượt.
2/4Core ruleChọn hố có sao, xem trước hai hướng, rải từng ô; vị trí sao cuối dừng lại là STOP.
3/4Dòng ChảyDòng Chảy là đường sáng mà sao sẽ đi; canh STOP để phía trước có một ô trống rồi tới cụm sao.
4/4Sóng Cứu HộKhi Dòng Chảy gặp đúng ô trống và cụm sao, Sóng Cứu Hộ đưa cả cụm về vùng an toàn.
NEW_PLAYER_CHECK → HUMMING_INTRO → PLAYER_MONOLOGUE → TIDE_REVEAL → BEACH_WALK → DOLPHIN_ENTRANCE → RESCUE_REQUEST → PROFILE_SETUP → WELCOME_COMPLETE → PLAYABLE LEVEL 1 / DOLPHIN BRIEFING Returning player → preload menu → MENU

Acceptance criteria khi triển khai

  • Player mới không thấy khung loading, foreground biển hoặc footprint trong HUMMING_INTRO.
  • Lyrics dùng typography của lời thoại thường, có một icon nhạc nhỏ; chỉ câu đang hát được hiển thị và timing khớp sequence 10 giây.
  • Dialogue RPG không bị menu preload hoặc asset decode làm gián đoạn.
  • Foreground biển fade alpha mượt; footprint chỉ bắt đầu sau khi player xác nhận câu “đi tắm biển”.
  • Footprint đi theo route chéo cũ dọc bờ biển, hai chân trái/phải so le, không cắt qua nước và mờ dần trước khi loop.
  • Cá Heo đi từ border trên tới shoreline; chat panel, realtime speech và mic đều hidden trong onboarding.
  • Lời cầu cứu phải xuất hiện trước popup profile; profile không được mở tự động khi player chưa đồng ý giúp.
  • Submit profile persist giới tính, nickname, locale, upsert bốn record ưu tiên cao vào global shared memory và đánh dấu welcome complete; returning player không phát lại cinematic.
  • Player mới đi thẳng vào Level 1; briefing của Dolphin chỉ hiện khi Level 1 chưa từng có preview/commit/win/fail/reward và chưa completed. Event level_start do preload không được tính là đã chơi. Briefing khóa input board trong bốn câu ngắn và kết thúc bằng CTA “Bắt đầu Level 1”.
  • Nếu storage bị chặn, flow vẫn đi tiếp trong phiên và báo trạng thái persistence để runtime xử lý.
  • Reduced-motion thay entrance/path bằng pose tĩnh và fade ngắn, nhưng không bỏ dialogue hoặc thông tin cần thiết.

Glossary · thuật ngữ gameplay và solver

Cùng một thuật ngữ phải có một nghĩa duy nhất giữa GDD, preview, runtime và solver. Tên hướng mô tả logic graph; không được suy diễn chỉ từ vị trí hình học trên màn hình.

Board và Dòng Chảy

Thuật ngữPlayer-facingĐịnh nghĩa runtime / solver
NodeMột vị trí trên vòng Dòng Chảy.Một phần tử có index, type, số sao khởi tạo, vị trí layout và hai cạnh logic trái/phải.
Hồ trung tâm · Center LakeNguồn nước thị giác cấp nước ra bốn phía để khai thông FLOW quanh board.layout.centerLake, không phải node: không có index, không chứa sao, không thể chọn, không nằm trong edges, nodeCount, objective hoặc state solver. Phiên bản này không có water meter.
Hố cát · Sand nodeHố player có thể chọn để bắt đầu rải sao.Node type: "sand". Chỉ sand node có ít nhất một sao mới là nguồn của legal move.
Sao khởi tạo · Init starfishSố sao nằm sẵn trong hố khi level bắt đầu.node.starfish được set cứng trong level pack. Tổng init starfish là objective Full Rescue của level.
Wet pitCửa nước cứu hộ nâng cao nằm trên FLOW; sao đi vào đây được đưa ngay về Vùng Nước An Toàn.Không xuất hiện trong L1–L4; được giới thiệu lần đầu ở L5 sau khi player đã hiểu Xoáy. Node type: "wet_pit" luôn rỗng và không thể chọn. Wet pit không phải ô quan/ô trời và không bắt buộc có hai cái.
TopologyTrật tự các node mà Dòng Chảy có thể đi qua.Graph xác định quan hệ giữa node, độc lập với ảnh nền hoặc tọa độ CSS.
Topology left/rightHai hướng FLOW player được chọn.edges.left[index]edges.right[index] trả về node kế tiếp. Hai cạnh phải reversible. “Trái/phải” là hướng logic quanh graph, không luôn đồng nghĩa đi sang trái/phải trên màn hình.
FLOW · Dòng ChảyĐường các sao sẽ đi sau khi player chọn hố và hướng.Chuỗi node được traversal qua topology; mỗi sao trong hố nguồn được xử lý tuần tự.
RouteĐường preview cụ thể của một nước.Danh sách có thứ tự { index, order, direction, currentTurn } được simulation trả về.
STOPNode nơi sao cuối cùng của tay rải kết thúc hành trình.Cursor sau khi xử lý toàn bộ số sao trong hố nguồn. Capture bắt đầu kiểm tra từ node kế tiếp sau STOP theo hướng cuối cùng.
Current ArrowHố rải một chiều: nếu cầm sao từ hố này, player chỉ được rải theo hướng mũi tên.currentDirection: -1 | 1 giới hạn legal move khi node Current là nguồn. FLOW đi ngang qua từ node khác không đổi hướng. Preview tại hố Current chỉ hiển thị một route hợp lệ.

Rescue và kết thúc level

Thuật ngữPlayer-facingĐịnh nghĩa runtime / solver
RescueMột hoặc nhiều sao rời board và vào Vùng Nước An Toàn.Xảy ra khi sao đi vào wet pit, một cụm bị capture hoặc Final Tide Sweep kích hoạt.
Ô trống hợp lệĐiểm có thể hình thành Xoáy Cứu Hộ.Node có 0 sao, nằm ngay trước một sand node đang có sao theo hướng FLOW sau STOP.
Cụm giàu sao · Rich clusterCụm sao ngay sau một ô trống hợp lệ.Toàn bộ số sao ở rich sand node được capture cùng lúc; không tách một phần cụm.
Xoáy Cứu Hộ · CaptureXoáy tại ô trống hút cụm sao kế tiếp khỏi cát.Rule ô trống → rich sand node. Capture làm rich node về 0 và tăng rescue count bằng kích thước cụm.
Chuỗi Xoáy · Capture chainNhiều Xoáy nối tiếp trong cùng một turn.Sau một capture, solver tiếp tục kiểm tra pattern ô trống → cụm giàu sao kế tiếp theo cùng hướng.
Final Tide SweepĐợt nước cuối cuốn cụm sao còn lại về vùng an toàn.Tắt ở L1–L3 để player học Xoáy thuần túy; bắt đầu giới thiệu ở L4. Khi được bật, chỉ chạy nếu turn vừa tạo ít nhất một rescue hợp lệ và board còn đúng một sand node có sao.
Full RescueToàn bộ sao biển của level đã được cứu.remainingStarfish === 0. Đây là điều kiện thắng bắt buộc; đạt điểm hoặc dùng hết route không thể thay thế.

Lượt, rating và solver

Thuật ngữĐịnh nghĩaKhông tính là turn
Turn · LượtMột legal move đã commit: chọn sand node có sao, chọn hướng và thực thi sow/capture. Mỗi commit tăng turnsUsed đúng 1.Xem preview, đổi hố đang chọn, mở Hint, bật âm thanh, thao tác invalid hoặc restart.
turnsUsedSố turn player thực tế đã commit trong attempt hiện tại.Không phải số lần click hoặc số đoạn route.
optimalTurns · OSố turn Full Rescue nhỏ nhất được exact BFS chứng minh cho board khởi tạo.Không phải target designer tự đặt.
recoverySlack · RKhoảng lượt bổ sung cho phép player phục hồi sau nước chưa tối ưu; lấy từ emotion seed và P75 plausible completion paths, thường clamp 2–4.Không được tăng chỉ để che một board thiếu clarity.
maxTurnsGiới hạn commit của một attempt: O + R. Nếu đã dùng hết giới hạn mà còn sao, level game over.Không phải timer thời gian thực.
Rating stars3★ nếu dùng đúng optimal; 2★ trong nửa đầu slack; 1★ nếu Full Rescue trong maxTurns; 0★ nếu chưa Full Rescue.Không phải số sao biển đã cứu.
Plausible pathĐường chơi gồm các nước có ý nghĩa nhìn thấy được: rescue, setup ô trống, đi qua wet pit hoặc còn đường phục hồi hợp lý.Không gồm chuỗi click ngẫu nhiên chỉ để kéo dài attempt.
Dead moveNước hợp lệ về input nhưng không rescue, không tạo setup hữu ích và làm giảm rõ khả năng full-clear.Dead move không được dùng để nới maxTurns.
Near-miss · Missing a pieceAttempt thất bại khi player đã cứu phần lớn sao và chỉ còn một rescue target rõ, thường có thể full-clear nếu được thêm đúng một lượt.Không phải fail khi board còn nhiều cụm rời rạc hoặc player không hiểu mình thiếu gì.
Exact BFS solverDuyệt state graph theo chiều rộng; lần đầu gặp Full Rescue là minimum-turn proof. State key hiện là phân bố số sao trên các node.Không mô phỏng xác suất lựa chọn hoặc cảm xúc của player thật.
Ví dụ topology full-perimeter 8 node: edges.right = [1, 2, 3, 4, 5, 6, 7, 0] edges.left = [7, 0, 1, 2, 3, 4, 5, 6] Chọn node 0 + hướng right: 0 → 1 → 2 → 3 → 0 ... Nếu node 2 có Current Arrow left: - Chọn node 2: chỉ được rải 2 → 1 → 0 ... - Route từ node 0 đi ngang node 2: vẫn tiếp tục 0 → 1 → 2 → 3 ...

Luật gameplay đã khóa

Hệ thốngContract player-facingLuật runtime dự kiếnTrạng thái
Sao biểnMọi sao trên board đều cần được cứu.remainingStarfish === 0 là điều kiện thắng bắt buộc.Đã khóa
Hố cátNode có thể chọn để bắt đầu rải.Board dùng đủ chu vi: 8 node ở grid 3×3 hoặc 12 node ở grid 4×4; một số node có thể là Wet pit.Đã khóa
Hồ trung tâmNguồn nước nối tới hố bắt đầu khi player commit turn.Chỉ là layout/VFX; không phải node, không giữ sao, không có tài nguyên nước và không thay đổi luật solver.Đã khóa
Wet pitModifier nâng cao xuất hiện từ L5.L1–L4 không có Wet pit. Từ L5, sao đi vào đây được cứu trực tiếp; Wet pit không bắt buộc có hai cái.Đã khóa
Xoáy Cứu HộÔ trống hợp lệ hút cụm sao kế tiếp.Giữ rule capture trống → cụm giàu item và biểu diễn bằng Vortex.Đã khóa
Final Tide SweepSau rescue cuối, dòng nước cuốn cụm sao còn lại vào vùng an toàn.Tắt ở L1–L3, giới thiệu có chủ đích tại L4; từ đó chỉ kích hoạt sau một rescue hợp lệ và khi board còn đúng một cụm sao.Đã khóa
Game overHết Tide Turns mà vẫn còn sao.turnsUsed >= maxTurns && remainingStarfish > 0.Đã khóa

Board contract: chu vi vuông quanh hồ nguồn

Gameplay vẫn là graph vòng hai chiều, nhưng graph được map lên chu vi grid vuông. Hồ ở giữa chỉ giải thích nguồn nước và cung cấp điểm xuất phát VFX; thay đổi layout không làm thay đổi optimal path hoặc state solver.

3×3

Board đủ 8 node

Dùng toàn bộ 8 slot chu vi và dành đúng ô 1×1 ở giữa cho hồ. L1–L7 và L9 dùng template này.

4×4

Board đủ 12 node

Dùng toàn bộ 12 slot chu vi và vùng 2×2 ở giữa cho hồ. L8 và L10 dùng template này.

Data

Layout tách khỏi topology

Mỗi level lưu nodes[], edges.left/right, layout.slots[]layout.centerLake. Hồ không được thêm vào state key.

Water source

Bốn nhánh cấp nước

Canvas/VFX vẽ bốn kênh từ hồ tới chu vi; khi commit, nhánh tới hố nguồn sáng lên rồi FLOW chạy theo cạnh trái hoặc phải.

Readable

Không quá tải

Chỉ thêm node khi player đã đọc được FLOW, STOP và Xoáy ở board trước.

Fair

Hai lựa chọn có nghĩa

Từ mid-game, mỗi state quan trọng cần ít nhất hai route hợp lệ: safe và mastery.

Visual

Node không chồng nhau

Layout phải giữ sao biển cùng kích thước, route arrow rõ và hit target không bị sprite tràn che.

8 node → grid 3×3 → hồ giữa 1×1 → dùng đủ 8 slot chu vi 12 node → grid 4×4 → hồ giữa 2×2 → dùng đủ 12 slot chu vi nodeCount = số node gameplay trên chu vi centerLake ∉ nodes, edges, objective, turns, solver state

Rating 1–3 sao theo hiệu suất lượt

Rating chỉ được tính sau Full Rescue. Hint, coach hoặc booster không trực tiếp trừ sao; chúng chỉ có thể làm player dùng nhiều lượt hơn. Điều này giữ rating công bằng và dễ giải thích.

optimal = số lượt full-clear nhỏ nhất do solver chứng minh max = giới hạn lượt trước game over used = số lượt player thực tế đã commit 3 sao: used === optimal 2 sao: used <= optimal + ceil((max - optimal) / 2) 1 sao: used <= max 0 sao: chưa cứu hết hoặc vượt max

Tính maxTurns từ khả năng phục hồi, không cộng lượt cảm tính

maxTurns phải đủ rộng để một nước chưa tối ưu vẫn cứu được, nhưng đủ chặt để sai thêm một bước tạo near-miss “thiếu đúng một mảnh”. Solver cần duyệt các đường chơi hợp lý: nước vẫn tạo FLOW, rescue, setup hoặc tiến triển nhìn thấy được; không đưa dead move hay click ngẫu nhiên vào mẫu balance.

O = optimalTurns do solver chứng minh D = tập completionTurns của các đường chơi hợp lý R = clamp(max(emotionSeed, percentile75(D) - O), 2, 4) maxTurns = O + R Mục tiêu cảm xúc: 1 sai lầm hợp lý → vẫn có đường phục hồi 2 sai lầm → Full Rescue sát giới hạn sai thêm 1 bước → game over khi còn đúng một cụm sao
Plausible path

Nước chưa tối ưu vẫn phải có ý nghĩa

Chỉ lấy mẫu các nước tạo rescue, tạo ô trống chiến lược, đi qua wet pit hoặc cải thiện khoảng cách tới full-clear. Dead move được đo riêng, không dùng để nới maxTurns.

P75 recovery

Cho phần lớn player một cơ hội sửa sai

Percentile 75 giữ khoảng 70–80% đường chơi hợp lý trong vùng có thể thắng, nhưng không biến level thành chuỗi lượt dư không áp lực.

Floor

Tối thiểu +2 lượt

Level rất ngắn vẫn cần khoảng thở và đủ band 3★, 2★, 1★. Ví dụ O=1 nên bắt đầu thử với max=3.

Ceiling

Thông thường không quá +4

Nếu cần hơn bốn lượt phục hồi, ưu tiên sửa board, giảm node hoặc tăng clarity thay vì tiếp tục bơm lượt.

Exception

Solver và playtest có quyền phủ quyết

Khoảng +2 đến +4 là seed tuning, không phải luật cứng. Chỉ giữ khi distribution state cuối đạt đúng cảm xúc mong muốn.

Seed recovery slack theo nhịp cảm xúc

Nhóm levelRecovery slack khởi điểmÝ đồ
L1–L2 · Xoáy coreR = 2Thắng sớm bằng Capture thuần túy; L2 cho phép sửa một setup turn chưa tối ưu.
L3 · Capture chainR = 2Đủ chỗ đọc chuỗi Xoáy mà chưa trộn Sweep hoặc Wet pit.
L4 · Sweep payoffR = 3Giới thiệu Final Tide Sweep sau ba level đã khóa mental model Xoáy.
L5 · Wet modifierR = 3Cho player thử cửa cứu trực tiếp nhưng optimal path vẫn kết hợp với Capture.
L6 · ReliefR = 3–4Nhiều wet pit/route thắng và tỷ lệ pass cao sau tension.
L7–L8 · MasteryR = 2–3Rating phân hóa rõ giữa safe route và đường 3 sao.
L9 · RewardR = 3Full-clear ngắn, rộng tay và có cảm giác nhận thưởng.
L10 · FinaleR = 3–4Cho phép phục hồi một lỗi đọc route nhưng vẫn giữ climax.

Acceptance gate cho cảm giác “missing a piece”

  • Ở các fail path phổ biến, player đã cứu khoảng 70–90% tổng số sao.
  • State cuối chỉ còn một cụm sao hoặc một rescue target rõ, không còn nhiều cụm rời rạc gây cảm giác board hỗn loạn.
  • Nếu được thêm đúng một lượt, state near-miss phải có ít nhất một nước full-clear nhìn thấy được trong preview.
  • Fail recap chỉ vào cụm còn thiếu hoặc vùng STOP lệch; không hiển thị exact move.
  • Một sai lầm hợp lý còn phục hồi được; sai thêm một bước thường đẩy player sang band 1 sao hoặc game over.
  • Nếu player thường hết lượt khi còn hơn 30% sao, phải sửa board/clarity trước khi tăng maxTurns.
★★☆ · 2 sao
3 sao

Đường giải tối ưu

Chứng minh mastery và tạo động lực replay mà không bắt buộc cho progression.

2 sao

Giải tốt

Cho phép một phần slack để player thử nghiệm nhưng vẫn cảm thấy hiệu quả.

1 sao

Full Rescue hợp lệ

Player đã cứu hết trong giới hạn và luôn được tiến sang level kế tiếp.

Cây 10 level · solver-designed v2

Node, wet pit, tổng sao và lượt dưới đây lấy trực tiếp từ level pack/proof độc lập. optimal là minimum depth exact BFS; max bằng optimal cộng recovery slack đã clamp trong khoảng 2–4.

LevelNhịp cảm xúcNode / Wet pitSao phải cứuTrọng tâm duy nhấtO / P75 / Max
L1Wow · mình tạo được Xoáy8 / 05Ô trống → cụm sao → Xoáy; không Sweep1 / 7 / 5
L2“À, mình hiểu rồi”8 / 05Một turn setup → một turn tạo Xoáy2 / 7 / 6
L3Combo dopamine8 / 06Nhiều Capture nối tiếp; không Sweep3 / 7 / 7
L4Payoff · nhẹ nhõm8 / 08Giới thiệu Final Tide Sweep3 / 5 / 6
L5Khám phá modifier8 / 110Wet pit xuất hiện lần đầu3 / 5 / 6
L6Relief8 / 26Hai cửa cứu, nhiều route thắng2 / 4 / 6
L7Mastery8 / 112Safe route và route 3 sao3 / 5 / 6
L8Challenge có kiểm soát12 / 113Current Arrow khóa hướng rải tại hố nguồn3 / 6 / 6
L9Reward · thở ra8 / 27Ripple Preview, full-clear ngắn2 / 4 / 5
L10Grand finale12 / 216Đại Xoáy tổng hợp FLOW + Current4 / 6 / 8
Proof status: cả 10 level có đường full-clear tối ưu và có ít nhất một completion path trong từng band 3★, 2★ và 1★. Đây là computational proof; tỷ lệ pass/retry/near-miss vẫn cần playtest người thật.

Diễn hoạt 10 lời giải tối ưu

Canvas dưới đây tái hiện đúng state khởi tạo và từng transition trong optimalPath của exact solver. Đây là công cụ đọc map cho designer, không phải mockup art direction hoặc playable chính thức.

O: 1 · Max: 5 · 48 state đã duyệt
Bước 0 / 1 · Init

Cách đọc: hồ aqua ở giữa là nguồn nước visual-only; đường aqua nối hồ với hố bắt đầu; đường coral là route vừa rải quanh chu vi vuông; viền đỏ là hố được chọn; viền vàng là STOP. Dùng Prev/Next để đối chiếu state.

Solver gate trước khi một map được duyệt

Solver phải chạy đúng simulation runtime, không dùng luật rút gọn khác gameplay. Một level chỉ được chuyển từ draft sang playable khi có bằng chứng tái lập được.

Proof

Minimum-turn proof

BFS/graph search trả về đường full-clear ngắn nhất, board fingerprint, số state đã duyệt và exact move path.

Fairness

Không chỉ có một đáp án mù

Kiểm tra safe route, mastery route, dead-move rate, khả năng hồi phục sau một nước chưa tối ưu và near-miss còn cứu được.

Implementation

Exact solver và artifact

Level pack v2 · Solver proof v2 · Solver module. Chạy lại bằng npm run test:full-rescue; tái sinh board bằng node scripts/design-shell-tide-full-rescue.mjs --write-levels; ghi proof bằng node scripts/solve-shell-tide-full-rescue.mjs --write-proof.

Search model

Exact BFS

State key là phân bố sao trên graph. Mỗi transition mô phỏng sow, wet-pit rescue, giới hạn hướng rải của Current Arrow, capture chain và Final Tide Sweep.

Current result

10/10 solvable

L1–L3 không có Wet pit hoặc Sweep; L4 giới thiệu Sweep; L5 mới mở Wet pit. Optimal tăng từ 1 lên 4 lượt và L10 duyệt 16.124 state để chứng minh minimum 4 lượt.

  • Objective bằng đúng tổng số sao biển ban đầu.
  • Ít nhất một đường full-clear tồn tại trong maxTurns.
  • optimalTurns bằng minimum depth solver tìm được, không phải số designer mong muốn.
  • Solver xuất distribution completionTurns của plausible paths, percentile 75 và recoverySlack đề xuất.
  • maxTurns phải tái lập được từ optimalTurns + recoverySlack; mọi override cần ghi rõ lý do cảm xúc hoặc fairness.
  • 3 sao, 2 sao và 1 sao đều có ít nhất một đường chơi hợp lệ khi level cần hỗ trợ đủ ba band.
  • Fail-state audit xác nhận phần lớn near-miss còn 10–30% sao, tập trung trong một rescue target rõ.
  • Không có state soft-lock trước khi hết lượt nếu UI vẫn báo còn nước hợp lệ.
  • L1–L4 bắt buộc wetPitRescue: false; L1–L3 đồng thời đặt finalTideSweep: false. L4 mới bật Sweep và L5 mới có Wet pit.
  • L1–L3 khóa mental model Xoáy; L4 là payoff; L5 mở modifier; L6/L9 là relief; L10 là tổng kết chứ không thêm luật ẩn.

Nguồn thiết kế và ràng buộc

Working draft này kế thừa North Star FLOW/Xoáy, rubric, emotion curve và retention direction; chỉ thay objective, topology board và hệ rating lượt.