Bản port hiện chạy 100% offline. Game gốc com.block.juggle lại đã là client-server. Tài liệu này liệt kê backend làm được gì, nhóm theo mức độ bám game thật và gắn bằng chứng trong repo.
Khoảng cách giữa hai bên chính là danh sách việc của backend.
POST unigate-prod.afafb.com/game_init lấy configbband1.afafb.com/.../chapter_lev/line/<key>/<Num>.jsonhash(uid) và lịch sử analytics, phía serverjsb.sqlite (41 key)userIdgameInitConfig.tslocalStorage: bb_classic_persist, bb_progress, bb_daily_streak, bb_settings…game_init đã thu để xác nhận configOFFER_TYPE (thuật toán sinh khối)OFFER_TYPE không phải shop hay IAP. Đó là catalog thuật toán sinh khối (offerBlock trong libtask.so) thuộc các họ BASE, SHANG (entropy), BLANK (fill-clear), DIFFICULTY, DIE. "Backend chọn offer" nghĩa là chọn chiến lược sinh khay 3 khối cho người chơi. IAP, ads, analytics nằm ngoài phạm vi theo docs/PRD.md.Những thứ game gốc đã gọi lên server. Dựng lại đúng hợp đồng đó thì client port không cần đổi nhiều.
game_initPhục vụ đúng payload mà gameInitConfig.ts đang bake cứng. Bật/tắt feature và chỉnh độ khó mà không build lại client.
state | bật/tắt experiment theo người chơi |
exceedAimScore firstGameScore ratioDown exceedScore | điểm mục tiêu / độ khó |
reviveLimit {per, score} | giới hạn hồi sinh, vd {per:0.8, score:3000} |
blockLimitClassics classicsRandomReplace fillExclude DifferentStrategyDie | tinh chỉnh sinh/thay khối |
game/assets/scripts/logic/config/gameInitConfig.ts:1-38Gốc chia bucket bằng hash(uid) cộng lịch sử analytics. Backend làm được: chia nhóm, gán experiment variant (tức chọn OFFER_TYPE nào kích hoạt), đo lường, rollout dần theo %.
logic/strategy/OfferType.ts:18, logic/data/offer-algo-sdk-map.ts, docs/port/OFFER_TYPE_FULL_CATALOG.md, docs/port/analysis/classic-block-gen-libtask.md:141-144Phục vụ định nghĩa level thay vì nhúng sẵn. Hiện chỉ Level 1 có Map thật, nên backend là chỗ tự nhiên để chứa và cấp phát phần còn lại.
Map: board 8×8, -1 là ô trống, N≥1 là block màu NCondition: score_to_win (Way 0, Level 1 = 368 điểm, ramp 368 đến 1566) hoặc collect (Way 1, màu 101 đến 106)docs/port/JOURNEY-HOME-RESEARCH-SPEC.md:82-203, docs/port/journey-data/chapter_levels.json, view/ChapterMapView.tsChuỗi block gốc là adaptive (churn-prediction LightGBM), hiện fail-closed vì chưa có bảng policy. Backend host bảng policy/model để chỉnh độ khó theo churn-tier từng người, đúng cơ chế gốc.
logic/ml/mlPersonalize.ts, gameRuleEngine.ts, docs/port/JOURNEY-HOME-RESEARCH-SPEC.md:73-76RNG tất định và replay pass 100%, nên backend cấp seed cho từng ván, nhận replay log rồi chạy lại phía server để kiểm điểm. Chống điểm giả mà không cần tin client.
logic/rng/FixedRandomUtil.ts, docs/port/PORTED-AND-RESEARCHED.md:35, data_src/replays/, app/qa.tsRNG là LCG tất định, seed điều khiển được. Nhờ đó làm được social và thi đấu mà vẫn công bằng tuyệt đối. Nhóm này không có trong bản gốc nhưng chi phí thấp.
Backend phát một seed chung mỗi ngày, mọi người chơi đúng một board giống hệt và xếp hạng theo điểm. Block puzzle rất hợp mode này.
Hai người nhận cùng seed, ai điểm cao hơn thắng. Không cần realtime: backend chỉ ghép cặp và chấm điểm bằng replay.
Cùng cơ chế B2 nhưng nhiều người, có giải thưởng.
Hạ tầng replay đã có. Backend lưu và chia sẻ "ván hay nhất", cho xem ghost của top player.Nền: data_src/replays/
Hai người chơi nhận cùng một seed. Demo dùng đúng công thức LCG của game (seed = (seed × 16807) mod 2147483647, đầu ra trunc((seed − 1) / 2147483646 × 1e6) / 1e6) để rút 5 khay 3 khối.
1256127050 (bước 1 ra 207482415).Đẩy theme và skin mới từ xa, gắn với reskin P8; skin theo mùa hoặc sự kiện mà không phát hành lại client.
Người chơi tự tạo level; backend lưu, kiểm duyệt và xếp hạng. Tận dụng đúng format Map/Condition đã giải mã ở A3.
Lên lịch banner, popup, thời điểm ưu đãi từ xa.
Phục vụ chuỗi text đa ngôn ngữ; sửa chữ không cần build lại.
Chặn client cũ và bật màn bảo trì.
Trả config khác nhau cho web, TikTok, YouTube Playables, vì team đang ship multi-platform.
Thu log lỗi client để giám sát.
Rate-limit, phát hiện bất thường, ban-list; bảng xếp hạng chỉ nhận điểm đã verify bằng replay (nối A5).
Health check, alert, dashboard vận hành.
Đặt cuối vì là nền chung cho các nhóm trên, không phải tính năng riêng.
Hiện không có userId. Backend thêm guest/device-id, SSO (dự án đã có skill skylink-sso-guard cho *.skylink.vn) và liên kết tài khoản.
Thay thế hoặc đồng bộ toàn bộ key local bên dưới. Không mất tiến độ khi xoá cache hay đổi máy. Gốc dùng jsb.sqlite 41 key, backend là bản cloud của nó.Bằng chứng: view/GameView.ts:529,543-566, view/ChapterMapView.ts:73
Endpoint cho config, level, save, leaderboard; DB người chơi và tiến độ; versioning cho remote config và level để rollback; CDN cho asset/level tĩnh.
| Key localStorage | Nội dung |
|---|---|
bb_classic_persist | High score, số ván, guide step (classGuideStep, classGameNum, classHighScore, classHighRecordScore) |
bb_classic_session | Ván đang chơi dở: board, điểm, combo, khay |
bb_progress | Level Journey cao nhất đã mở khoá |
bb_daily_streak, bb_journey_streak | Chuỗi thắng |
bb_settings | {muted, musicOn, vibrate, quickDrag} |
bb_used_themes, bb_launch | Theme đã dùng; mode và level khởi động |
Config game_init, cloud save và tài khoản, level config.
Seed và kiểm điểm bằng replay. Rẻ vì hạ tầng replay đã có.
A/B bucket và ML policy.
Daily Challenge, ghost và duel. Không có trong gốc, tận dụng sẵn RNG tất định và replay.
Force-update và maintenance, config theo nền tảng, anti-cheat.
| File | Dùng cho |
|---|---|
docs/PRD.md | Phạm vi (IAP, ads, analytics ngoài scope) |
docs/port/JOURNEY-HOME-RESEARCH-SPEC.md | Journey, level, remote, ML |
docs/port/CHAPTER-GOAL-UI-SPEC.md | Goal và collect-item |
docs/port/OFFER_TYPE_FULL_CATALOG.md | Catalog thuật toán sinh khối |
game/assets/scripts/logic/config/gameInitConfig.ts | Remote config gốc |
game/assets/scripts/logic/rng/FixedRandomUtil.ts | RNG tất định |
game/assets/scripts/view/{GameView,ChapterMapView,DailyStreak}.ts | Lưu trạng thái local |
game/assets/scripts/logic/ml/mlPersonalize.ts | ML cá nhân hoá |