Port game puzzle com.block.juggle từ APK sang Cocos Creator 3.8.8 + TypeScript. Giữ nguyên thuật toán chọn khối, luồng màn và giao diện; đối chiếu từng màn bằng SSIM, từng thuật toán bằng chạy lại C++ trên máy thật.
Đếm trực tiếp từ repo (ngày 2026-10-05): thư mục game/, tools/ và lịch sử git.
game/assets/scriptsresources/skinEngine sinh khối được port byte-verbatim từ bundle gốc (3.832.189 byte khớp tuyệt đối, 642 thuật toán đăng ký). Vì bản gốc có thể chạy WASM/C++, parity được kiểm bằng cách chạy lại C++ trên máy thật rồi so id khối với bản TypeScript.
Cả 3 thuộc thuật toán 16005 trên bàn dày, do ngân sách 100 ms của máy chậm chứ không phải lỗi logic.
10005, 12039, 14021, 29004, 29029, 291054 không có trong C++ nên rơi về TS, đúng như bản gốc.
Trạng thái REQ-001 vẫn là partial: parity đo thủ công, chưa có test tự động tương đương.
Toàn bộ luật chơi nằm ở logic/ và không import cc; View chỉ gọi qua bridge theo hợp đồng createGame / applyInput / snapshot. Nhờ vậy replay chạy được trong Node mà không cần engine.
app/Boot.ts, app/qa.ts, app/screens.ts. Điểm vào, đăng ký và mở màn theo id, chế độ QA (seed, settle, pause, ready).HomeView, GameView, ChapterMapView, DailyStreak, NewPlayerIncentive, PressFx, NativeVibrator. Chỉ render, nhận input, vẽ ghost và khay.adapter/GameBridge.ts, adapter/ChapterBridge.ts. Nối View với core; view không giữ logic.logic/ClassicGame.ts, logic/board/Board.ts, logic/chapter/ChapterGame.ts. Khay, đặt khối, xoá hàng/cột, combo/miss, thua, điểm; Chapter kế thừa Classic theo mục tiêu màn.logic/algo/puzzleEngine.generated.ts, atomEngine.generated.ts, puzzleUtil.ts, ratioPool.ts. 642 thuật toán, byte-verbatim từ gốc.logic/strategy/ClassAlgorithmOrchestrator.ts, algorithmProcess.ts, OfferType.ts, traits/*. Tầng "sau OFFER", điều phối các trait chỉnh độ khó.logic/ml/: lightgbm, policyTable, stateKey, abilityChurnProxy, applyOfferRec, mlPersonalize, gameRuleEngine… (10 file).logic/rng/FixedRandomUtil.ts (tái lập replay), logic/config, logic/data (init config, tuning, tập offer/shape, guide steps).Mọi con số bên dưới port 1:1 từ ClassScoreInfo của bundle gốc và có test hồi quy.
REQ-002).LevelConfigGameL49 (giải mã HEK type03).resources/chapter/levels.json, đi qua level converter.Bằng số ô của khối vừa đặt.
1 dòng: 10·c. Từ 2 dòng: 10·c·lines·(lines−1).
combo > 10 nhân 2; combo > 5 nhân 1,5 (làm tròn lên). Xoá sạch màn: 300 điểm khi round > 5.
Trait ComboTimeTrait nới ngưỡng reset combo thành comboAllowNoContinuousTimes(3) + số khối còn lại trong khay. Đây là bản vá cho lỗi "điểm port chậm hơn game thật", xác nhận bằng probe trên máy thật (7/7 mẫu).
Level, skin, hiệu ứng và âm thanh đều nằm ở game/assets/resources/. Bundle gốc mã hoá HEK nên được giải mã khi RE rồi mới nạp.
| Thư mục | Nội dung | Số lượng quan sát |
|---|---|---|
chapter | Level Adventure | 96 level |
skin, skineffect, skinfont | Theme, hiệu ứng, font theo skin | 102 skin |
sfx | Âm thanh | 27 file |
ml | Bảng policy cá nhân hoá | policy.json |
effect, effects, font, fonts, ui, prefabs, preview, newPlayerIncentive | Hiệu ứng, UI, prefab, preview, khuyến khích người chơi mới | có trong repo |
Game tải bundle từ server về cache máy (/data/data/com.block.juggle/files/gamecaches/). File trên đĩa vẫn mã hoá HEK type01, app giải mã trong RAM; RE dùng Frida để dump hoặc copy PNG đã giải mã.
Mỗi vai bàn giao qua tài liệu và checklist; không bước nào tự dựng logic thiếu bằng chứng gốc.
| Vai | Chạy ở | Việc chính |
|---|---|---|
| PO | Claude Code | Điều phối phase, tạo task, gác cổng, review |
| RE | Cursor | Decompile, giải mã, trích asset/level, bắt dữ liệu remote, chụp reference |
| GD | sub-agent | Cơ chế, level, UX từ nguồn gốc và Replay contract |
| Dev | sub-agent + Codex | Core TypeScript thuần, scene qua MCP, level converter |
| Art | sub-agent | Import asset gốc, reskin ở giai đoạn Polish |
| QA | sub-agent | Build, chụp, so SSIM, replay test |
Chụp từ Xiaomi Mi A1 (tissot), Android 14: 1080×1920, 440 dpi, DPR 2,75. Thư mục reference/ có 6 ảnh, 5 màn đầu nằm trong scope chính thức.
Chế độ QA mở màn theo ?screen=, dừng logic rồi báo ready để chụp. Đạt khi SSIM ≥ 0,95 so với reference/.
Seed cố định cho chuỗi khối xác định; harness ở tools/replay/. Mục tiêu replay pass 100%.
QA giữ checklist TC-<NHÓM>-xxx ở qa/cases/, gắn với mã yêu cầu.
Bản Cocos Creator 3.8.8 (game/) tiếp tục phát triển; bản Phaser (phaser/) bị drop, giữ để tham khảo.
Mọi thay đổi thuật toán/gameplay phải có bằng chứng gốc, gắn nhãn SRC, ĐỐI-CHIẾU-GỐC, DEVICE hoặc TEST.
Dữ liệu decompile (2,6 GB) chuyển ra ref_src/ và đưa vào .gitignore; docs giữ phẳng theo vai trò.
| Kick-off (2026-09-28) | Giá trị |
|---|---|
| Goal | Port 1:1, giống game gốc 100% |
| Phạm vi | Classic + Adventure; đối chiếu 1:1 màn hình và parity thuật toán |
| Ngưỡng SSIM | 0,95 |
| Autopilot | Bật, chạy tới hết Polish, dừng trước Reskin; kế hoạch review luôn chờ người dùng duyệt |
package.jsonnpm testTest logic và replay (tools/, monitor/)npm run build:webBuild bản webnpm run build:androidBuild bản Androidnpm run qa:captureChụp màn để so ảnhnpm run qa:compareSo SSIM với reference/npm run scene:bootTạo scene Bootnpm run mcp -- <tool> '<json>'Gọi Cocos Editor MCP khi không có MCP trực tiếpnpm run monitorWebsite giao việc, duyệt cổng: http://127.0.0.1:4700Chưa chốt version chính thức để làm chuẩn parity. Cần hỏi người dùng.
Chưa có trong tài liệu. Cần hỏi người dùng.