Fighter Management

ADMIN

📖 HƯỚNG DẪN ← VỀ ĐẤU TRƯỜNG
Đấu sĩ hiện có
Nạp đấu sĩ mới (upload folder)

📦 KÉO FOLDER BÓNG VÀO ĐÂY

Folder cần có: config.json (tùy chọn), 1 ảnh sprite .png/.jpg, và 4 file .js chứa tên: weapon, ai/behavior, skill, anim.
Xem hướng dẫn chi tiết + code mẫu nếu chưa từng làm.

Nhận (self, ctx, api). Dùng api.drawLine/drawCircle/drawTriangleTip để vẽ. Trả về {tipX, tipY, hitRadius, damageOverride?} để engine tính va chạm gây damage (mặc định dùng Sát thương cơ bản; damageOverride ghi đè nếu cần). Trả về null nếu bóng không có đòn cận chiến.
Nếu dùng skill bắn kind:"mainWeapon" (xem ô Code skill): kiểm tra if (self.mainWeaponFlying) return null; ở đầu code — khi vũ khí đang bay, thân bóng không được vẽ/gây damage cận chiến nữa.
Nhận (self, enemy, api). Chỉnh self.vx / self.vy để điều khiển di chuyển.
api.applyDamage(target, amount), api.heal(target, amount), api.now.
api.spawnProjectile({vx, vy, damage, radius, color, lifespan, returnTo, kind}) — phóng phi tiêu tầm xa (tối đa 1 cái đang bay/lần). returnTo:"owner" = boomerang bay về sớm; không set = tự bay về sau 3 lần nảy tường. kind:"custom" (mặc định) = vật thể tự tạo hình tròn; kind:"mainWeapon" = bắn CHÍNH vũ khí đang quay quanh thân đi — thân bóng mất vũ khí (không cận chiến được) cho tới khi nó nảy đủ 3 lần và bay về, hình dạng lúc bay dùng lại đúng code trong ô Code vũ khí.
api.spawnZoneEffect({x, y, radius, delay, damage, damageMode, duration, tickInterval, friendlyFire, color}) — đánh dấu 1 vùng cố định, đợi delay khung hình rồi kích hoạt. damageMode:"once" (mặc định) = nổ 1 phát; "tick" = gây damage đều đặn mỗi tickInterval khung hình trong duration khung hình.
api.setAnimTag("ten_trang_thai") — đổi trạng thái animation (đọc qua self.animTag trong ô Code animation), dùng để đổi hình khi skill kích hoạt (vd giơ tay, thi triển...).
Nhận (self, api). Trả về {col, row} của frame sprite muốn hiển thị.
self.animTag — trạng thái hiện tại: tự động là "idle" lúc bình thường, tự chuyển thành "hurt" trong 12 khung hình ngay sau khi bóng bị trúng đòn (không cần code khai báo), hoặc bất kỳ chuỗi nào skill code đã đặt qua api.setAnimTag(...). Code animation nên đọc giá trị này để chọn frame phù hợp (vd: if (self.animTag === "hurt") return {col: 2, row: 0};).