# Grand Line Arena — Combat 07 · Arena Skills Luffy / Zoro đấu tự do bốn hướng. Chuột trái đánh thường; chuột phải là kỹ năng riêng. Không còn cây combo trái/phải. Đấu trường 1920 × 1440, diện tích gấp 2,25 lần bản 06; camera bám người chơi và chỉ hướng đối thủ ngoài màn hình. Mỗi hiệp 120 giây, 1000 HP, thắng hai hiệp trước. ## Chơi Node.js 24: `npm ci` rồi `npm start`, mở http://127.0.0.1:4174/. Docker: [DEPLOY.md](DEPLOY.md). Sprite Lab: `/assets.html`. - Online: đặt tên → tạo/vào phòng bằng mã/link → chọn nhân vật → cả hai sẵn sàng. Không cần tài khoản. - Bot: Dễ / Trung bình / Khó; có bia tập và bot thử né chiêu. Bot Dễ quyết định chậm và nghỉ sau mỗi đợt đánh. - Tên trên đầu nhân vật, thêm “Bạn” cho người điều khiển. Hai người cùng nhân vật vẫn giữ màu sprite gốc. ## Điều khiển WASD/mũi tên chạy, cho đi chéo; chuột ngắm; Space lướt né (hồi 0,5 giây). Mỗi lần bấm trái ra một đòn thường. Đòn thường có hitstun ngắn và hồi động tác, không nối nhánh combo, không khóa đối thủ mãi. Chuột phải thi triển chiêu riêng theo hướng đã ngắm. Trên điện thoại dùng joystick, chạm sân để ngắm và bảy nút hành động. | Phím | Luffy | Zoro | | --- | --- | --- | | Trái | Đấm thường: 50 sát thương | Chém thường: 60 sát thương | | Phải | Jet Pistol: đấm nhanh, tầm 720, 90 sát thương, hồi 1,6s | Nitoryu · Liên trảm: đứng yên chém trước mặt, tầm 360, hồi 6,5s | | Q | Red Hawk: tầm 950, 140 sát thương + vùng cháy, hồi 2,8s | Pound Ho: tầm 1050, 135 sát thương, hồi 3s | | E | Elephant Gun: chọn vùng tầm 850, bán kính 160, 230 sát thương, hồi 5,5s | Tatsumaki: chọn vùng tầm 800, bán kính 170, năm nhịp × 35, hồi 6s | | R | Gear 2: cường hóa 8s, nâng cấp E và Shift, hồi 16s | Santoryu: ba vòng chém quanh người, bán kính 220, 3 × 75, hồi 7s | | Shift | Bazooka: tầm 1000, 210 sát thương và đẩy lùi, hồi 5s | Shishi Sonson: lao chém 440, 170 sát thương, hồi 4s | E: chọn điểm rồi trái/chạm sân xác nhận; phải/E/Esc hủy. Hủy ngắm không mất cooldown. Mục tiêu/đạn khóa hướng khi tung; không tự đuổi người chơi. Đạn và chém bị vật cản chặn, skill giáng chọn vùng có thể vượt vật cản. Hiệu ứng có thể rộng hơn vùng gây sát thương. Gear 2 tăng tốc độ và sát thương đấm/đạn 20%; E thành ba cú Elephant Gatling × 100 ở cùng điểm, bán kính 180. Shift thành Grizzly Magnum 252 sát thương. Vùng cháy gây ba nhịp × 20, không ngắt động tác. ## Liên trảm: trúng giữ người, hụt có thể bị phản công Chiêu khóa hướng ngay khi bắt đầu; Zoro đứng yên và không được hủy bằng chạy, lướt hoặc skill khác. Lấy đà 0,32s, sau đó chém chín nhát × 24 cách nhau 95ms. Mỗi nhát gây 0,21s hitstun và không đẩy mục tiêu khỏi tầm. Nhát kết tại 1,23s gây 94, đẩy lùi; tổng 310 nếu trúng đủ. Từ 1,28s tới hết động tác 1,95s là khoảng thu kiếm, Zoro vẫn chưa di chuyển được. Chạy/lướt ngang trước nhát đầu để tránh bị bắt. Nếu đã trúng, bấm Space hoặc skill không thoát được giữa chuỗi. Đánh ngắt Zoro sẽ dừng các nhát chưa ra. Đánh hụt vẫn phải thi triển hết và thu kiếm: đối thủ có thể vòng sang bên hoặc phía sau phản công. Các mốc dùng đồng hồ mô phỏng; hitstop kéo dài thời gian thực đôi chút. ## Animation và VFX `assets/combat-v7`: thân Liên trảm riêng 8 cel × 4 hướng (trái lật nguyên cel phải), 8 cel kiếm khí và 8 cel nổ Haki. Body và FX tách lớp. Cơ thể dùng chung scale profile với Zoro cũ; không kéo/nắn tay chân. Nguồn, prompt, các lần sinh lỗi được lưu trong `sources.json`. Ảnh sinh bởi image_gen, xử lý bằng generate2dsprite; FX sinh có alpha được làm sạch alpha dưới 48 trước khi cắt. Strict QC không còn frame chạm mép, rỗng hay bị cắt. Liên trảm có lấy đà, vòng lặp chém luân phiên, đòn kết và thu kiếm. Kiếm khí, vệt đạn, lốc, xung kích, tia Haki, tàn lửa dùng atlas ảnh; runtime ghép theo nhịp action của mô phỏng. Tuân theo giảm chuyển động cho các lớp vệt phụ. Các bộ chạy và skill cũ vẫn được tái sử dụng khi thích hợp; chưa phải mọi skill đều có body animation riêng. Tái xử lý: `python tools/process_combat_v7.py`, rồi `python tools/pack_combat_v7.py` từ thư mục dự án. Cần skill generate2dsprite ở `~/.codex/skills` và Python có Pillow/NumPy. Bối cảnh nguồn cũ: [COMBAT_REFERENCES.md](COMBAT_REFERENCES.md). Hướng tham chiếu người dùng: Blox Fruits; [showcase kiếm chính thức của Gamer Robot](https://www.youtube.com/watch?v=_9QCfc77eQs). Các thông số và luật chiêu ở trên do demo tự thiết kế. ## Online Backend Node.js + WebSocket quyết định HP, vị trí, hitstun, cooldown, thắng thua. Mô phỏng 120 bước/s, input và snapshot 60Hz. Client dự đoán rồi đối soát/phát lại input chưa được xác nhận; HP và kết quả chỉ hiện theo server. Protocol 2 yêu cầu tải lại trang nếu dùng bản cũ. Phòng lưu RAM, mất khi server khởi động lại. Chưa có server rollback, khôi phục trận sau đứt mạng hay nhiều replica. Esc/đổi tab chỉ dừng điều khiển của bạn trong trận online; server tiếp tục chạy. Đối thủ rời trận trả người còn lại về phòng chờ. ## Kiểm tra - `npm test`: luật đòn thường, liên trảm khóa/né/hụt/ngắt, skill hai nhân vật, va chạm, hitstop, phòng, HTTP/WebSocket và prediction. - `node tests/combat-v7-browser.mjs`: chuột phải thật, body mới, hiệu ứng, phần mở rộng map, Sprite Lab và cảm ứng. Mặc định server 4181; có thể đặt `TEST_URL`. - `node tests/online-browser.mjs`: hai khách tạo/join/ready, input và HP đồng bộ, rời phòng, ba cấp bot. - `node tests/online-latency-browser.mjs`: thêm 75ms mỗi chiều, kiểm tra đối soát, kết quả hai phía và tái đấu. - `qa/combat-v7-sprites.json`: QC scale/anchor và các frame; `qa/combat-v7-browser.json`: kiểm tra trình duyệt. Browser tests hiện dùng Playwright/Edge trong runtime trên máy phát triển. Tài liệu các bản trước ở `docs/history`, một số browser script cũ giữ để tham khảo bộ phím cũ.