HOLDLINE — Một cú chạm. Giữ vững thần kinh.
Game reflex-puzzle one-tap về cảm giác biết khi nào không nên chạm — mỗi cú TICK đổi switch và đốt năng lượng.
Thách thức
Thị trường mobile đầy game one-tap — Flappy Bird dạy người chơi tap nhanh, Helix Jump cho endless không có nhịp, Wordle có daily nhưng chỉ chữ. Cả ba đều thiếu một khoảng trống: một game nơi sự kiềm chế là kỹ năng.
HOLDLINE đẩy hướng đó. Hạt giấy tự chạy. Người chơi chỉ có một cú chạm để đổi hướng switch tiếp theo. Tap sai = chết. Tap thừa = hết tick energy = chết. Phần lớn switch trên đường đi không cần đổi — và đó chính là phần khó nhất: dám không tap.
Hướng tiếp cận
Ba nguyên tắc dẫn dắt thiết kế:
- Restraint as skill. Game không hỏi bạn tap nhanh thế nào. Game hỏi bạn có dám không tap.
- World breathes with you. Camera đứng yên. Thế giới giấy phản ứng theo hành động: gập, duỗi, chuyển palette khi streak đạt threshold.
- One effect = one emotion. Mỗi hiệu ứng phải gắn với một cảm xúc rõ ràng. Không nói được nó tạo cảm xúc gì → cắt.
Chuẩn thẩm mỹ: Mini Metro × ELOH — line geometry mảnh kể chuyện trên nền watercolor wash giấy ngà.
Cách chơi
- Hạt giấy tự chạy theo path trên board 7×7.
- Tap màn hình bất kỳ đâu để TICK — đổi switch tiếp theo.
- Mỗi TICK tốn 1 tick energy. Tới Goal: cộng điểm + tick energy + stage++.
- Game over khi hạt đâm tường, kẹt, hoặc hết tick energy.
- Chết xong → Death Replay tua lại 3 giây cuối cho bạn thấy chính xác cú tap nào đã giết run.
Trải nghiệm chính
Endless Survival
Stage càng cao, map càng phức tạp. Auto-save run đang chơi — đóng app giữa chừng, mở lại vẫn còn nguyên vị trí hạt. Best score giữ qua mọi phiên.
Daily Seed
Mỗi ngày một map duy nhất, sinh từ hash(UTC_YYYY-MM-DD) — toàn cầu cùng một thử thách. 5 modifier xoay tua thứ Hai–thứ Sáu (Tight Energy, Mirror Switch, Phantom Goal, Tempo Lock, Decoy Density). Score Card cuối run chia sẻ dạng emoji-grid kiểu Wordle.
Tempo Shift
Khi streak đạt threshold, world "thở nhanh hơn": BPM hạt + audio + palette dịch sang phase mới. Andante (80 BPM) → Allegro (110) → Vivace (140) → Offbeat. Telegraph 2 giây bắt buộc — không bao giờ trigger khi hạt trong vùng nguy hiểm.
Paper Fold
Khoảnh khắc near-miss signature. Khi TICK cứu kịp một va chạm, vùng tam giác 3×3 quanh hạt gập 18° rồi duỗi ra trong 280ms. Camera đứng yên, giấy phản ứng. Đây là lúc người chơi cảm được rằng thế giới đang sống cùng họ.
Death Replay
Mỗi run kết thúc đều quay lại 3 giây cuối, frame chậm, highlight đúng cú tap thừa hoặc switch lỡ. Mục tiêu: retry rate > 50% — vì người chơi hiểu họ sai chỗ nào.
7 Palette Family
Paper Dawn (mặc định) → Paper Noon, Dusk, Midnight, Storm, Rain, Bloom. Mỗi palette đổi hue toàn world nhưng giữ nguyên 5 vai trò màu (BG, switch line, hạt, goal, accent near-miss). Đẹp, không phá readability.
Thiết kế tôn trọng người chơi
Không cần đăng ký. Không quảng cáo cưỡng bức. IAP duy nhất là "No Forced Ads" — mua một lần, bỏ quảng cáo vĩnh viễn. Chơi offline 100%, không cần internet.
So sánh
| Tiêu chí | HOLDLINE | Flappy Bird | Helix Jump | Wordle |
|---|---|---|---|---|
| One-tap | Có | Có | Không (hold) | Không (text) |
| Restraint as skill | Có | Không (tap fast) | Không | Một phần |
| Daily Seed toàn cầu | Có | Không | Không | Có |
| Death Replay | Có | Không | Không | n/a |
| Offline 100% | Có | Có | Có | Không |
| Share emoji-grid | Có | Không | Không | Có |
| Không pay-to-win | Có | Có | Không (lives) | Có |
Kỹ thuật nổi bật
- Flutter vanilla —
CustomPainter+Ticker+Listener. Không Flame, không shader, không 3D. - Pure deterministic step() —
step(GameState, Input, dt) → GameStatethuần Dart, không Flutter import. Cùng codepath cho engine + solver. - PRNG
mulberry32— immutable state, fixed test vectors. Daily Seed cùng map across thiết bị. - 60fps trên Redmi Note 11/12 — dual-listener pattern:
GameLoop extends ChangeNotifiercho board paint,ValueNotifier<GameState>cho top-bar. - Active Run Resume — autosave mỗi 10 giây + tại stage transition. Đóng app giữa run, mở lại Continue/New Run.
- Bundle nhỏ — asset critical < 500 KB, install size < 25 MB, App Bundle < 18 MB.
- Daily Seed share —
RepaintBoundary→toImage→share_plus. Không cần backend.
Tải ứng dụng
Trải nghiệm native.
