1Giới thiệu & bản đồ tài liệu
00-Design-Bible.md + data/_bible.json (canon: INV-01..INV-18, heroes[].signature_hex, biomes[], enemies[], §7.7 rig, §10.3–10.4) · hub .claude/docs/ArtStyle.md (§1–§7, không sửa từ đây) · Tools/pixelfx nhánh g008-demo (docs/AUTHORING.md, skills/pixelfx/SKILL.md) · Assets/_Project/Others/Editor/PixelArtImportRules.cs · demo GDD/04-Enemies.md §4, GDD/07-Game-Feel.md §6–§8. Được dùng bởi: 31-VFX-Bible.md · doc hero / quái / boss / biome / hub / UI · agent sinh sprite (pixelfx), agent art-style-reviewer, dev Unity (import, sorting, camera).Luật sở hữu màu đầy đủ (doc 30 §3.1)
| Luật | Giá trị | Áp cho |
|---|---|---|
| Dải tell vàng | hue 32–62°, S ≥ 45% → CHỈ #ffd84a tell Y (glint, viền nháy, đạn Y) | mọi sprite, tile, VFX world |
| Dải tell tím | hue 260–290°, S ≥ 45% → CHỈ #b14cff tell P (vùng sàn, hào quang, !) | như trên |
| Ngoại lệ duy nhất | glint vàng kim Dòng Chảy (H01) / Relic ≤ 2 px/frame, không trên vũ khí địch | VFX hero |
| Slot hero | tâm ±10°, skin ±4° (biến thể bằng S/V) | lưỡi vũ khí, viền FX, vòng chân, rim, afterimage, ult, triệu hồi, đạn phản |
| Cấm đỏ thẫm | hue 340–10°, S > 30% cấm trên thân địch + môi trường | địch, tile, prop (trừ H01 FX) |
| Thân địch | S ≤ 40%; điểm nhấn S > 40% chỉ khi ≤ 10% pixel sprite | mọi EN/EL/MB/BS |
| Môi trường | S ≤ 40% mọi pixel (gồm kim loại nung B3; đèn đo trên pixel sau blend, màu tint cột Đèn §3.3 không phải token palette) → tự động ngoài 2 dải tell | tile, prop, decal, vũng sáng |
| Tương phản | V thân nhân vật ≥ 1.35 × V sàn base biome; sàn tối dần ra mép màn (chỉ sàn) | hero, địch, NPC |
| Chấm xám vùng đọng | #e8e4f0 viền chấm 2 px + fill chấm thưa 15% = CHỈ cho N (INV-02); tile/decal không được dùng mẫu chấm vòng | VFX địch, hazard |
| Gạch chéo | dành cho chế độ mù màu tím P; cấm ở mọi tile/decal/FX khác | toàn game |
| Screen-space | HUD + số sát thương không áp slot (INV-01g); số chí mạng ngà + "!" (không vàng tell); thanh Thế boss bạc | UI |
Mục lục chi tiết (## và ###)
- 1. Trụ cột hình ảnh
- 2. Camera & tỉ lệ pixel
- 2.1 Phép chiếu (khoá, = pixelfx VIEW.tilt 0.5)
- 2.2 Độ phân giải & zoom
- 2.3 Cỡ chuẩn (art px, đứng hướng se/sw)
- 2.4 Hướng
- 3. Sở hữu màu (INV-01 tổng quát)
- 3.1 Dải dành riêng & luật chung (áp cho mọi pixel world-space)
- 3.2 Ramp FX 12 hero (slot INV-01b)
- 3.3 Palette môi trường theo biome
- 3.4 Ramp thân địch theo biome (INV-01d)
- 3.5 Alt tro-xương & LUT palette (INV-01d, 0 sheet thêm)
- 3.6 Token hệ thống (dùng chung mọi biome)
- 3.7 Cổng kiểm màu tự động
- 4. Viền, đổ bóng, ánh sáng
- 5. Actor spec (mẫu cuối) & luật theo loại
- 5.1 Mẫu Actor spec
- 5.2 Hero — bộ clip (khung 30 fps; chân tay bước 12 fps, H01 30 fps)
- 5.3 Hero — socket, portrait, tư thế chọn
- 5.4 Khoá art 12 hero
- 5.5 Địch theo hạng (hợp đồng clip = demo 04 §4.1, mở rộng)
- 5.6 Boss — đa phần & dạng pha
- 5.6b Khoá art mini-boss (hạng L, §2.3)
- 5.7 NPC hub
- 5.8 Ví dụ điền mẫu — H03 Halka (rút gọn)
- 6. Môi trường — tile & prop
- 6.1 Lưới & loại tile (Unity Tilemap, PPU 16)
- 6.2 Chiều cao, che khuất, sort
- 6.3 Decal
- 6.4 Mẫu Tile/Prop spec
- 7. Key art & capsule Steam
- 7.1 Hướng
- 7.2 Kích thước (gốc → phóng)
- 8. Pipeline sản xuất với pixelfx
- 8.1 Các bước (1 actor; VFX theo checklist doc 31 §12)
- 8.2 Đặt tên
- 8.3 Nhập Unity (khoá, PixelArtImportRules.cs)
- 8.4 Ngân sách bộ nhớ (≤ 21 trang 2048² thường trú, Bible §10.3)
- 8.5 Cổng duyệt (thứ tự, dừng ở lỗi đầu tiên)
- 9. Quy tắc cho dev/AI
- 10. Quyết định đã chốt
21. Trụ cột hình ảnh
| ID | Trụ cột | Luật đo được | Kiểm |
|---|---|---|---|
| VP1 | Pixel thật, 1 cỡ pixel | 1 art px = 1 px pixelfx = 1/16 unit Unity; scale nguyên; không AA, không blur, không xoay sprite | ảnh chụp ×1: 0 pixel lai màu ngoài ramp |
| VP2 | 3/4 top-down đúng phép chiếu | sàn nén 0.5 theo chiều sâu, vật đứng cao đủ; mọi vòng sàn = elip 2:1 | overlay elip trên ảnh chụp |
| VP3 | Hình khối thắng màu | FX hero = lõi #fff6f0 + viền slot, ĐẶC; FX địch = lõi tối/lạnh + viền sáng, RỖNG (INV-01c) | test mù màu (lọc xám) vẫn phân biệt được |
| VP4 | Sở hữu màu | dải tell vàng/tím dành riêng; 12 slot hue hero; địch lạnh S ≤ 40% (INV-01a/b/d) | script màu §3.7 = 0 lỗi |
| VP5 | Đọc được trong 250 quái | thân nhân vật sáng hơn sàn ≥ 35% (V); hero có vòng chân + rim + x-ray 55% | test 5 s (P4) đúng với 12 hero |
| VP6 | Diễn bằng thân | mọi đòn có windup ngược hướng → nhả → khựng → hồi (act pixelfx); pose windup ≠ pose đi (INV-03) | tools/act.mjs duyệt từng bước 12 fps |
| VP7 | Tang lễ, không máu me | chủ đề tro/chuông/khăn tang; không máu đỏ, không nội tạng; xác tan bằng dither tro | reviewer từ chối máu đỏ / gore |
32. Camera & tỉ lệ pixel
2.1 Phép chiếu (khoá, = pixelfx VIEW.tilt 0.5)
- Toạ độ gameplay trên sàn:
(fx, fz)px,fzdương = xa camera (lên trên màn). Độ caohpx, dương = lên. - Màn (art px, gốc dưới-trái kiểu Unity):
sx = fx·sy = 0.5·fz + h. Unity:pos = (sx/16, sy/16, 0). - Quy ước pixelfx (gốc trên-trái):
screenX = x·screenY = z·0.5 + y(y âm = lên). Hai quy ước chỉ đổi dấu trục Y; số px giống nhau. - Hệ quả bắt buộc: vòng sàn bán kính r = elip rộng
2r× caor; tốc 130 px/s đi Bắc/Nam = 65 px/s trên màn (đúng, không bù). - Sắp xếp (Y-sort): theo
sycủa pivot chân (hkhông tính); UnityTransparencySortAxis (0,1,0), sorting mode Custom Axis.
2.2 Độ phân giải & zoom
Công thức: zoom = số nguyên lớn nhất z thoả H/z ≥ 266 và W/z ≥ 426 · view = (min(640, ceil(W/z)), min(360, ceil(H/z))) art px · phần thừa = viền void #15131d. Không bao giờ zoom lẻ. Vùng an toàn gameplay = 427×267 giữa màn (Bible §10.4): spawn công bằng, tell, HUD neo theo vùng này.
| Màn | zoom | View (art px) | Ghi chú |
|---|---|---|---|
| 1920×1080 | 4 | 480×270 | chuẩn thiết kế; mọi mockup dựng ở 480×270 |
| 1280×800 (Deck) | 3 | 427×267 | 1281×801, cắt 1 px (Bible) |
| 1280×720 | 2 | 640×360 | thấy rộng hơn; luật công bằng vẫn theo 427×267 |
| 1920×1200 | 4 | 480×300 | |
| 2560×1440 | 5 | 512×288 | |
| 3440×1440 | 5 | 640×288 | trần ngang 640, viền 2×80 px màn |
| 3840×2160 | 8 | 480×270 |
- Unity:
PixelPerfectCameraassetsPPU 16, refResolution = view của công thức (script đặt lúc đổi độ phân giải), upscaleRT bật,orthographicSize = viewH / 32. Vị trí camera làm tròn tới 1/16 unit mỗi frame (demo chưa snap → bắt buộc ở 1.0). - Camera chiến đấu: không zoom, không xoay; rung = Bible/
07(7 px × trauma^1.5, cú đẩy ≤ 4 px), offset rung cũng làm tròn tới 1 art px.
2.3 Cỡ chuẩn (art px, đứng hướng se/sw)
| Hạng | Chiều cao đứng | Thân (rộng×cao) | Khung body tối đa / clip | Bóng sàn rx×ry | Ví dụ |
|---|---|---|---|---|---|
| Hero | 36 | 24×38 (stock actor) | 96×96 | 11×5 | H01 Varek (demo) |
| Quái S | 26–40 (≤ 48) | ≤ 32×40 | 64×64 | 9×4 | EN_B1_01 32, EN_B1_02 26 |
| Tinh Anh M | 52–60 (≤ 64) | ≤ 48×60 | 112×96 | 16×8 | EL_B1_01 56 |
| Mini-boss L | 64–80 | ≤ 80×80 | 160×128 | 24×12 | MB_B4_1 dài 96 |
| Boss XL | 72–96 (≤ 96, Bible §7.7) | ≤ 128×96 mỗi phần | 192×160 mỗi phần | 32×16 | BS_B1 72 |
| NPC hub | 34–44 | ≤ 28×44 | 64×64 | 10×5 | NPC_RAM 44 |
| Triệu hồi hero | 20–36 | ≤ 24×36 | 64×64 | 8×4 | phường kèn H12 |
- Bóng sàn:
rx = round(0.45 × rộng thân),ry = round(rx / 2), màushadow #0a0810α 0.45, lớpFXBot. Khi bay độ cao h:rx_h = rx × max(0.5, 1 − h/64), α giảm0.45 → 0.25tuyến tính tới h = 64. - Hero cao nhất roster ≤ 44 px (H02 Bodan 42, H05 Oska 32 thấp đậm) để luôn nhỏ hơn Tinh Anh M (≥ 52): đọc hạng bằng cỡ.
- Vũ khí dài được vượt khung thân: H03 giáo 1.8 × thân ≈ 65 px; tổng khung clip vẫn ≤ 96×96 (vfx tách sheet riêng).
2.4 Hướng
- 8 hướng
e se s sw w nw n ne; xuất 8, đóng gói giữe se s n ne, runtime lật gươngw sw nw(Tools/bw-pack.mjsKEEP_DIRS). - Mặc định: hero
se, địchsw, NPCs. Đứng yên trong hub: NPC xuấts se(lậtsw). - Cấm xoay ảnh để ngắm: đòn ngắm dùng sheet hướng gần nhất (bước 45°); đạn bay theo góc tự do = sprite đối xứng tròn hoặc 8 hướng chọn gần nhất.
43. Sở hữu màu (INV-01 tổng quát)
3.1 Dải dành riêng & luật chung (áp cho mọi pixel world-space)
| Luật | Giá trị | Áp cho |
|---|---|---|
| Dải tell vàng | hue 32–62°, S ≥ 45% → CHỈ #ffd84a tell Y (glint, viền nháy, đạn Y) | mọi sprite, tile, VFX world |
| Dải tell tím | hue 260–290°, S ≥ 45% → CHỈ #b14cff tell P (vùng sàn, hào quang, !) | như trên |
| Ngoại lệ duy nhất | glint vàng kim Dòng Chảy (H01) / Relic ≤ 2 px/frame, không trên vũ khí địch | VFX hero |
| Slot hero | tâm ±10°, skin ±4° (biến thể bằng S/V) | lưỡi vũ khí, viền FX, vòng chân, rim, afterimage, ult, triệu hồi, đạn phản |
| Cấm đỏ thẫm | hue 340–10°, S > 30% cấm trên thân địch + môi trường | địch, tile, prop (trừ H01 FX) |
| Thân địch | S ≤ 40%; điểm nhấn S > 40% chỉ khi ≤ 10% pixel sprite | mọi EN/EL/MB/BS |
| Môi trường | S ≤ 40% mọi pixel (gồm kim loại nung B3; đèn đo trên pixel sau blend, màu tint cột Đèn §3.3 không phải token palette) → tự động ngoài 2 dải tell | tile, prop, decal, vũng sáng |
| Tương phản | V thân nhân vật ≥ 1.35 × V sàn base biome; sàn tối dần ra mép màn (chỉ sàn) | hero, địch, NPC |
| Chấm xám vùng đọng | #e8e4f0 viền chấm 2 px + fill chấm thưa 15% = CHỈ cho N (INV-02); tile/decal không được dùng mẫu chấm vòng | VFX địch, hazard |
| Gạch chéo | dành cho chế độ mù màu tím P; cấm ở mọi tile/decal/FX khác | toàn game |
| Screen-space | HUD + số sát thương không áp slot (INV-01g); số chí mạng ngà + "!" (không vàng tell); thanh Thế boss bạc | UI |
3.2 Ramp FX 12 hero (slot INV-01b)
8 bậc tối → sáng (r0..r7) + lõi #fff6f0 (r8, INV-01c) + chớp #ffffff (≤ 2 frame). Bậc tối lệch về lạnh, bậc sáng lệch về ấm, luôn trong ±10° quanh tâm slot và ngoài 24–70° / 252–298°. r4 = signature_hex. Ngoại lệ H01: giữ ramp canon demo _varek.js CRIMSON (r0 330°, r1 341°, r5 5°, r6 22° lệch > 10°; xem §10). Ramp này là --opts palette khi xuất mọi VFX hero và là hàng LUT của hero trong PAL_HERO (§3.6).
| Hero | Tâm° | r0 | r1 | r2 | r3 | r4 (slot) | r5 | r6 | r7 | Ghi chú |
|---|---|---|---|---|---|---|---|---|---|---|
| H01 Varek | 354 | #1a0610 | #3d0a1a | #6e1024 | #a8162e | #e0283a | #ff4836 | #ff9050 | #ffe0b4 | ramp canon _varek.js CRIMSON; vàng kim glint ≤ 2 px/frame (ngoại lệ INV-01a) |
| H02 Bodan | — | #2a2420 | #4a423a | #6e665c | #968e82 | #bdb6a8 | #e4dcc8 | #f2ecdf | #fbf8f1 | vô sắc (INV-01e): slot #e4dcc8 = r5; viền bồ hóng #2a2420 = r0; không hue |
| H03 Halka | 214 | #091429 | #102347 | #1e3c6b | #295aa8 | #3680e0 | #6eb4ff | #a8d7ff | #dcefff | |
| H04 Sậu | 148 | #08291a | #0e472e | #1a6b44 | #24b46e | #30f089 | #66ffa5 | #a3ffc5 | #daffe8 | |
| H05 Oska | 236 | #080d29 | #0e1747 | #1a236b | #1b2785 | #242db2 | #5557d4 | #a7a3ff | #dcdaff | vùng sàn đặc, lõi trắng nóng (không fill rỗng) |
| H06 Ruvan | 14 | #290a05 | #471109 | #6b2312 | #b53417 | #f2501f | #ff8758 | #ffbc9b | #ffe4d7 | |
| H07 Veyra | 126 | #0a2910 | #11471c | #1f6b2a | #228530 | #2db23a | #5dd463 | #a9ffa9 | #ddffdd | |
| H08 Dov | 82 | #192906 | #2b470a | #476b15 | #578514 | #7bb21b | #aad44d | #e5ff9e | #f5ffd8 | |
| H09 Kessa | 325 | #29001c | #470031 | #6b0546 | #850055 | #b20068 | #d4358a | #ff8cc4 | #ffd1e7 | |
| H10 Ingra | 170 | #052927 | #0a4743 | #146b61 | #138a7c | #1ab89e | #4edbbd | #9cffe5 | #d8fff5 | khói = p.disc fill đặc 45% (trần Bible Q12), lõi xoáy #fff6f0, viền mềm 3 px r6 (không viền cứng 2 px), alpha không đồng đều (INV-01c); inv01_check --kind vfx_hero từ chối fill < 40% kèm viền 2 px (= dạng tell P) |
| H11 Wenna | 104 | #172913 | #284722 | #436b38 | #64a452 | #8bdb6e | #beffa0 | #dbffc6 | #f1ffe8 | slot chỉ ở mép xẻng + vòng chân (Bible §5.3) |
| H12 Ambrin | 192 | #081e29 | #0d3547 | #1a556b | #2389ae | #2ec0e8 | #66e6ff | #a3f4ff | #dafbff |
3.3 Palette môi trường theo biome
Sàn: 6 tông (mortar dark base alt alt2 lit) theo tỉ lệ HSV của sàn demo B1 (= token hub §2). Tường/đá: 4 tông (đỉnh sáng → chân tường). 3 vật liệu nhấn × 4 tông (sáng → sâu), S ≤ 40%. Đèn = màu tint vũng sáng sàn (α ≤ 0.25) — chỉ dùng cho lớp ánh sáng, không phải token palette và không vẽ thành pixel sprite/tile; #d99f82 của B3 (S 40.1%) là màu chỉ-dành-cho-đèn, pixel sau blend α ≤ 0.25 trên sàn B3 vẫn S ≤ 40%.
| Biome | mortar | dark | base | alt | alt2 | lit | Tường w0..w3 | Đèn |
|---|---|---|---|---|---|---|---|---|
| B1 Đồi Mộ Tro | #1a1724 | #211d2d | #2b2639 | #282335 | #2e293d | #332d44 | #665c83 #4c4464 #3a334d #2d283c | #86d2d9 |
| B2 Đầm Vải Liệm | #232f34 | #2d3a41 | #3a4a52 | #36444c | #3e5058 | #455862 | #8bacbd #688290 #4e646f #3d4e56 | #cad99c |
| B3 Lò Đúc Câm | #1b1718 | #211d1e | #2a2526 | #272223 | #2d2829 | #322c2d | #615658 #4a4143 #393233 #2c2728 | #d99f82 |
| B4 Thành Chuông Treo | #25282f | #2f313a | #3c3f4a | #383a45 | #40444f | #474b58 | #8d93aa #6a6f82 #515564 #3f424e | #d9d2c3 |
| B5 Đỉnh Chuông Câm | #1d1a16 | #24211c | #2e2a24 | #2b2721 | #312d27 | #37322b | #6a6255 #504a40 #3e3931 #302c26 | #d9cda9 |
| B6 Bờ Lặng | #131318 | #17181e | #1e1f26 | #1c1d23 | #202129 | #24252d | #474957 #353742 #292a33 #1f2128 | #98a3d9 |
| Biome | Vật liệu nhấn (4 tông sáng → sâu) |
|---|---|
| B1 | rêu #bce0ab #87a876 #59754f #374c32 · xương #e0d7c4 #a89f8d #757061 #4c4a3e · lửa ma #9cdbe0 #68a3a8 #476e75 #2e464c |
| B2 | nước #abd7e0 #76a0a8 #4f6c75 #32454c · vải liệm #e0e0d6 #a8a89e #75756e #4c4c47 · tre mục #d4e0ae #9da879 #6a7551 #434c34 |
| B3 | đồng verdigris #a7e0d2 #72a89b #4c756e #304c49 · sắt #cbd2e0 #949ba8 #666a75 #42444c · cam nung #e0b199 #a87b65 #755a47 #4c3c2e |
| B4 | đá phiến #c7cee0 #9197a8 #636775 #40424c · sắt lạnh #c0d0e0 #8a99a8 #5e6875 #3d424c · cẩm thạch xương #e0dace #a8a397 #757268 #4c4b44 |
| B5 | đồng xỉn #e0cdab #a89676 #756a4f #4c4632 · tro sáng #e0dcd2 #a8a49b #75736b #4c4b45 · vàng xỉn #e0d7b9 #a89f83 #757059 #4c4a39 |
| B6 | mặt gương #b9bce0 #8386a8 #595975 #3a394c · bạc nhợt #d6d6e0 #9e9ea8 #6e6e75 #48474c · đen lam #abb4e0 #767ea8 #4f5275 #32334c |
3.4 Ramp thân địch theo biome (INV-01d)
Mỗi biome 3–4 họ ramp × 4 tông (e0 sáng lệch về lam-lục, e1 = hex Bible, e2 e3 tối lệch về lam-tím). S ≤ 40% mọi tông. Điểm nhấn mắt #9ff3ff (B1–B5) ≤ 10% pixel sprite; B6 không có mắt sáng (lõi tối, ramp đảo).
| Biome | Họ A | Họ B | Họ C | Họ D |
|---|---|---|---|---|
| B1 | #adb3bc #8a8f9a #5e616c #3b3d47 | #87958f #6b7a72 #495550 #2e3834 | #f5f1de #c9c2b0 #8d8578 #5c554b | #726f89 #5a5470 #3b384e #242334 |
| B2 | #7b9395 #5e7a7a #3f5355 #273538 | #b5c7c6 #8fa3a0 #617271 #3d4b4b | #fdfff8 #d6d8d0 #94978e #60635a | #5e6e5d #4a5a48 #313f31 #1e291f |
| B3 | #81a89d #5f8a7a #3f6157 #273f3a | #817971 #6a5f58 #4a403b #312825 | #d7b997 #b08a6a #7b5c4a #513a31 | #4c484a #3e3a3c #2b282a #1d191b |
| B4 | #a0a8b5 #7d8494 #555968 #353744 | #778292 #5a6478 #3c4254 #252837 | #fdf6e7 #cfc6b8 #91877d #5f564f | #606570 #4a4e5c #323440 #1f202a |
| B5 | #867f6b #6e6450 #4d4335 #332a21 | #bcb5a4 #9a9080 #6c6157 #473e36 | #5a564a #4a4438 #342e26 #221d17 | — |
| B6 | #adafc3 #8888a0 #5e5c70 #3c3a4a | #f8f9ff #dcdce4 #9797a0 #616069 | #4b4c58 #3a3a48 #282732 #1a1821 | — |
3.5 Alt tro-xương & LUT palette (INV-01d, 0 sheet thêm)
- Mỗi trang atlas actor/VFX địch có 1 texture mask cùng bố cục
<atlas>_<page>_mask.png(R = 255 ở pixel điểm nhấn: mắt, gân, lõi phép, viền đạn; còn lại 0). Export pixelfx ghi mask;bw-packđóng gói song song. - Shader
SpriteActor1 pass: pixel mask = 1 và cờaltbật → màu =LUT[row_alt][luma4(pixel)], ramp alt 4 tông#e8e4f0 #b9b5c6 #8a8699 #5b586c(S ≤ 15%). - Cờ
alttự bật cho cả loài khi|hue(điểm nhấn) − tâm slot hero đang chơi| < 25°. Ví dụ: mắt#9ff3ff(186°) bật alt khi chơi H10 (170°) và H12 (192°); gân#9cff6aEN_B1_05 (98°) bật alt với H08 (82°), H11 (104°); không bật với H07 (126°, lệch 28°). - Texture
PAL_LUT16×32 px, Point, không nén: hàng 0–11 = H01–H12 (r0..r8của §3.2, cột 9–15 trống), hàng 12 = alt tro-xương, hàng 13 = ramp đảo lõi tối (Đòn Vọng, EN_B6_01, BS_TRUE P3), hàng 14–31 = skin Tủ Áo Tang ST_WARDROBE (mỗi skin 1 hàng, hue ±4° trong slot). - VFX dùng chung có
tint: HERO(doc 31 §3) = sheet xám chỉ mục 9 bậc, tô bằng hàng hero đang chơi qua cùng LUT. - Skin hero = hàng LUT, không vẽ lại sprite; reviewer kiểm skin vẫn qua §3.1.
3.6 Token hệ thống (dùng chung mọi biome)
| Token | Hex | Vai |
|---|---|---|
ink | #0b0a10 | viền 1 px nhân vật/prop/icon (H01 #0c0a12, quái tro #0b0a12) |
shadow | #0a0810 α 0.45 | bóng sàn, bóng vật bay |
void | #15131d | ngoài sàn, viền letterbox |
hot-white | #ffffff | chớp 1–2 frame, glint sáng nhất |
hero-core | #fff6f0 | lõi FX hero, lõi đạn phản (INV-01c) |
tell-deflect | #ffd84a | tell Y |
tell-unblock | #b14cff | tell P |
ash-neutral | #e8e4f0 | ấn spawn 0.6 s, xoáy triệu hồi 1.0 s, viền chấm N, alt LUT |
soot | #2a2420 | viền FX H02; ấn spawn khi chơi H02 = viền gạch đứt 2 px ash-neutral |
eye-cold | #9ff3ff | mắt/gân địch B1–B5 (≤ 10% pixel) |
bile | #9cff6a | gân EN_B1_05 (alt LUT bắt buộc) |
ash-eye | #f2ead8 | glyph ◆ Tro Nhớ, callout đổi thế (ngà, S < 15%) |
3.7 Cổng kiểm màu tự động
Script Tools/artcheck/inv01_check.py (chạy py -3, dựng ở MS01; đầu vào PNG + loại hero|enemy|env|vfx_hero|vfx_enemy + id): bỏ pixel α < 0.5; lỗi khi:
- pixel S ≥ 45%, hue 32–62° mà ≠
#ffd84a(cho phép ≤ 2 px/frame nếuvfx_heroH01 hoặc Relic); - pixel S ≥ 45%, hue 260–290° mà ≠
#b14cff; enemy/env: pixel S > 40% vượt 10% số pixel (enemy) hoặc > 0 (env); pixel hue 340–10° S > 30%;vfx_hero: pixel S ≥ 30% có hue ngoài slot ±10° của hero (trừ lõi#fff6f0,#ffffff, glint ngoại lệ; H01 dùng cửa sổ 330–23° của ramp canon);hero/enemy: V trung bình thân < 1.35 × Vbasebiome đích.vfx_herovùng sàn (mọip.disc/elip sàn của hero, gồm khói H10): fill < 40% pixel elip VÀ có viền 1 màu dày 2 px (= dạng tell P "fill 25% + rim 2 px", doc 31); hoặc thiếu lõi#fff6f0.
Kết quả 0 lỗi = điều kiện cần trước khi gọi art-style-reviewer (§8.5).
54. Viền, đổ bóng, ánh sáng
| Mục | Luật | Số |
|---|---|---|
| Viền | 1 px ink quanh silhouette nhân vật, prop, icon; KHÔNG viền trên VFX, tile sàn, decal | dày 1 px, không viền trong (trừ tách khối lớn ≤ 1 đường) |
| Rim runtime | shader SpriteActor cộng rim đỉnh thân: hero = màu slot r6 α 0.45; địch = (0.78, 0.90, 1.0) α 0.30; atlas PAD 2 px | rim dày 1 px, chỉ cạnh trên-trái |
| Nguồn sáng | trên-trái, cố định toàn game (kể cả hub, portrait, key art) | mặt sáng = trên + trái; tối = dưới + phải |
| Ramp vật liệu | 3–5 bậc mỗi vật liệu, lệch hue: bóng lạnh/tím-lam, sáng ấm; ≤ 4 họ ramp/nhân vật + 1 nhấn | ≤ 20 màu/nhân vật S, ≤ 28 M/L/XL |
| Dither | Bayer 4×4 chỉ cho mờ dần (tan xác 0.4 s) và mặt lớn ≥ 32×16 (tường, nước) | cấm dither trên thân < 48 px |
| Chi tiết | 1 px chỉ ở tiêu điểm (mặt, lưỡi vũ khí, nhấn) | ≤ 3 cụm chi tiết/sprite S |
| Mặt nhân vật | đầu ×1.4–1.6 so với tỉ lệ thật (chibi anh hùng như Varek); mắt 1–2 px | hero đầu 10–12 px cao |
| Vòng chân hero | elip floorRing rx 12 ry 6, viền 1 px r5 + fill r3 α 0.20, lớp FXBot | luôn bật (INV-09) |
| X-ray | phần thân hero bị che: silhouette slot r4 α 0.55 + viền r6 1 px (stencil 1 = hero, 2 = actor) | luôn bật (INV-09) |
| Địch không token | thân tối 10% (07 §8) | runtime, không sheet |
| Chớp trúng | trắng 0.07 s qua vertex color (giữ batching) | INV-10 |
| Xác | tối về 62% trong 0.35 s → tan dither 0.4 s | 07 §3.1 |
| Vũng sáng | elip sàn additive, màu Đèn biome (§3.3), α ≤ 0.25, r 24–96, nhấp nháy ≤ 2 Hz, biên độ α ≤ 0.05 | chỉ dưới nguồn sáng có thật (đuốc, lò) |
| Sương/mây/bóng tối | luôn vẽ DƯỚI lớp tell (INV-18); α ≤ 0.35 | lớp FXBot hoặc Map |
- Cấm từ khoá khi viết prompt/brief: smooth cartoon, vector, painterly, HD, 3D render, soft shading, gradient, anti-aliased, realistic, side view, isometric (hub §1).
- Cấm: góc nhìn ngang, nhìn thẳng từ trên, ô kim cương isometric, vòng sàn vẽ như 1 đường thẳng, trộn cỡ pixel, scale nhân vật lẻ, font trong
Tools/pixelfx/gallery/fonts/(không có giấy phép), tái tạo sprite/nhân vật/logo của tựa game khác.
65. Actor spec (mẫu cuối) & luật theo loại
5.1 Mẫu Actor spec
File: Design/ArtSpecs/actors/<ID>.md (1 file/actor, tiếng Việt, field tiếng Anh). Thiếu field bắt buộc (★) = không được export.
| Field | ★ | Giá trị cho phép / định nghĩa |
|---|---|---|
id | ★ | ID Bible (Halka H03, Ếch Vây EN_B2_02, Thống Lĩnh Yvra & Rồng Khàn BS_B4, Bù Nhìn Răm NPC_RAM) |
code | ★ | mã pixelfx ASCII thường: ID viết thường (h03, en_b2_02); actor demo giữ mã cũ (§8.2) |
tier | ★ | hero · S · M · L · XL · npc · summon (= mass_class Bible) |
biome | ★ | Đồi Mộ Tro B1–Bờ Lặng B6 · HUB · — (hero) |
rig | ★ | biped · quadruped · flyer · serpent · construct_driver · swarm (Bible §7.7; ngoài 6 loại → đạo cụ + biped) |
silhouette | ★ | cao px (§2.3), rộng px, 3 khối lớn, "dấu nhận trong đám đông" (1 câu) |
skeleton | ★ | override M (pelvis thigh shin upper fore neckUp headUp shoulderOut shoulderUp), bulk (head chest pelvis arm leg), phím phụ (sway, wave) |
weapon | ★ | stock (sword greatsword dagger spear hammer scythe claw bow pistol launcher handle) hoặc WEAPONS.<weaponId> mới; offWeapon |
ramps | ★ | ≤ 4 họ × 4 tông (sáng → tối) + 1 nhấn + ink; nguồn ramp (PAL.<x> / §3.4 / §3.2); điểm phát sáng (mask §3.5) |
facing | ★ | mặc định se (hero) / sw (địch) / s (NPC); xuất 8 |
clips | ★ | bảng: clip · frames@30 · loop · nghĩa t = 0 · hits[] · steps (12/24/30) · ghi chú (§5.2–5.5) |
sockets | ★ | px từ pivot chân, hướng e, h dương = lên: foot chest head overhead hand_main hand_off + tip@hit mỗi clip đánh |
reactions | ★ | skin act (char ice shock holy shadow poison), chớp, hạng khối, clip broken (M/L/XL) |
phases | XL | dạng mỗi pha: hàng LUT / sheet thay / phần tách (§5.4) |
parts | L/XL đa phần | danh sách phần: tên, pivot riêng, sortOffset px, hitbox riêng |
portraits | hero, NPC, L/XL | bảng §5.3 / §5.6 |
vfx_owned | ★ | danh sách VFX_<ownerId>_<slug> thuộc actor (doc 31) |
budget | ★ | trang atlas 2048² (§8.4), frames/hướng tối đa |
bans | điều cấm riêng (vd khoá art H04, H11) | |
export | ★ | lệnh hero.mjs + bw-pack + nhóm atlas |
review | ★ | inv01_check = 0 lỗi · check.mjs sạch · art-style-reviewer = pass · ngày |
5.2 Hero — bộ clip (khung 30 fps; chân tay bước 12 fps, H01 30 fps)
| Clip | Bắt buộc | Frames | Loop | t = 0 | Ghi chú |
|---|---|---|---|---|---|
idle | ✔ | 48 | ✔ | — | thở, vũ khí đúng tư thế thủ |
run | ✔ | 18 | ✔ | — | runtime chỉnh tốc phát theo vận tốc; tốc chạy 130–145 px/s |
dash | ✔ | 9–12 | khung 0 = i-frame | cự ly 72–96 px (INV-12); afterimage runtime | |
attack1..attack3 (+ attack4..6 nếu combo dài) | ✔ | 28–48/đòn | khung chạm | windup ép vào startup CSV; freeze nướng sẵn bị packer bỏ | |
| dash_attack | ✔ | 24–36 | khung chạm | đánh sau Lướt | |
answer | ✔ | 9–15 | khung mở cửa sổ ĐÁP | tự xoay theo kẻ tấn công (INV-11); 360° | |
answer_hit | ✔ | 15–24 | khung phản | khi ĐÁP thành công | |
hold_in / hold_loop / hold_out | ✔ | 6–12 / 12–24 / 6–9 | – / ✔ / – | — | verb giữ riêng hero |
sk01..sk08 | ✔ | 30–110 | khung nhả | 8 kỹ năng; hạng III đổi tham số, không clip mới | |
ul1..ul3 | ✔ | 60–150 | khung nổ chính | bất tử suốt clip | |
hurt | ✔ | 9–12 | — | ≤ 0.40 s | |
death | ✔ | 60–95 | — | khung cuối nằm sàn, giữ | |
wake | ✔ | 30–45 | — | thức dậy bên Lửa Canh / vào phòng | |
victory | ✔ | 45–60 | — | thắng boss | |
hub_idle | ✔ | 60–90 | ✔ | — | đứng trong hub |
select | ✔ | 48 | ✔ | — | tư thế màn chọn hero (chỉ hướng se) |
as2_fin, as3_fin | ✔ | 30–48 | khung chạm | ≤ 1 clip mới/Dạng Rèn (Bible §6); thân dùng chung AS1 |
- Dạng Rèn =
node tools/hero.mjs <code> --weapon <w> --as <code>_as2(thân giữ, vũ khí đổi); chỉ Dạng Rèn đang lắp được nạp vào RAM. - Ngân sách: ≤ 8 trang 2048² cho hero đang chơi (gồm Dạng Rèn đang lắp + VFX riêng); ≤ 1.400 frame/hướng cho mọi clip của 1 hero.
5.3 Hero — socket, portrait, tư thế chọn
- Socket mặc định (hướng
e, px, h lên):foot (0,0)·ringelip rx 12 ry 6 ·chest (0,22)·head (0,34)·overhead (0,46)(Ấn, ◆ Tro Nhớ,!; glyph trạng thái nằm trên vòng chân, doc 31 R7) ·hand_main (8,20)·hand_off (−6,20)·back (−4,24). Hero cao ≠ 36 → nhânhtheocao/36. - Đổi hướng socket (quy ước pixelfx, y xuống): offset sàn
(x tới, d ngang)+ caoh, hướngθ(0 = e, π/2 = s):sx = x·cosθ − d·sinθ·sy = 0.5·(x·sinθ + d·cosθ) − h. tip@hit: toạ độ mũi vũ khí ở khung chạm của từng clip đánh (hướnge) — runtime đặt glint/tia lửa/đạn ở đây.
| Portrait | Kích thước | Luật |
|---|---|---|
por_<code>_hud | 32×32 | đầu + vai, vẽ lại (không thu nhỏ từ bust), viền ink, rim slot 1 px dưới-phải |
por_<code>_bust | 128×128 | 3/4 mặt hướng phải-màn, sáng trên-trái, tóc/vũ khí vượt khung trên ≤ 8 px; 3 biểu cảm neutral resolve grief; nền trong suốt |
por_<code>_select | 192×192 | toàn thân cao 150–176 px, chân tại y = 184, tư thế khoe vũ khí + gợi verb ĐÁP; 1 vòng thở 24 frame @12 fps; vòng chân slot vẽ trên sàn; không chữ |
- Portrait theo thang UI = thang world (cùng zoom); ramp portrait = ramp sprite + tối đa 2 tông trung gian; không gradient mịn.
5.4 Khoá art 12 hero
| ID | Cao | Silhouette & dấu nhận | weapon | Cấm |
|---|---|---|---|---|
| H01 Varek | 36 | tóc trắng vuốt ngược, khăn đỏ thẫm 2 đuôi, giáp vai có sừng | reaver (có sẵn) | đổi canon demo |
| H02 Bodan | 42 | khổng lồ hiền, vai rộng nhất roster, áo vải tang nâu, nắp quan tài gỗ đóng đinh làm lưỡi | coffin_lid | màu slot (vô sắc) |
| H03 Halka | 38 | mũ sắt cổ cao, áo choàng ngắn lam, giáo 65 px treo 3 chuông nhỏ | bell_spear | giáo ngắn hơn 1.6 × thân |
| H04 Sậu | 34 | áo thô xắn tay, túi phấn hông, la bàn gỗ; compa 2 chân lưỡi 30 px | divider | váy, mũ vải buộc cằm, ruy băng, kim, hình nhân giấy |
| H05 Oska | 32 | thấp đậm, tạp dề da, cẳng tay to; đe 12×10 px trên xích 40–72 px | chain_anvil | fill vùng rỗng |
| H06 Ruvan | 37 | thợ phụ lò đúc, tạp dề cháy xém, 2 găng sắt to bằng đầu, khe găng sáng slot | forge_gauntlet | lửa vàng (dải tell) |
| H07 Veyra | 37 | thợ săn đầm, áo da cá xếp vảy, cung sườn cao 44 px, ống tên xương | rib_bow | mũ trùm che mặt |
| H08 Dov | 35 | nữ pháo thủ trẻ, áo khoác dài đội đèn đêm, nòng loa 30 px, đai 2 ổ đạn | bell_firelock | khói đen che thân |
| H09 Kessa | 34 | cô gái làng vàng mã, búi tóc cài que giấy, thòng lọng xâu xu lỗ vuông | coin_lasso | xu/giấy màu vàng tell (xu = ngà + slot) |
| H10 Ingra | 34 (khom) | bà đồng già duy nhất, khăn quấn đầu, tay áo rộng, lư trầm cán 48 px | censer_staff | khói fill đặc che hero khác |
| H11 Wenna | 36 | 19 tuổi, tay áo xắn, đất bám, xẻng cao 44 px (to hơn người) | grave_spade | mũ trùm, đèn lồng, bia đá xích trên lưng, hồn/xác trồi khỏi hố, ánh teal/cyan; slot chỉ mép xẻng + vòng chân |
| H12 Ambrin | 37 | trưởng phường kèn trẻ, khăn tang trắng quấn đầu, áo the dài, kèn loa đồng 26 px | funeral_horn | nhạc cụ khác ngoài kèn trên thân |
5.5 Địch theo hạng (hợp đồng clip = demo 04 §4.1, mở rộng)
| Clip | S | M (Tinh Anh) | L (mini-boss) | XL (boss) | Luật |
|---|---|---|---|---|---|
idle | 24–36 L | 36 L | 42 L | 42–60 L | thở |
walk/run/fly | 24 L | 24 L | 24–30 L | 24–30 L | runtime chỉnh tốc phát |
attack, attack2.. | 30–38 (1–2 đòn) | 41–56 (3 đòn) | 40–60 (≤ 5 đòn) | 40–80 (≤ 8 đòn/pha) | t = 0 = khung chạm, stop: 0; pose windup cuối giữ ≥ 3 frame (runtime kéo theo windup CSV, INV-03 ≥ 0.30/0.45 s) |
hurt | 9 | 10 | 10 | 10 | giật lùi |
death | 17–18 (≤ 0.6 s) | 49 | 60 | 79–120 | khung cuối nằm sàn |
spawn | 19 (loài trồi đất) | 24 | intro 45 | intro 60–90 | ấn tro 0.6 s do runtime (INV-14) |
broken (Vỡ Thế) | — | 36 L | 36–42 L | 42 L | quỳ/loạng choạng, đọc rõ "đánh đi" |
phase | — | — | — | 45–60 / pha | chuyển pha bất tử (Bible §7.5) |
| biến thể thế đáp | — | 0 clip | 0 clip | ≤ 1 clip/boss | đổi tham số + 1 pose tell (Bible §7.7) |
- Quái KHÔNG có VFX trong clip, trừ sáng gắn thân (mắt, gân, lửa đầu gậy) — glint vàng, vùng tím, đạn, tro là việc của runtime + sheet VFX (doc 31).
- Không root motion: chân giữ gần pivot; quãng lao do code.
- Ngân sách = frame DUY NHẤT/hướng sau dedupe bw-pack = Σ ceil(frames × steps / 30): S ≤ 160 · M ≤ 260 · L ≤ 520 · XL ≤ 600/pha; frame thô 30 fps chỉ dùng định thời, không có trần. Field
budget.frames_per_dir_maxtrongav/*__actor_sfx.json= số sau dedupe. Mọi quái S + Tinh Anh của 1 biome chung 1 nhóm atlas (GROUPS.<biome>, ≤ 4 trang S + ≤ 3 trang M/L). - Rig dùng chung: 1 rig tứ túc cho EN_B4_04 / MB_B4_1 / rồng BS_B4 (Bible §7.7); bầy hạt (
swarm) = VFX loop + thân lõi ≤ 16 px, không xương. - Ấn Tinh Anh (EM01–EM16): không đổi sprite; hiển thị = glyph Ấn 8×8 px trên
overhead+ viền thân 1 px màu ramp biomee0(không vàng/tím); EM07 Ẩn Ảnh mờ 40% thân nhưng tell/viền/glint/vòng sàn 100%. - Tro Nhớ: Tinh Anh/boss đổi thế → glyph ◆
ash-eye0.6 s trênoverhead+ mắt loé; không vẽ đè tell (Bible §8.4).
5.6 Boss — đa phần & dạng pha
- Đa phần (
construct_driver, cưỡi, 2 đầu): mỗi phần 1 sprite con, pivot riêng,sortOffsetcố định (px, theosy), không đổi thứ tự sort giữa các frame; phần bị đánh chớp riêng; mỗi phần ≤ 96 px cao.
| Boss | Phần (sortOffset) | Silhouette & dấu nhận | Dạng pha | Cấm |
|---|---|---|---|---|
| BS_B1 Người Gác Chuông | thân + chuông búa (0) | canon demo: gù cao 72, búa chuông verdigris | P2 nứt chuông, mắt + vết nứt eye-cold (không tím); P3 chuông vỡ hẳn: thay sheet idle/walk (_p3) | đổi canon demo; vết nứt tím |
| BS_B2 Lão Lái Đò Không Bến | bè vòng rìa (−8) + lão đò (0) | lão gầy còng, nón lá rách vành rộng, áo tơi rơm, sào tre dài 2 × thân, bè tre buộc dây gai | P2 rời bè: sheet bộ; P3 nước dâng = tile sân, không đổi thân | áo choàng trùm đầu che mặt; thân xương lộ; xu/đồng tiền trả đò dưới mọi dạng; đèn lồng treo mũi đò |
| BS_B3 Thợ Cả Đúc Chuông | cỗ máy (0) + buồng lái (+4) + vũ khí rèn (+6, --weapon 3 loại) | cỗ máy lò đúc 2 tay kìm, ống bễ lưng, buồng lái kính đồng, thợ cả nhỏ bên trong | P2 gãy tay: phần tay ẩn, buồng lái sáng eye-cold; P3 lò vỡ: hàng LUT tối 20% | lửa vàng S ≥ 45% (dải tell); khung người máy đứng thẳng kiểu giáp lái |
| BS_B4 Thống Lĩnh Yvra & Rồng Khàn | rồng (0) + Yvra (+6) khi cưỡi; tách = 2 actor độc lập | Yvra giáp lá tro, thương dài thẳng 1.5 × thân, cờ đuôi rách; rồng tro tứ túc cổ dài, cánh rách, họng khàn (rig chung §5.5) | P2 tách thân; P3 cưỡi lại | lưỡi glaive cong lưỡi liềm; thú cưỡi họ mèo/báo; motif trăng (khuyết, tròn, quầng) |
| BS_FINAL Vua Dravos | thân (0) + Mũ Chuông (+2) | vua gầy cao 96, áo bào tang tro rách, Mũ Chuông hình chuông úp (miệng loe, quai đỉnh) ramp tro/ngà = B5 họ B (#bcb5a4 #9a9080 #6c6157 #473e36) + đỉnh ash-eye #f2ead8, Lưỡi Vọng Gãy cầm tay | P2 bóng boss Hồi = sheet boss gốc + hàng LUT 13 (ramp đảo); P3 mũ nứt sáng #fff6f0 | vương miện gai/chóp nhọn; ánh/sương ma màu bạc hà, teal, xanh lục; VFX nhập hồn vào đại kiếm; Mũ Chuông không hình chuông |
| BS_TRUE Cái Lặng | bầy hạt (−4) + lõi tối (0) | không mặt, không chi; bầy hạt tro quanh lõi tối hình chuông câm | P3 Gương Lặng = sprite hero đang chơi + LUT 13 | mặt/mắt/miệng nhân hình; xúc tu |
- Đổi pha bằng: (1) hàng LUT (0 sheet), (2) ẩn/hiện phần, (3) sheet
_p2/_p3chỉ cho clip đổi silhouette. ≤ 3 trang 2048² cho mỗi boss, gồm mọi pha. - Điểm yếu/phần lộ: sáng
eye-coldhoặc#fff6f0viền 1 px; KHÔNG vàng/tím (dành cho tell). - Cột "Cấm" là cổng
art-style-reviewer(§8.5 bước 3): khớp 1 mục cấm =fail. Boss/mini-boss trùng ≥ 3 trục (thân · đòn đặc trưng · nguyên tố/màu · đạo cụ) với 1 nhân vật có thật =faildù không khớp mục cấm nào.
5.6b Khoá art mini-boss (hạng L, §2.3)
| ID | Cao (px) | Silhouette & dấu nhận | Cấm |
|---|---|---|---|
| MB_B1_1 Xà Ích Xe Tang | 72 (xe dài 96) | người lái gầy đội nón tang trên xe tang 2 bánh gỗ, ngựa gỗ khung sườn kéo; quan tài xếp chồng sau xe | ngựa xương có lửa; xe ngựa đen sang trọng có đèn lồng |
| MB_B2_1 Mẹ Kén Tơ Tro | 64 (dài 88) | tứ túc nhện thân dẹt, 6 chân khớp xương, kén tro treo thành chùm ở chân sau; dây tơ tro nhìn thấy được nối kén ↔ thân | túi trứng dưới bụng; dây tơ vô hình/trong suốt; mặt người trên thân nhện; vương miện |
| MB_B2_2 Cá Voi Xác | đầu lộ 96 | vây lưng 48 px + gợn sàn khi lặn; đầu cá voi da bong, xương hàm lộ, 4 lỗ súng lao | vây cá mập; đèn mồi trên đầu |
| MB_B3_1 Cỗ Máy Bước | 80 | 2 chân khớp gà, thân nồi đồng, tấm giáp sáng ở bộ phận bị đánh nhiều | buồng lái kính kiểu giáp lái; tay súng |
| MB_B3_2 Gã Hai Đầu Lò | 76 | đầu to = đầu thợ đúc trọc, hàm vuông; đầu nhỏ = lò bễ ghép trên vai phải, miệng song sắt nhỏ giọt đồng; da ramp B3 họ C | da xanh lam/xám; mũ pháp sư, gậy, rune phát sáng; 2 đầu ngang cỡ cùng loài; phép thuật dưới mọi dạng (đầu nhỏ là cấu trúc, không phải pháp sư) |
| MB_B4_1 Rồng Hai Đầu | dài 96 | tứ túc rig chung §5.5, 2 cổ: đầu lửa-tro họng hẹp, đầu sừng xoắn | 3 đầu trở lên; cánh đầy đủ; màu lửa vàng S ≥ 45% |
| MB_B4_2 Kiếm Sĩ Gương | 64 | kiếm sĩ áo giáp vảy gương mảnh, đầu trần tóc buộc, 1 kiếm thẳng; ảnh giả viền tro rỗng | áo choàng tối trùm đầu; thương/giáo; > 4 ảnh cùng lúc |
- Ảnh MB_B4_2 tối đa 4 (gồm bản thật), khớp Bible §7.4 ("2–4 ảnh").
5.7 NPC hub
- 7 NPC (
NPC_ULLA GREM CALLA LEM HOL MOTT RAM), cao 34–44 px, không clip chiến đấu:idle48 L,talk24 L,react24,action30–60 (hành động trạm: rèn, chở đò, gõ chuông, ghi sổ…). Xuất hướngsse(lậtsw). - Bù Nhìn Răm NPC_RAM (bù nhìn, Sân Tập) thêm
hurt9 +windup_y/windup_pgiữ (dùng đúng tell Y/P/N của INV-02). - Nhóc Lem NPC_LEM (cậu bé đã chết): không xác, không máu; dấu duy nhất = viền thân
ash-neutral1 px khi đứng yên > 3 s. - Portrait NPC:
por_<code>_bust128×128 × 3 biểu cảm, cùng luật §5.3. Palette NPC: ramp ấm trầm S ≤ 40%, không slot hero, không dải tell.
5.8 Ví dụ điền mẫu — Halka H03 Halka (rút gọn)
codeh03·tierhero ·rigbiped ·facingse.silhouette: cao 38, rộng 22; khối: mũ sắt cổ cao + áo choàng ngắn + giáo 65 px chéo lưng; dấu nhận: đường giáo dài nhất roster + 3 chuông.skeleton:M {pelvis 17.6, thigh 7.6, shin 7.4, upper 7.0, fore 6.8, neckUp 3.3, headUp 4.8, shoulderOut 5.8, shoulderUp 2.0}·bulk {head 1.45, chest 1.0, pelvis 1.0, arm 1.0, leg 1.05}·weapon WEAPONS.bell_spear(cán 52 px gỗ sồiPAL.wood, mũi 13 pxPAL.metal, 3 chuông 3×3 pxPAL.metalsáng) ·offWeaponkhông.ramps: mũ/giápPAL.metal4 tông · áo choàng#a8d7ff #6eb4ff #295aa8 #102347(slot r6/r5/r3/r1) · da#ffe2c4 #f8c9a0 #e0a074 #a8664a· vảiPAL.dust; nhấn = chuông;ink #0b0a10.clipsriêng:attack1..3chọc 30/30/36 (tip@hit e: (62, 22));sk_plantcắm sào 45;hold_*Nhảy Sào (cung 60 px, bất tử 0.35 s);answerGõ Chuông 12 (xung r48 tại kẻ tấn công = VFX, không trong clip).vfx_owned: Vỡ Âm (H03_VO_AM, r90 quanh điểm kích): cò ANSWER_HIT (Gõ Chuông trún… VFX_H03_toll_burst (Vỡ Âm r90), Dấu Vang trên địch: enter_fx của ngưỡng TOLL_RESONANT (2 Vang) và TOL… VFX_H03_vang_mark (dấu Vang 1–3 trên địch,overheadđịch), 39 sheet khác theo doc hero.budget: 7 trang ·export:node tools/hero.mjs h03→node Tools/bw-pack.mjs h03.
76. Môi trường — tile & prop
6.1 Lưới & loại tile (Unity Tilemap, PPU 16)
| Loại | Ô trên màn (art px) | Ô sàn thật | Cell Unity | Biến thể | Ghi chú |
|---|---|---|---|---|---|
FLOOR | 32×16 | 32×32 px | (2, 1) | 1 gốc + 7 biến thể, trọng số 60/40 | 2–3 phiến đá/ô, mạch mortar 1 px; = ô spatial hash 32 px |
FLOOR_DETAIL | 16×8 | 16×16 | (1, 0.5) | 8 | vết nứt, rêu nhỏ, sỏi — Tilemap con |
EDGE (sàn → vực/nước) | 32×16 + mặt rơi 24 px | — | (2, 1) | RuleTile 47 ô (blob 8 hướng) | mặt rơi = wall w2→w3 + dither tối đáy |
WALL_N (tường Bắc/Đông/Tây) | đỉnh 32×16 + mặt đứng 48 px | — | (2, 1) + sprite đứng | RuleTile 16 ô (4 hướng) | đỉnh w0, mặt w1/w2, chân w3 |
WALL_S (rìa Nam, hướng camera) | đỉnh 32×16 + mặt ≤ 16 px | — | (2, 1) | RuleTile 16 | lan can thấp: không bao giờ che hero |
LIQUID (nước B2, đồng nguội B3, gương B6) | 32×16 | — | (2, 1) | 8 frame @8 fps loop | trang trí; nguy hiểm thì là hazard Y/P/N (INV-18) |
PIT (hố H11, hố sụt) | runtime | r24 | — | 1 sheet VFX | tile không vẽ sẵn hố |
- Mọi tile vẽ sẵn phép chiếu 3/4 (phiến đá là hình chữ nhật nằm, cao = ½ rộng); cấm ô kim cương.
- Seam: biến thể
FLOORliền mép 4 cạnh; kiểm bằng ghép lưới 8×8 ô. - Mật độ chi tiết: ≤ 30% ô
FLOORcóFLOOR_DETAIL; vùng giữa phòng (r ≥ 120 quanh tâm) ≤ 15% để tell đọc rõ.
6.2 Chiều cao, che khuất, sort
- Prop/tường đứng = sprite trên lớp
GamePlayLayer1, pivot = chân (giữa cạnh đáy footprint), Y-sort với nhân vật. - Cao tối đa: prop trong sân đấu ≤ 48 px; tường Bắc 48–64 px; rìa Nam ≤ 16 px; cột/tháp > 64 px chỉ ở rìa ngoài vùng an toàn 427×267.
- Che hero: prop > 24 px mờ về α 0.45 trong 0.15 s khi pivot hero nằm sau pivot prop và trong khung sprite prop; hero luôn có x-ray 55% (INV-09).
- Footprint va chạm = hình chữ nhật/elip trên sàn (px sàn thật), ghi trong spec prop; sprite không quyết định va chạm.
6.3 Decal
- Lớp
Map(trên tile, dướiFXBot); không va chạm; 8–64 px; ≤ 120 decal/phòng; S ≤ 40%. - Cấm decal giống tell: không vàng/tím, không vòng chấm
ash-neutral, không gạch chéo, không elip sáng viền 2 px. - Decal động từ gameplay (vệt cháy, tro xác): pool 64, sống 8 s, tan dither 0.5 s; ưu tiên xoá cũ nhất.
6.4 Mẫu Tile/Prop spec
File: Design/ArtSpecs/env/<biome>_<slug>.md.
| Field | Giá trị |
|---|---|
id | ENV_<Bx>_<slug> (vd Bia thấp 14 px (demo gravestone_a/c). Chân 12×6 px sàn, va chạm rect,… ENV_B1_gravestone_a) — dùng làm tên file sprite thường |
kind | FLOOR FLOOR_DETAIL EDGE WALL_N WALL_S LIQUID PROP PROP_ANIM DECAL LIGHT |
size | khung px; với PROP: footprint sàn (w×d px thật) + cao đứng px |
pivot | px trong khung (chân / giữa đáy) |
palette | tông từ §3.3 (base, w1, nhấn <vật liệu>), ≤ 12 màu |
variants | số biến thể + trọng số; seed pixelfx |
anim | frames @fps, loop (đuốc 8 @8, lá cờ 6 @6, nước 8 @8) |
collision | không / hình sàn |
occlusion | có mờ khi che (cao > 24 px) |
light | vũng sáng: r, α, màu Đèn biome |
source | bw-props.mjs <name> / pixelfx src/fx/bladewake/prop-*.js / vẽ tay |
review | inv01_check env = 0 lỗi + reviewer |
- Prop có sẵn (Hồi I,
g008-demo):ash_stain bone_pile bones_scatter brazier crack_a crack_b gravestone_a/b/c iron_cage moss_patch pillar pillar_broken rubble skull_candles statue_broken— tái dùng/recolor sang biome khác trước khi vẽ mới. - Mỗi biome tối thiểu: 1 bộ
FLOOR(8), 1 bộEDGE47, 1 bộWALL_N16 +WALL_S16, 12 prop, 8 decal, 2 prop động (nguồn sáng), 1LIQUIDnếu biome có nước. HubHUB_BELL_TOWER: 8 trạmST_*mỗi trạm 1 prop chủ 48–64 px + 2 prop phụ.
87. Key art & capsule Steam
7.1 Hướng
- Cảnh chủ: H01 Varek tiền cảnh 1/3 dưới, hướng
se, giữa nhát Trăng Máu (Trăng Máu H01_UL1) — cung trăng đỏ thẫm lõi#fff6f0; biển Thây Tro (EN_B1_01) palette lạnh B1 lùi dần lên trên; Đại Chuông Vọng câm làm bóng đen đỉnh khung; tro sáng rơi ngược. - Bản phụ (MS sau): 12 Kẻ Thức xếp vòng quanh chuông, mỗi người viền slot (dùng khi đủ roster).
- Palette:
void+ sàn B1 + ramp H01; vàng/tím tell KHÔNG xuất hiện trong key art (dành gameplay). - Pixel thật: vẽ ở độ phân giải gốc rồi phóng NEAREST số nguyên; cấm làm mịn, cấm vẽ mịn rồi pixel hoá.
- Logo chữ "BLADEWAKE": chữ pixel nét 3–4 px, vết nứt chuông cắt ngang chữ A thứ hai, ngà
#f2ead8+ viềnink+ bóng đỏ thẫm 1 px; bản tối và bản sáng.
7.2 Kích thước (gốc → phóng)
| Tài sản | Đích (px) | Gốc (art px) | ×k | Luật |
|---|---|---|---|---|
| Header capsule | 920×430 | 230×108 | 4 | cắt 2 px dọc; logo ≥ 55% rộng |
| Small capsule | 462×174 | 231×87 | 2 | chỉ logo + mặt Varek; logo ≥ 66% rộng |
| Main capsule | 1232×706 | 308×177 | 4 | cắt 2 px dọc |
| Vertical capsule | 748×896 | 187×224 | 4 | |
| Library capsule | 600×900 | 150×225 | 4 | |
| Library header | 920×430 | = header | 4 | |
| Library hero | 3840×1240 | 480×155 | 8 | không logo, không chữ |
| Library logo | 1280×720 | 320×180 | 4 | nền trong suốt |
| Page background | 1438×810 | 360×203 | 4 | cắt 2/2 px; mờ, ít chi tiết giữa |
| Ảnh chụp | 1920×1080 | 480×270 | 4 | chụp in-game, không chỉnh, HUD bật ở ≥ 3/5 ảnh |
- Capsule chỉ có art + logo: không chữ quảng cáo, giải thưởng, điểm đánh giá.
- Nguồn ảnh: theo rule
image-generation(dùng lại → vẽ tay/pixelfx →agy→bf-imgchỉ khi user cho phép); mọi ảnh AI grid-snap về gốc và quaart-style-reviewer= pass.
98. Pipeline sản xuất với pixelfx
8.1 Các bước (1 actor; VFX theo checklist doc 31 §12)
| # | Bước | Lệnh / nơi | Ra |
|---|---|---|---|
| 1 | Viết Actor spec | Design/ArtSpecs/actors/<ID>.md (§5.1) | spec đủ field ★ |
| 2 | Nhánh làm việc | trong Tools/pixelfx: nhánh từ g008-demo tên art/<code> | không commit thẳng g008-demo |
| 3 | Costume + vũ khí | src/fx/heroes/_<code>.js (defineCostume, RAMPS) · vũ khí mới WEAPONS.<weaponId> trong _<code>.js hoặc _<weaponId>.js | — |
| 4 | Clip | src/fx/heroes/<code>-<clip>.js = effect + act (windup t < 0, khung nhả, hits, recovery); quái: stop: 0, không VFX trong clip | — |
| 5 | Nhìn – sửa ≥ 3 vòng | node tools/render.mjs heroes/<code>-<clip> --dirs · node tools/act.mjs heroes/<code>-<clip> --dir s và --dir n · đọc records/.../contact.png | đọc được ×1 cả 8 hướng |
| 6 | Kiểm máy | node tools/check.mjs heroes/<code>-<clip> sạch (biên, kết rỗng, seam, seed, < 2 ms/frame, act keys, tay nhảy) | 0 lỗi |
| 7 | Xuất | node tools/hero.mjs <code> [clips] → records/heroes/<code>/<clip>/<dir>/{body,vfx,vfx-back}.png/json | 8 hướng |
| 8 | Đóng gói | node Tools/bw-pack.mjs <code> (cắt viền, gộp frame trùng, bỏ freeze nướng, giữ e se s n ne, trang 2048², PAD 2) | <code>_<page>.png + <code>.json + <code>_<page>_mask.png |
| 9 | Nhập Unity | chép vào Assets/ArtAsset/Characters/<code>/ (actor) · Assets/ArtAsset/Vfx/Pixel/<owner>/ (VFX) · Assets/ArtAsset/Environment/<Bx>/ | PixelArtImportRules tự áp |
| 10 | Cổng duyệt | §8.5 | pass ghi vào spec |
| 11 | Đăng ký dữ liệu | atlas id + map clip → state trong data actor (doc hero/quái) | — |
8.2 Đặt tên
codeactor mới = ID viết thường (h05,en_b3_04,el_b4_01,mb_b2_2,bs_b4,npc_mott); mã demo giữ:varek=H01 ·thrall=EN_B1_01 ·ghoul=EN_B1_02 ·hexcaster=EN_B1_03 ·bulwark=EN_B1_04 ·bloater=EN_B1_05 ·gravecleaver=EL_B1_01 ·bellwarden=BS_B1.- Clip: snake thường (
attack1,sk03,ul2,hold_loop,as2_fin). Dạng Rèn xuất:<code>_as2,<code>_as3. - File sheet chưa đóng gói:
<code>-<clip>-<dir>.png/json; atlas:<code>_<page>.png,<code>.json,<code>_<page>_mask.png; ánh sáng tách<base>_light.pngdùng JSON của<base>. - VFX: ID
VFX_<ownerId>_<slug>(Bible §11) → filevfx_<ownerid>_<slug>[-<dir>].png/json(thường hoá), thư mục chủ. - Portrait:
por_<code>_<hud|bust|select>[_<expr>].png→Assets/ArtAsset/UIPixel/Portraits/. - Môi trường:
env_<bx>_<slug>.png→Assets/ArtAsset/Environment/<Bx>/.
8.3 Nhập Unity (khoá, PixelArtImportRules.cs)
- Filter Point · Compression None · mipmap tắt · Full Rect · Wrap Clamp ·
WORLD_PIXELS_PER_UNIT16 (world: actor, VFX, tile, prop) ·UI_PIXELS_PER_UNIT25 (UI, portrait) ·pixelsPerUnitMultiplierluôn 1. - Cắt sheet: PNG + JSON cùng stem → mỗi frame 1 sprite theo
frames[i].frame; pivot =meta.pixelfx.pivot(sheet trim: pivot trừ offset nguồn). PNG không có JSON = 1 sprite. - Phát: fps =
meta.pixelfx.fps(30); loop theometa.pixelfx.loop; khung chạm =hitFrames/act.hits. - Sorting layer (demo
Gfx.cs):Map<FXBot<Object<GamePlayLayer1<GamePlayLayer2<GamePlayLayer3<FxLayer<Prioritize<BattleDmgText<UI<UITop; trong 1 actor:vfx-back<body<vfx. Ánh xạ 5 lớp VFX: doc 31 §2.4.
8.4 Ngân sách bộ nhớ (≤ 21 trang 2048² thường trú, Bible §10.3)
| Nhóm | Trang | Nạp/xả |
|---|---|---|
| Hero đang chơi (+ Dạng Rèn đang lắp + VFX riêng) | ≤ 8 | đầu run |
| Quái S biome hiện tại | ≤ 4 | đầu Hồi, xả Hồi trước |
| Tinh Anh biome | ≤ 3 | đầu Hồi |
| Boss Hồi HOẶC mini-boss đang đấu | ≤ 3 | mini: nạp khi chọn nút MBS, xả sau màn thưởng; boss: khi vào hàng R5; không bao giờ cùng lúc |
| VFX dùng chung + prop | ≤ 3 | thường trú |
- Tổng 8 + 4 + 3 + 3 + 3 = 21 trang (Bible §10.3). BS_B4 nạp gói theo pha (đỉnh 3.0 trang), xả gói pha trước khi nạp pha sau.
- Tile biome nằm ngoài 21 trang (1 trang 2048² RGBA32/biome, xả theo Hồi). Vượt trần → gộp clip/giảm frame, không tăng trang.
8.5 Cổng duyệt (thứ tự, dừng ở lỗi đầu tiên)
node tools/check.mjs <id>sạch.py -3 Tools/artcheck/inv01_check.py <png> --kind <loại> --id <ID>= 0 lỗi (§3.7).- Contact sheet 8 hướng (
--dirs) + 2 stripact.mjs --dir s|n+ 1 ảnh in-game trên sàn biome đích ×1 và ×4 → gửi subagentart-style-reviewer(đọc hub §0 + §3/§4/§7) → phải trảpass. - Test 5 s (P4) với actor mới giữa 200 quái B1: người thử gọi đúng tên hero/hạng địch ≥ 80%.
- Ghi
reviewvào spec (ngày, kết quả);fail→ sửa, chạy lại từ bước 1. - Ảnh AI (portrait, key art) dùng thang
image-generation; prompt dựng bằngart-style.py build;bf-imgchỉ khi user cho phép; luồng tự động ghi "need bf-img".
109. Quy tắc cho dev/AI
- Đọc hub
.claude/docs/ArtStyle.md§0 + nhóm liên quan trước mọi việc hình ảnh; doc này cụ thể hoá hub cho 1.0, không thay hub. Mâu thuẫn số → Design Bible thắng, rồi doc này, rồi hub; báo dev để sửa hub (không tự sửa hub từ task này). - Không export actor khi spec thiếu field ★ (§5.1); không đưa vào
Assets/khi chưa qua §8.5. - Mọi màu lấy từ bảng §3.2–§3.6 hoặc
PAL.<x>của pixelfx; không tự đặt ramp song song. Màu mới → thêm vào bảng ở doc này kèm lý do + chạy lại §3.7. - Hero mới/skin mới: giữ slot ±10° (skin ±4°), đổi bằng hàng LUT, không vẽ lại sprite.
- Địch: S ≤ 40%, không đỏ thẫm, mắt/gân ≤ 10% pixel và có mask để alt LUT tự bật.
- Mọi vòng/vùng/bóng trên sàn là elip 2:1 theo §2.1; không bao giờ vẽ vòng sàn như hình tròn đứng hay 1 đường.
- Không xoay sprite để ngắm; dùng sheet 8 hướng hoặc sprite đối xứng tròn.
- Không đổi PPU, filter, nén của sprite pixel; không zoom lẻ; camera snap 1 art px.
- Quái không mang VFX trong clip (trừ sáng gắn thân); glint/vùng tím/đạn là sheet VFX + runtime (doc 31).
- Hero/boss/mini-boss: khớp 1 mục cột "Cấm" (§5.4, §5.6, §5.6b) =
fail, không ngoại lệ; actor mới chưa có dòng khoá → thêm dòng (silhouette + Cấm) trước khi vẽ. - Vùng sàn hero luôn đặc + lõi
#fff6f0(INV-01c); không mượn dạng tell P (fill 25% + viền 2 px) cho bất kỳ FX hero nào. - Không tái tạo sprite, nhân vật, logo của tựa game có thật; tên/thiết kế luôn tự đặt; không ghi tên game/studio/thương hiệu vào file trong repo.
- Tác giả code pixelfx trên nhánh
art/<code>cắt từg008-demo; push/merge chỉ khi dev đồng ý.
1110. Quyết định đã chốt
| Q | Quyết định | Lý do |
|---|---|---|
| Độ phân giải art | 480×270 ×4 (1080p), Deck 427×267 ×3, công thức §2.2 | Bible §10.4 khoá; demo 01 640×360 là lịch sử |
| PPU world | 16 (world), 25 (UI); demo runtime PPU 1 bỏ | hub §1 + PixelArtImportRules.cs; Tilemap ô (2,1) gọn |
| Phép chiếu | sy = 0.5·fz + h, vòng sàn elip 2:1, không bù tốc theo trục | = pixelfx VIEW.tilt 0.5, 1 nguồn sự thật cho art + gameplay |
| Ramp hero | 8 bậc + lõi #fff6f0, sinh từ signature_hex, hue ±10° ngoài 2 dải tell | INV-01b/c; 1 ramp dùng cho export và LUT |
| Môi trường | S ≤ 40% mọi pixel | tổng quát trần "cam nung S ≤ 40%" của B3; tự động tránh 2 dải tell (S ≥ 45%) |
| Alt tro-xương | texture mask điểm nhấn song song atlas + PAL_LUT 1 pass | INV-01d: 0 sheet thêm, 0 trang atlas thêm |
| 2026-11-07 — vết nứt P2 BS_B1 | demo 04 §3 "mắt + vết nứt sáng tím" → eye-cold #9ff3ff | INV-01a cấm tím S ≥ 45% ngoài tell P; tránh đọc nhầm thân boss là vùng phải Lướt |
| 2026-11-07 — ramp H01 | giữ CRIMSON canon (8 bậc, r0 330° → r6 22°) dù 4 bậc lệch > 10° khỏi tâm 354°; inv01_check dùng cửa sổ 330–23° cho H01; mọi hero khác ±10° | INV-01b áp cho slot; demo canon Varek khoá; 22° vẫn ngoài 24–70°; slot H06 (4–24°) giữ ΔE 59 theo Bible |
| Mã actor | ID viết thường; 8 mã demo giữ nguyên | ASCII ổn định, không dấu; không phá asset demo |
| Bộ nhớ | ≤ 21 trang 2048² thường trú, chia §8.4 | Bible §10.3; Varek demo = 8 trang |
| Portrait | 32 / 128 / 192 px, vẽ lại từng cỡ | đọc rõ ở HUD, hội thoại, màn chọn; không thu nhỏ mờ |
| Key art | pixel gốc phóng NEAREST số nguyên, cắt ≤ 2 px | giữ VP1 trên mọi capsule |
| 2026-11-07 — khói H10 | p.disc fill đặc 45%, lõi xoáy #fff6f0, viền mềm 3 px r6, alpha không đồng đều; gate §3.7 mục 6 từ chối fill < 40% + viền 2 px | bản cũ "trong suốt, viền slot" trái INV-01c + Bible Q12; 5 đĩa teal rỗng viền đọc như viền tell P giữa 200 quái |
| 2026-11-07 — khoá boss | §5.6 thêm cột Silhouette + Cấm; BS_FINAL cấm vương miện gai, ánh ma bạc hà/teal/lục, nhập hồn đại kiếm; Mũ Chuông giữ hình chuông, ramp tro/ngà; BS_B4 cấm glaive lưỡi liềm, thú cưỡi họ mèo, motif trăng; BS_B2 cấm áo trùm xương, motif xu trả đò | archetype vua tang/kỵ sĩ cưỡi thú/lái đò người chết dễ trôi về nhân vật có thật; cấm cụ thể = reviewer chấm được |
| 2026-11-07 — ramp nhấn môi trường | lửa ma B1 e2 #466e75 → #476e75, cam nung B3 e2 #755946 → #755a47 (= file biome); #d99f82 B3 chỉ là tint đèn | 2 tông cũ S 40.2% vượt trần môi trường S ≤ 40%; 1 nguồn sự thật với data/ biome |
| 2026-11-07 — khoá mini-boss | thêm §5.6b (7 MB); MB_B3_2 đầu nhỏ = lò bễ ghép vai (cấu trúc), cấm da lam/xám, đồ pháp sư, 2 đầu ngang cỡ; MB_B2_1 kén tro + tơ thấy được, cấm túi trứng bụng, tơ vô hình; MB_B4_2 cấm áo choàng tối trùm đầu, giáo, > 4 ảnh | MB_B3_2 bản cũ trùng ≥ 3 trục (thân, đòn, nguyên tố) với 1 nhân vật có thật = ngưỡng "không an toàn" của dự án |
| 2026-11-07 — trần §5.5 đếm frame sau dedupe | ngân sách frame/hướng = frame duy nhất sau dedupe bw-pack; L 360 → 520; frame thô không có trần | bảng clip M tối thiểu 302 thô; L 520 phủ mini lớn nhất MB_B2_1 507; data trước đó khai 3 cách (thô, thô + dòng lệch, dedupe) |
| 2026-11-07 — tách slot mini-boss §8.4 | hàng "Tinh Anh + mini-boss ≤ 3" → "Tinh Anh ≤ 3" + slot "Boss Hồi HOẶC mini-boss đang đấu ≤ 3" dùng chung, không bao giờ nạp cùng lúc; tổng vẫn 21 trang | B2 cần 0.75×2 + 2.5 + 2.5 = 6.5 trang, B3 6.5, B4 ≈ 4.25 (MB_B4_1 riêng 2.75): không biome nào vừa 3 trang chung |