1Giới thiệu & bản đồ tài liệu
Mục đích: đặc tả TOÀN BỘ giao diện Bladewake cho PC Steam (tay cầm trước, bàn phím/chuột đủ) + Steam Deck: hệ toạ độ UI, bộ UI kit (font có dấu tiếng Việt, token màu, 9-slice, icon, glyph nút), danh mục màn có id, bố cục từng màn ở 1920×1080 và 1280×800, phần tử + trạng thái, đồ thị điều hướng (thứ tự focus tay cầm, KB/M), chuyển động, âm SFX_UI_*, giới hạn chữ cho loc, HUD đọc được giữa 150–250 quái, thanh boss có glyph thích nghi, móc trợ năng, luồng onboarding. Phụ thuộc: 00-Design-Bible.md + data/_bible.json (INV-01/02/08/09/15/16, §1.1 bản đồ nút, §2 run, §3 hub, §4 Khăn Tang/mode/Thương Xót, §6 draft/rarity/icon, §8.4 Tro Nhớ UI, §10.3 loc/font, §10.4 camera) · 10-Combat-Core §6.5 (số sát thương, callout), §4.1 (Thế), §8 (HP, khiên, bình) · 11-Defense-Tells §4 (trợ năng tell) · 12-Hero-Framework §1 (input, glyph), §2.2 (hud.element tài nguyên) · 13-Upgrades-Builds §2–§4, §8–§12 (draft, Đổi/Xoá/Giữ, Cộng Hưởng, Tiến Hoá, Relic, Sạp Rong) · 14-Adaptive-AI §14 (Mắt Tro, ◆, callout) · 16-Run-Structure-Map (luồng, bản đồ, thưởng, cổng boss, tổng kết, lưu) · 18-Meta-Hub-Progression (trạm, menu trạm, codex, onboarding 3 run) · 30-Art-Direction §2.2, §3.6, §5.3 (zoom, token hệ thống, portrait) · 31-VFX-Bible §1, §2.4 (thứ bậc hiển thị, lớp screen) · 32-Audio-Bible §3.7, §7.1 (cue nhạc, 37 SFX_UI_*) · 43-Steam-Platform §8, §12 (Deck, glyph, loc) · data/av/UI.json (27 VFX_UI_*, 37 SFX_UI_*) · demo GDD/08-Arena-HUD.md (lịch sử). Được dùng bởi: dev Unity (UI prefab, UIManager + UiScreen, HudController, BossBar, DraftScreen, MapScreen, HubMenu*, InputGlyphs, TextCanvas), agent UI/mockup (/new-ui, /refactor-ui), artist UI kit (9-slice, icon, font), agent loc (giới hạn chữ, ngữ cảnh), QA (checklist Deck, test 5 s HUD), hub .claude/docs/ArtStyle.md §8 (bản tóm tắt token/kit).
Mục lục chi tiết (## và ###)
- 0. Phạm vi, thứ bậc, quy ước
- 0.1 Đơn vị & canvas
- 0.2 Lớp render UI (Unity, trên mọi sorting layer world — 30 §8.3, 31 §2.4)
- 1. UI kit
- 1.1 Font (pixel, có đủ dấu tiếng Việt)
- 1.2 Bậc chữ (Trợ năng "Cỡ chữ" 100 / 125 / 150%; ui_text_scale_min Deck 1.25)
- 1.3 Token màu UI (screen-space; nguồn duy nhất cho mọi màn — đồng bộ sang hub ArtStyle §8b)
- 1.4 9-slice (UI_Kit atlas, 1 trang 1024², PPU 25, Point, pixelsPerUnitMultiplier 1)
- 1.5 Icon & glyph
- 1.6 Thành phần chuẩn (prefab UI_C_)
- 2. Danh mục màn (UiScreen)
- 3. Điều hướng
- 3.1 Lệnh UI chung (action map UI trong InputActions, remap được, tách khỏi map Gameplay)
- 3.2 Đồ thị màn
- 4. HUD trong trận (CombatHud)
- 4.1 Vùng (UI px trong SAFE 427×267; giống hệt ở 1920×1080 và 1280×800)
- 4.2 Ô kỹ năng & Ult
- 4.3 Widget tài nguyên (hud.element, 12 §2.2; rect RES 96×8)
- 4.4 Theo dõi mục tiêu (OBJECTIVE, 112×30)
- 4.5 Thanh boss, nameplate, Mắt Tro
- 4.6 Đọc được giữa bầy (150–250 quái)
- 4.7 Sự kiện HUD (World)
- 5. Màn trong run
- 5.1 ActIntro (3.5 s, bỏ qua sau 1 s bằng A/Enter — 16 §7.3)
- 5.2 Map (bản đồ Hồi; mở bằng d-pad lên / M ở bất kỳ lúc nào trong run để XEM — chọn nút chỉ khi ở trạng thái MAP)
- 5.3 Draft (lên cấp / EDGE+; luật 13 §2–§4)
- 5.4 SkillPick · LinchpinPick · Tiến Hoá
- 5.5 Reward · Rest · Secret · Event · Shop · Dock · BossGate
- 5.6 Pause (Menu / Esc; World + Hero dừng; nhạc snapshot pause; VFX_UI_pause_dim, SFX_UI_pause)
- 5.7 Chết, hồi sinh, thắng, tổng kết, kết
- 6. Màn ngoài run
- 6.1 Khởi động & tiêu đề
- 6.2 Hub (HubHud, HubTravel, Dialogue)
- 6.3 Settings (7 tab; mọi thay đổi áp ngay, "Mặc định" theo tab: UI_C_Confirm)
- 6.4 Khuôn menu trạm (UI_StationMenu, dùng cho §6.5–§6.12)
- 6.5 Hearth — Lửa Canh (ST_HEARTH)
- 6.6 Forge — Lò Rèn Vọng: tab Rèn Kẻ Thức (12 dòng: điều kiện chiến công + giá 0–16 Mảnh Vọng; rèn → cảnh 4 s SFX_HUB_forge_unlock) · Dạng Rèn (12 hero × AS2/AS3 8/15) · Ult (UL2/UL3 6/10) · Tiến Hoá (công thức EVO1–EVO4 mỗi hero: đã lộ = 2 icon + điều kiện; chưa = bóng "?"; EVO4 hiện ở MR12) · Nâng trạm (UP_FORGE_1–5).
- 6.7 DockDepart — Bến Đò
- 6.8 Ledger — Sổ Tang (tab: Codex · Lịch Sử Run · Bia Mộ · Sổ Thù · Bàn Thờ Ký Ức · Sưu Tập · Bảng Xếp Hạng)
- 6.9 TestBell — Chuông Thử
- 6.10 Market — Chợ Đò: tab Pool (Edge chung + Relic chưa mở; lọc LB/RB phụ theo loại, X đổi lọc tag/rarity; thứ tự rẻ trước, nhóm theo tag — 18 §6.5; sau GD2 +12 mục) · Lễ Vật (LV01–LV06, chọn ≤ 1 (UP_MARKET_3: 2), tắt khi mode đã chọn là DAILY/BOSS_RUSH: "Không dùng ở chế độ này") · Nâng trạm (UP_MARKET_1–5).
- 6.11 Yard — Sân Tập (menu nổi trên sân, World chạy)
- 6.12 Wardrobe — Tủ Áo Tang (GD4): tab Skin (hero → 4 skin, xem trước LUT trên _select) · Trang trí (6 tượng, 18 hộp nhạc — A nghe thử 10 s, 30 tranh) · Hành trang lưu (UP_WARDROBE_1: 3 ô) · Màu phụ (UP_WARDROBE_3, trong slot INV-01).
- 6.13 Màn hệ thống & thông báo (#44–#53, trạng thái Leaderboard)
- 7. Chuyển động & âm UI
- 7.1 Luật chuyển động (ArtStyle §8e)
- 7.2 Bản đồ âm UI (37 SFX_UI_, bus UI, đồng hồ UI — 32 §7.1)
- 8. Giới hạn chữ cho loc
- 9. Móc trợ năng (UI phía thực thi; luật gốc 11 §4, Bible §4.3, meta.accessibility)
- 10. Onboarding & hướng dẫn
- 10.1 Lần chạy đầu (khớp 18 §12)
- 10.2 Gợi ý trong run (HINT, 1 dòng, glyph nút theo thiết bị)
- 11. Telemetry UI (chỉ khi đồng ý, 43 §15)
- Quy tắc cho dev/AI
- Quyết định đã chốt
20. Phạm vi, thứ bậc, quy ước
- Thứ bậc: Bible +
_bible.json> doc nền (10–17, 20, 30–32, 51) > doc này. Doc này KHÔNG đặt số gameplay (thời gian draft, giá, %): chỉ trích lại và trình bày. Số UI mới (px, thời lượng tween, α) do doc này sở hữu; số[ASSUMED]chỉnh ởtuning.jsonsectionplatform/vfx(khoáui_*). - Tên hiển thị chốt (Bible §11): Khăn Tang / Độ Tang (MRN01–MRN15) · Act Mutator (MUT01–MUT12) · Dạng Rèn (Song Liềm Tro H01_AS1…) · Dư Âm (
ULT_GAUGE) · ĐÁP (chạm RB/RMB) + verb giữ riêng hero · Then Chốt (Gió Gạt H01_E37–E40) · Tro Nhớ / Mắt Tro / ◆ · Vàng Mã, Tro Hồn, Mảnh Vọng, Nến Canh. UI không bao giờ hiện id loại (ASPECT,LINCHPIN,CV). - Id màn = enum code
UiScreen.<Name>(không phải id dữ liệu, không vào JSON). Prefab:UI_<Name>.prefabtrongAssets/_Project/UI/Screens/.
0.1 Đơn vị & canvas
| Khoá | Giá trị |
|---|---|
| Đơn vị | UI px = 1 art px của thang UI. Thang UI = zoom world nguyên (30 §2.2): 1920×1080 ×4 · 1280×800 (Deck) ×3 · 1280×720 ×2 · 2560×1440 ×5 · 3840×2160 ×8. Không bao giờ thang lẻ, không sub-pixel. |
| Canvas | canvas_w = ceil(W / zoom), canvas_h = ceil(H / zoom): 1080p = 480×270 · Deck = 427×267 (1281×801, cắt 1 px phải/dưới) · 720p = 640×360 |
SAFE | rect 427×267 UI px giữa canvas (= vùng an toàn gameplay Bible §10.4). Mọi HUD, nút, chữ tương tác nằm trong SAFE; nền màn/vignette phủ cả canvas. gốc SAFE = (⌊(canvas_w − 427)/2⌋, ⌊(canvas_h − 267)/2⌋) UI px: 1080p (26, 1) = 1708×1068 px màn tại (104, 4) · Deck (0, 0) = cả màn · 720p (106, 46) |
| Lề trong | M = 4 UI px từ mép SAFE cho mọi phần tử neo góc; khoảng cách giữa khối = bội 4 UI px |
| Tuỳ chọn "Vùng an toàn màn" | thu SAFE thêm 0 / 4 / 8 / 12 / 16 UI px mỗi cạnh (TV, overscan); mặc định 0; Deck khoá 0 |
| Toạ độ trong doc | (x, y, w, h) UI px, gốc trên-trái của SAFE (y xuống). Vì SAFE giống nhau ở 1080p và Deck, mọi bố cục HUD/màn dùng 1 bản số; khác biệt chỉ ở cột "Deck" của bảng chữ (§1.2) và các màn có ghi chú riêng |
| Siêu rộng 21:9 | canvas 640×288 (3440×1440 ×5); SAFE vẫn 427×267 giữa; nền màn kéo dài; không phần tử nào neo mép canvas |
| Đổi px màn | px_man = UI_px × zoom; ví dụ thanh HP 96×7 UI = 384×28 px ở 1080p, 288×21 px ở Deck |
0.2 Lớp render UI (Unity, trên mọi sorting layer world — 30 §8.3, 31 §2.4)
| Thứ tự | Canvas | Chứa | Ghi chú |
|---|---|---|---|
| 1 | WorldUI (World Space, PPU 25, đồng hồ Real) | nameplate Tinh Anh/mini, nhắc INTERACT, cue tài nguyên world ≤ 12 px quanh chân (12 §2.2), Mắt Tro ◆ overhead | Y-sort theo actor; không bao giờ trên lớp Prioritize (tell) |
| 2 | BattleDmgText | số sát thương (1 mesh, VFX_UI_dmg_number*) | dưới HUD; không đè vùng HUD đang hiện (§4.6) |
| 3 | Hud (Screen Space Camera, pixel-perfect) | §4 | ẩn khi mở màn toàn phần |
| 4 | Screens | màn/popup §2 | mỗi màn 1 prefab, UIManager show/hide (không SetActive tay — rule core-system) |
| 5 | TextCanvas | chữ CJK + chữ ≥ FNT_L khi bật "chữ 150%" | canvas riêng độ phân giải màn (Bible §10.3) |
| 6 | Overlay | toast thành tựu, con trỏ focus, phụ đề tell, hộp xác nhận, màn chuyển cảnh | trên cùng |
31. UI kit
1.1 Font (pixel, có đủ dấu tiếng Việt)
- Quyết định: studio tự vẽ bộ font bitmap
FNT_BW_*(Latin + Latin Extended-A + 134 ký tự tiếng Việt dựng sẵn + Cyrillic + ký hiệu game) trên lưới pixel cố định; không dùng font thư viện pixelfx (không giấy phép,30§1). CJK (zh-CN, JA, KO) = 1 font bitmap 12 px giấy phép mở cho thương mại, chọn ở M10, ghi tên + giấy phép vào hub ArtStyle §8d; tên font không ghi trong GDD. - Dấu chồng tiếng Việt (ể, ặ, ỗ, Ữ) = 2 tầng trong vùng dấu, không đè dòng trên; không tầng dấu nào được cắt khi
line_heightnhư bảng.
| Font | Vai | Cap (UI px) | Vùng dấu | Chân | line_height | Bước ngang TB | Ở 1080p (cap px màn) | Ở Deck (cap px màn) |
|---|---|---|---|---|---|---|---|---|
FNT_BW_S | chú thích, tag, số phụ, tooltip | 5 | 3 | 1 | 9 | 4 | 20 | 15 |
FNT_BW_M | thân chữ, nút, tên thẻ, thoại | 7 | 3 | 2 | 12 | 6 | 28 | 21 |
FNT_BW_L | tiêu đề màn, callout, tên boss | 10 | 4 | 3 | 17 | 8 | 40 | 30 |
FNT_BW_XL | logo phụ, tên Hồi, kết | 14 | 5 | 3 | 22 | 11 | 56 | 42 |
FNT_BW_NUM | số sát thương, bộ đếm HUD | 7 (ô 5×7) | — | — | 9 | 6 | 28 | 21 |
CJK 12 px (canvas TextCanvas, px màn) | mọi vai (zh/ja/ko) | ô 12 px màn ×2 = 24 px màn = 6 UI px (1080p) / 8 UI px (Deck) | — | — | 28 px màn = 7 / 10 UI px | 1 ô | 24 | 24 |
- Sàn đọc Deck (
43§8.2): chữ nhỏ nhất ≥ 12 px cao trên màn →FNT_BW_S15 px ✓; thân ≥ 16 px →FNT_BW_M21 px ✓; CJK 24 px ✓. - Màu chữ chỉ từ token §1.3; viền chữ trên nền world (HUD, callout, nameplate) = 1 px
ui-ink8 hướng; trên panel: không viền. - Số: chữ số đều bề rộng (tabular) ở mọi font; dấu nghìn theo locale (VI "1.234", EN "1,234").
1.2 Bậc chữ (Trợ năng "Cỡ chữ" 100 / 125 / 150%; ui_text_scale_min Deck 1.25)
| Vai (role) | 100% | 125% (mặc định Deck) | 150% |
|---|---|---|---|
caption (tag, số phụ, chú thích icon) | S | M | M |
body (mô tả thẻ, tooltip, codex, cài đặt) | S | M | L |
button · name · dialogue | M | M | L |
title · callout · boss_name | L | L | L |
display | XL | XL | XL |
| HUD số (HP, đồng hồ, giây hồi chiêu) | NUM | NUM | NUM ×2 dọc (font NUM nhân 2) |
- Font pixel không co giãn lẻ: "125%" = đổi font theo bảng, không scale. Mọi hộp chữ
bodyphải chứa 125% không tràn (Deck mặc định); 150% được phép cuộn (thanh cuộn 2 px, cuộn bằng RS / con lăn). - Đổi cỡ chữ sống, không cần khởi động lại; màn đang mở dựng lại bố cục trong ≤ 1 frame.
1.3 Token màu UI (screen-space; nguồn duy nhất cho mọi màn — đồng bộ sang hub ArtStyle §8b)
Luật: UI không áp slot hero INV-01b (INV-01g) nhưng áp INV-01a — không pixel UI nào có S ≥ 45% ở hue 32–62° hoặc 260–290° (để không lẫn tell vàng/tím); ngoại lệ (chỉ phần tử ĐANG biểu diễn tell, dùng đúng #ffd84a/#b14cff + hình ◇/▲/chấm): mũi tên tell ngoài màn, glyph Y/P/N trong recap INV-16 và phụ đề tell, ảnh minh hoạ tell ở Sân Tập/codex/Cài đặt (§4.6 H9). Mọi token dưới đã kiểm: cột "Hue / S".
| Token | Hex | Hue / S | Vai |
|---|---|---|---|
ui-ink | #0b0a10 | — | viền 1 px icon/khung/chữ trên world (= ink) |
ui-void | #15131d | 252° / 34% | nền màn toàn phần, letterbox (= void) |
ui-panel | #1d1926 | 258° / 34% | mặt panel |
ui-panel-2 | #262131 | 259° / 33% | ô trong panel, hàng chẵn danh sách |
ui-bevel-lit | #3a3348 | 260° / 29% | hàng px sáng trên-trái của khung (bevel bậc) |
ui-bevel-dark | #0f0d15 | 255° / 38% | hàng px tối dưới-phải |
ui-dim | #0b0a10 α 0.60 | — | lớp tối sau popup / tạm dừng (UiPause open/close (snapshot SN_DRAFT; World + Hero dừng) VFX_UI_pause_dim, không blur) |
ui-text | #f4efe0 | 45° / 8% | chữ chính, số sát thương thường (= ngà doc 10 §6.5) |
ui-text-2 | #a8a4b0 | 260° / 7% | chữ phụ, số phụ |
ui-text-off | #6b6777 | 255° / 13% | chữ/nút khoá, hết tiền |
ui-focus | #ffffff | — | con trỏ focus 2 px (UiNavigate (focus mới trên mọi nút/thẻ/nút bản đồ; ẩn khi dùng chuột … VFX_UI_focus_cursor) |
ui-warn | #d9725a | 11° / 59% | thiếu tiền, cảnh báo xoá, "Khoá Tiến Hoá" |
ui-ok | #7be08a | 129° / 45% | hồi phục, đủ điều kiện, mua được |
ui-hp | #c8364a | 352° / 73% | thanh HP hero |
ui-hp-lag | #f4efe0 | — | đoạn HP vừa mất, trễ 0.40 s rồi lùi 0.25 s |
ui-hp-grey | #8a8494 | 262° / 11% | HP xám H06 (10 §8.2) |
ui-shield | #dfe6f0 | 215° / 7% | khiên, nối sau HP (10 §8.2 "bạc trắng") |
ui-dmg-taken | #ff5a5a | 0° / 65% | số hero nhận (10 §6.5) |
ui-xp | #8fc7bd | 169° / 28% | thanh XP (thay vàng demo — INV-01a) |
ui-poise | #c0c4d0 | 225° / 8% | thanh Thế boss/Tinh Anh (bạc, Bible INV-01a) |
ui-ult-empty | #3a3348 | — | Dư Âm chưa đầy; phần đầy = màu slot hero (HERO_LUT, UltGaugeFull (Dư Âm ULT_GAUGE = 100) VFX_UI_ult_gauge_full) |
ui-cur-gold | #e9dcc0 | 41° / 18% | Vàng Mã (giấy ngà dấu mực, cấm vàng bão hoà) |
ui-cur-ash | #e8e4f0 | 260° / 5% | Tro Hồn |
ui-cur-shard | #cfd8e8 | 218° / 11% | Mảnh Vọng |
ui-cur-candle | #f2ead8 | 42° / 11% | Nến Canh |
ui-ash-eye | #f2ead8 | 42° / 11% | Mắt Tro, ◆ (= ash-eye doc 30 §3.6) |
ui-risk | #8a3a30 | 7° / 65% | viền nút ELT_RISK (MapNodeChosen + trạng thái nút: khả dụng (thở) / đã đi (mực đặc) / kh… VFX_UI_map_node_pick) |
ui-locked | #4a4556 | 258° / 20% | ô/hero/trạm khoá |
ui-rarity-common | #9a95a8 | canon Bible §6 | khung COMMON |
ui-rarity-rare | #5fa8d3 | canon | khung RARE |
ui-rarity-epic | #c86a8a | canon | khung EPIC |
ui-rarity-legend | #f4f1ea động | canon | khung LEGENDARY (chỉ Then Chốt) |
ui-rarity-cursed | #141016 + viền #d8cfc0 | canon | khung Lời Nguyền; glyph "—" cái giá #d8cfc0 |
ui-card-skill | #7d7a88 | 253° / 10% | thẻ kỹ năng |
ui-card-evo | #a8683c | 24° / 64% | góc/khung Tiến Hoá [ASSUMED] (doc 13 §9.3: chờ cổng ΔE với slot H06) |
- Thêm màu = thêm token ở bảng này (lý do + màn dùng) trước khi dùng (rule art-style). Màu slot hero chỉ dùng ở: Dư Âm đầy, khung chân dung HUD 1 px, lửa chọn hero (HeroSelected ở Lửa Canh (chọn hero / ult / Dạng Rèn / kỹ năng khởi đầ… VFX_UI_hero_select), icon ghép Edge hero (dấu hero).
- Mù màu: mọi phân biệt bằng màu ở UI có thêm hình: rarity = số chấm góc thẻ (§1.6), nút bản đồ = icon, tiền = icon riêng, trạng thái = glyph.
1.4 9-slice (UI_Kit atlas, 1 trang 1024², PPU 25, Point, pixelsPerUnitMultiplier 1)
Phong cách: bevel bậc (hàng sáng trên-trái ui-bevel-lit, hàng tối dưới-phải ui-bevel-dark), viền ngoài 1 px ui-ink, ramp 3–4 bậc, chất liệu giấy tang/gỗ cháy/đồng xỉn (ArtStyle §6), không gradient mịn.
| Id sprite | Kích thước nguồn | Border (T/R/B/L) | Trạng thái | Dùng |
|---|---|---|---|---|
NS_PANEL | 24×24 | 8/8/8/8 | — | panel màn, menu trạm, tạm dừng |
NS_PANEL_INSET | 16×16 | 5/5/5/5 | — | ô trong panel, danh sách |
NS_BUTTON | 24×16 | 6/6/6/6 | normal · focus · pressed · disabled | mọi nút chữ (cao 16) |
NS_TAB | 20×14 | 6/6/4/6 | on · off · focus | thanh tab LB/RB |
NS_CARD_<R> × 7 | 32×48 | 10/10/10/10 | normal · focus (+2 px nâng) · picked | thẻ draft/thưởng/sạp; <R> = COMMON, RARE, EPIC, LEGEND, CURSED, SKILL, EVO |
NS_TOOLTIP | 16×16 + đuôi 5×3 | 4/4/4/4 | — | tooltip, chú thích icon |
NS_DIALOGUE | 32×24 | 10/10/10/10 | — | hộp thoại NPC (giấy tang, mép rách) |
NS_NAMEPLATE | 12×8 | 3/3/3/3 | — | nameplate Tinh Anh/mini (world) |
NS_BAR_FRAME | 12×7 | 3/3/3/3 | — | khung mọi thanh (HP, XP, Dư Âm, boss) |
NS_BOSS_BAR | 48×12 | 4/14/4/14 | normal · locked (bất tử pha) | thanh boss, 2 đầu = quả chuông đồng xỉn |
NS_TOAST | 24×16 | 6/6/6/6 | — | toast thành tựu, mở khoá |
NS_MAP_PAPER | 64×64 | 20/20/20/20 | — | tờ bản đồ Hồi (giấy mực, mép cháy) |
NS_SLOT | 28×28 | 4/4/4/4 | empty · filled · cooldown · denied · locked | ô kỹ năng/ult/Relic/loadout |
- Đổi skin theo bối cảnh: hub dùng biến thể
_wood(gỗ ấm), run dùng_paper(giấy tang lạnh); cùng border, cùng kích thước → 1 prefab.
1.5 Icon & glyph
| Loại | Kích thước gốc (UI px) | Nguồn | Luật |
|---|---|---|---|
| Item (kỹ năng 96, ult 36, Dạng Rèn 36, Relic 60, Then Chốt 48, EVO 48) | 32×32 | vẽ tay (Bible §6: 324) | 1 vật, 3/4 mặt trước, sáng trên-trái, viền ink (ArtStyle §5) |
| Edge hero / Edge chung / affix | 32×32 | GHÉP bằng script: glyph tag 16×16 × dấu hero 8×8 góc dưới-phải × khung rarity | 0 vẽ tay (Bible §6) |
| Pictogram (tag 21, nút bản đồ 11, thưởng 5, tiền 4, mode 5, trạm 8) | 16×16 | vẽ tay | đọc được ở ×3 |
| Glyph nhỏ (12 STS, 16 Ấn EM, 15 MRN, 12 MUT) | 8×8 | vẽ tay (55, Bible §6 + DEC-2026-11-07-05) | hình mang nghĩa, không chỉ màu |
| Glyph nút (5 bộ: bàn phím/chuột · ABXY · ký hiệu hình học · Deck · chạm sau 1.0) | 11×11 (cùng dòng FNT_M) | vẽ tay | đổi sống theo thiết bị nhập cuối trong 0.5 s (12 §1.1); chuột chỉ đổi sang KBM khi dịch > 8 px |
| Portrait | por_<code>_hud 32×32 · _bust 128×128 · _select 192×192 | doc 30 §5.3 | không thu nhỏ; HUD dùng _hud |
1.6 Thành phần chuẩn (prefab UI_C_*)
| Thành phần | Kích thước · luật | Âm / FX |
|---|---|---|
Nút UI_C_Button | cao 16, rộng ≥ 48, đệm ngang 6; chữ button; glyph nút 11×11 bên trái chữ khi là hành động có phím tắt | focus UiNavigate (focus đổi; cooldown 40 ms khi giữ hướng) SFX_UI_nav_move · bấm UiConfirm (A / Enter / click trái) SFX_UI_nav_confirm · khoá UiError (hành động không được phép: thiếu tiền, khoá, ô đầy) SFX_UI_nav_error + rung ±2 px 0.12 s |
| Con trỏ focus | khung 2 px ui-focus + 1 px ui-ink ngoài + 4 góc ngoặc 4×4 nhịp ra/vào 1 px ở 2 Hz; "Giảm chuyển động" → đứng yên | UiNavigate (focus mới trên mọi nút/thẻ/nút bản đồ; ẩn khi dùng chuột … VFX_UI_focus_cursor |
Tab UI_C_Tabs | LB/RB (KB: Q/E, chuột bấm); vòng quanh; hiện glyph LB/RB ở 2 đầu | UiTabSwitch (LB/RB, Q/E, click tab) SFX_UI_tab_switch |
| Thanh trượt | bước theo dữ liệu; d-pad trái/phải 1 bước, giữ > 0.4 s → 10 bước/s; chuột kéo | UiSliderStep (mỗi bước thanh trượt; pitch = −6..+6 bán cung theo giá … SFX_UI_slider_tick (pitch theo giá trị) |
Giữ để xác nhận UI_C_Hold | vòng 13×13 quanh glyph; phá huỷ/không hoàn (Bỏ run, xoá save, gột Sẹo, xoá Sổ Thù, đổi Tro Hồn → Nến Canh) = 1.0 s; mua ≥ 500 Tro Hồn hoặc ≥ 10 Mảnh Vọng = 0.5 s (18 §2); Trợ năng "Thời gian giữ" ×0.5–×2.0 nhân cả hai | UiHoldStart → UiHoldComplete (giữ để xác nhận 1.0 s); thả sớm = vòng … VFX_UI_hold_ring + UiHoldStart → loop cháy dần (1.0 s mặc định) → UiHoldComplete 'phụt';… SFX_UI_hold_confirm (loop + chốt); thả sớm → vòng lùi 0.15 s |
| Tooltip | hiện sau 0.25 s focus; rộng ≤ 160, ≤ 6 dòng body; neo phải phần tử, lật trái nếu tràn SAFE | không âm |
Popup xác nhận UI_C_Confirm | 200×72 giữa SAFE; 2 nút; focus mặc định = nút AN TOÀN (Huỷ) | UiPopupOpen / UiPopupClose (biến thể 01 open, 02 close) SFX_UI_popup (open/close) |
| Badge mới | chấm "!" 5×7 ui-warn góc trên-phải; tắt khi focus ≥ 0.5 s | — |
Hiển thị tiền UI_C_Currency | icon 16×16 + số FNT_BW_NUM; đổi số đếm lên 0.4 s | CurrencyChanged delta>0 (cuối run, nhặt Mảnh Vọng, đổi ở Chuông Thử) VFX_UI_currency_fly + SFX_UI_currency_gain/spend |
| Rarity cho mù màu | số chấm 3×3 ở góc trên-trái thẻ: COMMON 1 · RARE 2 · EPIC 3 · LEGENDARY ✶ 5×5 · CURSED "—" | thay glyph ●◆▲✦ của DraftOpen: 3 thẻ rút ra lệch 0.06 s (cả màn chọn Relic/Edge hero đầu … VFX_UI_card_reveal [ASSUMED] (◆ dành Tro Nhớ, ▲ dành tell P mù màu) |
42. Danh mục màn (UiScreen)
Cột World: RUN = World chạy · ×0.15 = World chậm + hero bất tử (draft phòng thường) · 0 = World dừng · HUB = hub chạy. Nhạc = cue doc 32 §3.7 đang phát (màn không đổi cue thì ghi "giữ").
| # | UiScreen | Tên hiển thị | Mục đích | Vào từ | World | Nhạc |
|---|---|---|---|---|---|---|
| 1 | Language | Ngôn ngữ | chọn ngôn ngữ lần chạy đầu | PhotoWarning (lần đầu) | — | — |
| 2 | Consent | Dữ liệu chơi | 2 câu hỏi: telemetry (chưa chọn sẵn) + báo crash 3 lựa (43 §15.1, 60 PV01) | Language | — | — |
| 3 | Title | Màn tiêu đề | Tiếp tục run / Chơi / Lộ trình EA (bản EA) / Wishlist + Góp ý (bản demo) / Cài đặt / Credits / Thoát | boot, Thoát về tiêu đề | — | TITLE · màn tiêu đề + menu chính (Cài đặt/Credits mở từ đây giữ nguyên cue dưới SN_DRAFT)… MUS_title_mute_night |
| 4 | Settings | Cài đặt | 7 tab §6.3 | Title, Pause, HubPause | 0 | giữ |
| 5 | Credits | Danh đề | cuộn credits từ credits.json (§5.7.1) | Title, Ending, Cài đặt › Dữ liệu & quyền riêng tư | — | ENDING · END_BELL_TOLL Hồi Chuông (Gióng chuông sau BS_FINAL) · phần tuyến tính 180 s = f… MUS_end_bell_toll (credit loop) |
| 6 | HubHud | (lớp hub) | tiền meta, nhắc tương tác, beat chờ | hub | HUB | HUB · HUB_BELL_TOWER Tháp Chuông Gãy (mọi trạm ST_*) · S0 + stem GĐ Phục Dựng đã mở (GD1–… MUS_hub_bell_tower |
| 7 | HubTravel | Dịch chuyển | danh sách trạm đã mở | MAP trong hub | HUB dừng hero | giữ |
| 8 | Dialogue | Thoại | beat NPC (≤ 3 câu) | trạm, Dock, BossGate | 0 (hub) / 0 | giữ |
| 9 | Hearth | Lửa Canh | tab Kẻ Thức · Hành trang · Phục Dựng · Nâng trạm | Lửa Canh ST_HEARTH | 0 | giữ |
| 10 | Forge | Lò Rèn Vọng | Rèn hero · Dạng Rèn · Ult · Tiến Hoá · Nâng trạm | Lò Rèn Vọng ST_FORGE | 0 | giữ |
| 11 | DockDepart | Bến Đò | chọn mode, xem seed DAILY, xuất phát, Chìa Đò | Bến Đò ST_DOCK | 0 | giữ → DepartConfirmed ở ST_DOCK (t=0 cảnh 6 s) SFX_HUB_dock_depart |
| 12 | Ledger | Sổ Tang | Codex · Lịch Sử Run · Bia Mộ · Sổ Thù · Bàn Thờ Ký Ức · Sưu Tập · Bảng Xếp Hạng | Sổ Tang ST_LEDGER | 0 | giữ |
| 13 | TestBell | Chuông Thử | Khăn Tang · Mắt Tro · Đổi Nến Canh | Chuông Thử ST_TEST_BELL | 0 | giữ |
| 14 | Market | Chợ Đò | Mở pool · Lễ Vật · Nâng trạm | Chợ Đò ST_MARKET | 0 | giữ |
| 15 | Yard | Sân Tập | dummy, bài tập, frame data, Thử Thách | Sân Tập ST_YARD | HUB (sân) | giữ |
| 16 | Wardrobe | Tủ Áo Tang | Skin · Trang trí · Hành trang lưu | Tủ Áo Tang ST_WARDROBE | 0 | giữ |
| 17 | ActIntro | (thẻ Hồi) | tên biome + Act Mutator lật | đầu Hồi | 0 | cue biome |
| 18 | Map | Bản đồ Hồi | chọn nút kế, xem thưởng, mutator | sau thưởng, d-pad lên / M | 0 | giữ (lọc thấp) |
| 19 | CombatHud | HUD | §4 | trong phòng | RUN | cue biome/boss |
| 20 | Draft | Lên cấp / Thưởng Edge | chọn 1/3 thẻ, Đổi/Xoá/Giữ/Bỏ qua | lên cấp, EDGE+ | ×0.15 hoặc 0 | giữ |
| 21 | SkillPick | Kỹ năng | học/đổi/nâng hạng (1/3) + màn phụ chọn ô | thưởng SKILL, thẻ kỹ năng | 0 | giữ |
| 22 | LinchpinPick | Then Chốt | chọn 1/2 Then Chốt (thưởng BS_B2) | sau Draft boss | 0 | giữ |
| 23 | Reward | Phần thưởng | GOLD/HEAL/META/Relic 1/2–1/3, Relic đầy → Đổi/Phân rã | phòng xong | 0 | stinger room_clear |
| 24 | Shop | Sạp Rong | 6 ô (SHP) / 4–5 ô (DOCK) + dịch vụ | SHP, Dock | 0 | giữ |
| 25 | Rest | Lửa Canh Nhỏ | chọn 1: hồi 40% / nâng hạng 1 kỹ năng / gỡ Lời Nguyền | RST | 0 | giữ |
| 26 | Secret | Mộ Lạc | đổi Relic lấy Lời Nguyền 1/2 | SEC | 0 | giữ |
| 27 | Event | Sự Kiện | EVT_<Bn>_nn: chữ + 2–3 lựa | EVT | 0 | giữ |
| 28 | BossGate | Cổng boss | tên boss, Sổ Thù MACRO, gợi ý phản chế, dùng bình | chọn R6 | 0 | cue boss intro |
| 29 | Dock | Bến Giữa Hồi | hồi 25%, Sạp 4 món, Đổi miễn phí, beat Calla | sau BOSS_REWARD | 0 | DOCK · Bến Giữa Hồi (nút DOCK sau boss Hồi I–IV, ≤ 20 s, Sạp Rong + chở đò Calla sang Hồi… MUS_dock_crossing |
| 30 | Pause | Tạm dừng | Tiếp tục · Build · Chỉ số · Relic · Bản đồ · Cài đặt · Báo lỗi · Thoát về tiêu đề · Bỏ run | Menu / Esc (trong run) | 0 | snapshot pause |
| 31 | AshInspect | Tro đang nhớ | bảng PSP khi giữ View/Tab | giữ View/Tab | RUN | giữ |
| 32 | Revive | Lửa Gửi | trình diễn hồi sinh 1.0 s | HP 0 còn Lửa Gửi | 0 | giữ |
| 33 | DeathRecap | Tàn tro | recap INV-16 + "Tro đã học" + bia mộ | chết | ×0.3 → 0 | DEATH · hết Lửa Gửi trong run (mọi biome, mọi mode) · bắt đầu đồng bộ thẻ recap INV-16 = … MUS_death_epitaph |
| 34 | RunSummary | Tổng kết | 3 tab Kết quả · Build · Thưởng | DeathRecap, thắng, bỏ | — | giữ |
| 35 | BossVictory | Hạ boss | thưởng boss, nút "Khắc Sẹo" | boss HP 0 | 0 | stinger victory |
| 36 | FinalChoice | Lựa chọn cuối | "Gióng chuông" / "Giữ lõi" (khi có Lựa chọn Giữ lõi hiện ở trận BS_FINAL (END_ASH_CROWN). FLAG_DRAVOS_PAGE_READ) | BS_FINAL | 0 | FINALE · B5 Đỉnh Chuông Câm (Kết, act V): ải 60 s trộn quái 4 Hồi (lớp theo I) + BS_FINAL… MUS_finale_crown |
| 37 | Ending | Kết | 3 kết (+ 12 thẻ kết theo hero ở END_QUIET_SHORE) | FinalChoice, BS_TRUE | — | ENDING · END_BELL_TOLL Hồi Chuông (Gióng chuông sau BS_FINAL) · phần tuyến tính 180 s = f… MUS_end_bell_toll / ENDING · END_QUIET_SHORE Bến Bình Yên (hạ BS_TRUE ở B6) · 210 s tuyến tính đi cùng 12 thẻ… MUS_end_quiet_shore / ENDING · END_ASH_CROWN Mũ Tro (chọn "Giữ lõi" ở BS_FINAL) · 120 s tuyến tính: hero đội Mũ… MUS_end_ash_crown |
| 38 | RushBuild | Dựng build | BOSS_RUSH: 4 vòng × 6 thẻ chọn 3 + Relic 1/3 | DockDepart | — | giữ |
| 39 | Leaderboard | Bảng xếp hạng | DAILY/Truy Tuần/ENDLESS/BOSS_RUSH; trạng thái "Không kết nối" · "Điểm đang chờ duyệt" · "Đã quá hạn nộp" (§6.13) | Ledger, RunSummary | — | giữ |
| 40 | Toast · Confirm · Tooltip | (lớp phủ) | §1.6 | mọi nơi | — | — |
| 41 | PhotoWarning | Cảnh báo nhạy sáng | 4 s, bỏ qua sau 1.5 s; nút "Mở Trợ năng ngay" (42 §1.2 bước 1) | boot (lần đầu) | — | — |
| 42 | QuickSetup | Thiết lập nhanh | 6 dòng (42 §1.2 bước 3) | Consent | — | — |
| 43 | ChoosePath | Chọn cách đi | 3 thẻ preset Thương Xót, mặc định Hành Trình (19 §5.6, §6.2) | cảnh mở đầu 20 s sau "Chơi" lần đầu | — | TITLE · màn tiêu đề + menu chính (Cài đặt/Credits mở từ đây giữ nguyên cue dưới SN_DRAFT)… MUS_title_mute_night giữ |
| 44 | HubPause | Tạm dừng | Tiếp tục · Cài đặt · Thoát về tiêu đề · Thoát game | Menu / Esc trong hub (41 §4) | HUB dừng | snapshot pause |
| 45 | SaveConflict | Chọn bản lưu | 2 thẻ tóm tắt, chọn = UI_C_Hold 1.0 s (43 §7.3 luật 2) | boot (khi phát hiện) | — | — |
| 46 | SaveNotice | Thông báo lưu | 1 nút, 3 mẫu chữ (43 §7.3 luật 3–5) | boot, tải save | — | — |
| 47 | PadLost | Kết nối lại tay cầm | lớp phủ trên Pause/HubPause, tự đóng khi cắm lại (43 §8.1) | tay cầm rời | 0 | snapshot pause |
| 48 | RankedNotice | Bảng xếp hạng | thông báo nộp điểm lần đầu + "Chơi không xếp hạng" (43 §15.1) | DockDepart (DAILY/ENDLESS/BOSS_RUSH lần đầu) | 0 | giữ |
| 49 | CrashPrompt | Báo lỗi crash | "Game đã gặp lỗi lần trước. Gửi báo lỗi?" (43 §15.3) | boot sau crash, lựa chọn "Hỏi mỗi lần" | — | — |
| 50 | BugReport | Báo lỗi | mô tả ≤ 500 ký tự + "Đính kèm ảnh" | Pause, HubPause › Báo lỗi | 0 | giữ |
| 51 | DemoEnd | Còn tiếp ở Early Access | Wishlist + "Góp ý" + "Chơi lại" (43 §3.1–§3.2) | bản demo: BossVictory BS_B1 | — | ENDING · END_BELL_TOLL Hồi Chuông (Gióng chuông sau BS_FINAL) · phần tuyến tính 180 s = f… MUS_end_bell_toll (credit loop) |
| 52 | EaProgress | Lộ trình Early Access | 4 mốc U1/U2/U3/1.0 từ config/ea_roadmap.json (43 §4) | Title (bản EA) | — | giữ |
| 53 | Loading | (chuyển cảnh) | ink-wipe 0.25 s + 1 dòng mẹo codex; chỉ hiện khi tải > 0.5 s (50 §5.3) | hub → run, DOCK → Hồi kế, Title → hub | 0 | giữ (lọc thấp) |
53. Điều hướng
3.1 Lệnh UI chung (action map UI trong InputActions, remap được, tách khỏi map Gameplay)
| Lệnh | Tay cầm | Bàn phím / chuột | Luật |
|---|---|---|---|
| Di chuyển focus | d-pad, LS | mũi tên, WASD; rê chuột = focus | giữ hướng: lặp sau 0.35 s, 12 bước/s; UiNavigate (focus đổi; cooldown 40 ms khi giữ hướng) SFX_UI_nav_move cooldown 40 ms |
| Xác nhận | A | Enter, Space, LMB | — |
| Quay lại / đóng | B | Esc, RMB (ngoài vùng kéo) | ở gốc màn trong run: đóng về game; ở gốc menu trạm: về hub |
| Tab trái / phải | LB / RB | Q / E, bấm tab | vòng quanh |
| Trang / cuộn nhanh | LT / RT | PgUp / PgDn, con lăn | danh sách > 1 trang |
| Chi tiết | View | Tab | mở tooltip mở rộng / so sánh (ngoài trận; trong trận View/Tab = ASH_INSPECT) |
| Hành động phụ 1 / 2 | X / Y | theo màn (ghi ở từng màn) | glyph luôn hiện ở thanh nhắc nút đáy màn |
| Mở tạm dừng | Menu | Esc (khi không có màn mở) | trong run → Pause; trong hub → HubPause (41 §4: Menu = "Tạm dừng / Cài đặt") |
- Thanh nhắc nút
UI_C_PromptBar: dòng đáy mỗi màn (y = 251, cao 12): tối đa 5 cặp glyph + nhãn ≤ 12 ký tự, căn phải; đổi bộ glyph sống. - Focus đầu vào mỗi màn ghi ở cột "Focus đầu" của §5–§6; quay lại màn đã mở trong cùng phiên → khôi phục focus cũ.
- Lưới: không vòng ngang; danh sách dọc: vòng. Điều hướng khai báo tường minh (
Selectable.navigation = Explicit), không tự động theo khoảng cách. - Chuột: hover đặt focus + tooltip; bấm ngoài panel không đóng màn (tránh mất thẻ draft); con lăn cuộn danh sách dưới con trỏ.
- Chống bấm nhầm: màn mở do sự kiện (draft, thưởng, cổng boss, chết) khoá xác nhận 0.30 s đầu (input vẫn di chuyển focus) — tránh nút Đánh/ĐÁP đang bấm dở chọn thẻ.
- Tự tạm dừng theo
game.auto_pause_focus(42§8; bật mặc định, khoá BẬT trên Deck): khi bật, mất focus cửa sổ / overlay Steam → mởPause(run) ngay trong frame (43§8.3), trừ màn đã World 0; khi tắt (chỉ PC) cửa sổ mất focus vẫn chạy. Deck suspend và tay cầm rời luôn tạm dừng, không phụ thuộc option (tay cầm rời →Pause/HubPause+ lớp phủPadLost).
3.2 Đồ thị màn
boot → [CrashPrompt nếu crash lần trước + "Hỏi mỗi lần"] → [SaveConflict | SaveNotice nếu có] → (lần đầu) PhotoWarning → Language → Consent → QuickSetup → Title
boot → (không phải lần đầu) Title
Title → Chơi lần đầu (FLAG_FIRST_WAKE) → cảnh mở đầu 20 s → ChoosePath → Loading → Hub(ST_HEARTH)
Title → Chơi → (có run dở? Confirm "Tiếp tục run / Bỏ run") → Loading → Hub | Map(điểm lưu)
Title → Settings | Credits | Thoát ; bản EA: Title → EaProgress ; bản demo: Title → Wishlist (overlay cửa hàng) | Góp ý (form web)
Hub(HubHud) ⇄ HubTravel ; Hub → INTERACT trạm → Hearth | Forge | DockDepart | Ledger | TestBell | Market | Yard | Wardrobe (B → Hub)
Hub → beat chờ → Dialogue → Hub
Hub → Menu → HubPause → Tiếp tục | Settings | BugReport | Thoát về tiêu đề (Confirm) → Title | Thoát game (Confirm)
DockDepart → [RankedNotice lần đầu DAILY/ENDLESS/BOSS_RUSH] → Xuất phát → [RushBuild nếu BOSS_RUSH] → Loading → ActIntro(I) → Map
Map → chọn nút → CombatHud | Shop | Rest | Secret | Event | BossGate
CombatHud → (lên cấp) Draft → CombatHud ; (phòng xong) Reward/Draft/SkillPick → Map
BossGate → CombatHud(boss) → BossVictory → Draft(boss) → [LinchpinPick] → [EvoFuse] → Dock → Loading → ActIntro(n+1) → Map
bản demo: BossVictory(BS_B1) → DemoEnd → Wishlist | Góp ý | Chơi lại → RunSummary → Hub
Hồi IV → Dock → CombatHud(FINALE_TRIAL) → CombatHud(BS_FINAL) → [FinalChoice] → Ending → Credits(lần đầu) → RunSummary
CombatHud → HP 0 → Revive (còn Lửa Gửi) → CombatHud | DeathRecap → RunSummary → Hub | "Thức Lại" → ActIntro(I)
mọi màn run → Menu → Pause → Settings | BugReport | Thoát về tiêu đề | Bỏ run (Hold 1.0 s) → RunSummary
tay cầm rời (mọi nơi) → Pause | HubPause + PadLost → (cắm lại) đóng PadLost, giữ tạm dừng
64. HUD trong trận (CombatHud)
4.1 Vùng (UI px trong SAFE 427×267; giống hệt ở 1920×1080 và 1280×800)
y0 ┌XP══════════════════════════════════════════════════════════════════════┐
│Lv12 ●●(+2) ◆◆ NGƯỜI GÁC CHUÔNG 12:34 ☠ 1.204 │
│ [██████████████░░░░|░░░░░] −1.234 ▤ 340 │
│ [▓▓▓▓▓▓▓▓░░ Thế] Chuỗi 86 │
│ ┌mục tiêu──────────┐│
│ │Chuông 2/3 ▬▬▬░ ││
│ (vùng giữa 160×100 KHÔNG HUD) └──────────────────┘│
│ ▣▣▣ Cộng Hưởng NÓ ĐÃ ĐỌC BẠN: GẠT [toast] │
│ ◫◫ trạng thái [tinh · trái] │
│┌──┐ HP [████████░░] 96/120 ◉◉○ [LB][LT][RT] ┌──┐ │
││☺ │ Dòng [██████░░░] [ 3 ][ ✓][ 5 ] │ULT│ │
│└──┘ ◇◇ ✚2 ✹ └──┘ │
y267└───────────────────────────────────────────────────────────────────────┘
| Khối | Rect (x, y, w, h) | Nội dung | Ẩn khi |
|---|---|---|---|
XP | (4, 1, 419, 3) | thanh XP ui-xp, khung không viền (3 px) | BossRush (cấp cố định) |
LEVEL | (4, 6, 60, 9) | "Lv 12" FNT_BW_S + pip "+N cấp chờ" 5×5 (LevelQueued (+N cấp chờ) VFX_UI_level_queue_pip, LevelQueued (pip '+N cấp chờ' trên HUD khi lên cấp giữa giao tranh) SFX_UI_level_queue), tối đa 5 pip rồi "+N" | — |
RUN | (343, 6, 80, 36) | đồng hồ run FNT_BW_NUM (mm:ss, ≥ 60 phút h:mm:ss; BOSS_RUSH: m:ss.mmm, xem MODE) · kill · Vàng Mã (icon 8×8 + số) · "Chuỗi N" khi N ≥ 10, mờ 3 s sau khi đứt | — |
MODE | (343, 44, 80, 10) | trạng thái mode, FNT_BW_S căn phải (bảng dưới) + icon nến tắt 8×8 (cờ mercy_used) ở mép phải (415, 45) | STANDARD/CUSTOM không cờ Thương Xót (chừa chỗ, không dời khối khác) |
MODS | (311, 56, 112, 10) | glyph 8×8 Act Mutator của Hồi + "Độ Tang N" khi > 0 (căn phải, ngay dưới icon nến của MODE) + glyph MRN14 nếu có Kẻ Truy Tang | Hồi I không Khăn Tang |
OBJECTIVE | (311, 68, 112, 30) | §4.4 | phòng BOS, MBS, ELT DUEL (thanh trên thay) |
BOSSBAR | (93, 7, 240, 36) | §4.5 | không có boss/Tinh Anh Cổng |
TOAST | (295, 100, 128, 24) ×≤ 2 xếp xuống (tới y 148) | thành tựu/mở khoá (AchievementUnlocked (toast góc phải trên; hàng đợi ≤ 3, trong combat … VFX_UI_achievement_toast), 3.0 s, trượt vào 0.15 s từ phải | khi BOSSBAR + boss đang windup P (hoãn) |
HINT | (113, 170, 200, 12) | gợi ý nút onboarding 1 dòng (§10) | sau run 3 hoặc Cài đặt "Gợi ý" TẮT |
CALLOUT | (93, 184, 240, 17) | Callout chữ: 'THEN CHỐT' 1.0 s · 'CỘNG HƯỞNG (II)' 1.2 s · 'TIẾN HOÁ/… VFX_UI_callout: 1 cái/lúc, hàng đợi ≤ 2, ưu tiên Tro Nhớ > Then Chốt > Tiến Hoá > Cộng Hưởng > Vỡ Thế; FNT_BW_L ui-text viền ui-ink | — |
SUBS | (143, 203, 140, 27) | phụ đề tell (11 §4.2) "[tinh · trái]" ≤ 3 dòng FNT_BW_S, dòng mới đẩy dòng cũ lên, mỗi dòng sống 1.2 s | Trợ năng "Phụ đề tell" TẮT (mặc định TẮT) |
RESONANCE | (4, 207, 120, 10) | ≤ 8 icon tag 10×10 có đếm ≥ 1, sắp theo đếm giảm; số đếm FNT_BW_S góc; viền bạc khi bậc I, ngà khi bậc II (13 §8.2) | không có Edge |
STATUS | (4, 219, 72, 10) | ≤ 6 icon trạng thái hero 8×8 + thanh thời gian 8×1 dưới (31 R7) | không trạng thái |
HERO | (4, 231, 32, 32) | por_<code>_hud, viền 1 px màu slot; nháy trắng 0.07 s khi trúng đòn | — |
HP | (40, 231, 96, 7) | ui-hp + ui-hp-lag + ui-shield nối sau + ui-hp-grey (H06); số "96/120" FNT_BW_S tại (140, 230) | — |
RES | (40, 240, 96, 8) | widget tài nguyên theo hud.element (§4.3) | — |
EYE | (140, 240, 23, 7) | Mắt Tro: 3 con ngươi 7×5 cách 1, ui-ash-eye (§4.5.3) | Tro Nhớ cấp hiệu dụng 0 → mắt nhắm (vẫn hiện) |
DASH | (40, 250, 22, 6) | 2–3 hình thoi 6×6 cách 2: đặc = sẵn, đang nạp tô từ dưới lên 0.70 s (INV-12) | — |
POTION | (66, 249, 12, 12) | bình + số "×2"; 0 bình → icon ui-locked | — |
REVIVE | (82, 249, 10, 12) | icon Lửa Gửi ×n (GD4: 2); dùng → tắt (16 §8.1) | MRN06 |
SKILLS | ô 1 (309, 239) · ô 2 (337, 239) · ô 3 (365, 239), mỗi ô 24×24 | §4.2 | ô chưa mở: khung locked + khoá 8×8 |
ULT | (395, 235, 28, 28) | Dư Âm + icon ult §4.2 | — |
| Glyph nút | trên mỗi ô, y = 227, 11×11 | LB/LT/RT/Y hoặc Q/E/F/R theo thiết bị | Cài đặt "Hiện nút trên HUD" TẮT |
- Vùng cấm HUD: rect 160×100 quanh tâm
SAFE(133, 83, 160, 100) — không phần tử HUD nào, kể cả toast/callout, chạm vùng này. Cột phải (RUN,MODE,MODS,OBJECTIVE,TOAST) bắt đầu từ x ≥ 295 > 293 = mép phải vùng cấm.
Khối MODE theo mode (19 §5, 43 §6.2; mẫu loc {param}):
| Mode | Chữ MODE | RUN | Ghi chú |
|---|---|---|---|
| STANDARD · CUSTOM | (ẩn) | như thường | chỉ hiện icon nến khi mercy_used |
| DAILY · Truy Tuần | "Lễ Ngày {dd/mm}" / "Truy Tuần {ww}" + thẻ "TẬP" ui-text-off khi lượt không tính điểm ("Chơi tập", 19 §5.2) | như thường | thẻ "TẬP" cũng hiện khi ngoại tuyến (43 §13) hoặc đã chọn "Chơi không xếp hạng" |
| ENDLESS | "Tầng {floor} · Vòng {loop}" (loop = floor((floor − 1)/4) + 1, 19 §5.3; Hồi I–IV trước tầng 1: ẩn) | như thường | đổi số → nảy ×1.2 0.1 s |
| BOSS_RUSH | "Trận {count}/6" | m:ss.mmm = tổng ms thời gian đánh 6 trận (= điểm bảng, 43 §6.2); dừng ở màn nghỉ 6 s và ngoài trận | XP ẩn (đã có) |
mọi mode, cờ mercy_used | + icon nến tắt 8×8 ui-text-2 | — | tooltip trong Pause: "Run này không tính bảng xếp hạng và thành tựu Độ Tang" (Bible §4.3) |
- Deck: không khác bố cục. Ở 125% chữ (mặc định Deck) chỉ khối có vai
captionđổiFNT_BW_S→FNT_BW_M:LEVEL(h 12), số HP dời xuống (140, 229) — mọi rect trên đã chừa đủ 12 px.
4.2 Ô kỹ năng & Ult
| Trạng thái ô kỹ năng | Hình | Âm |
|---|---|---|
| sẵn | icon 24×24 (thu từ 32×32 nguồn bằng bản vẽ riêng 24×24, không scale) | — |
| thời gian hồi chiêu | phủ quét kim đồng hồ ui-ink α 0.60; số giây giữa ô FNT_BW_NUM (≥ 1.0 s số nguyên, < 1.0 s 1 chữ thập phân) | — |
| vừa sẵn | viền trắng loé 0.12 s | — |
| bấm khi chưa sẵn | nháy ô 0.2 s SkillCastDenied (input kỹ năng khi hồi chiêu) VFX_UI_skill_denied, KHÔNG che số giây | SkillCastDenied (input kỹ năng khi đang hồi chiêu; HUD nháy ô 0.2 s, … SFX_UI_skill_denied |
| thiếu tài nguyên (kỹ năng tốn tài nguyên) | icon ui-text-off + gạch chéo 1 px ui-warn góc dưới-phải 6×6 | SkillCastDenied (input kỹ năng khi đang hồi chiêu; HUD nháy ô 0.2 s, … SFX_UI_skill_denied |
HOLD đang nạp | vòng mốc nạp quanh ô, màu slot hero | — |
| hạng | 1–3 vạch 3×1 góc trên-phải (I/II/III) | — |
| Ult (Dư Âm) | ô 28×28 tô từ dưới lên: phần chưa nạp ui-ult-empty, phần đã nạp màu slot hero α 0.55; 100 → icon ult sáng + UltGaugeFull (Dư Âm ULT_GAUGE = 100) VFX_UI_ult_gauge_full nhịp 1 Hz + UltGaugeFull (Dư Âm ULT_GAUGE = 100), 1 lần, không lặp SFX_SHARED_ult_ready; MRN08 không đổi hình. UL3 đang ở dạng: ô hiện thanh thời gian còn lại dọc mép trái | — |
4.3 Widget tài nguyên (hud.element, 12 §2.2; rect RES 96×8)
hud.element | Hero | Hình trong RES | Cue world (≤ 12 px quanh chân, màu slot + trắng) |
|---|---|---|---|
BAR | H01 · H05 · H06 · H07 | thanh 96×6 + vạch mốc 1×6 ở mỗi thresholds[].value; tên mốc đang bật hiện icon 8×8 cạnh phải (passive 13/12 §2.3) · H06: đoạn HP xám nối sau HP (khối HP) | H06 Tôi 80–95 · H07 Đỉnh Hơi |
PIPS | H02 · H04 · H09 · H11 | N ô vuông 6×6 cách 2 (H02 6 Đinh · H04 5 Mực · H09 6 Vòng · H11 5 Đất + 3 ô tròn 6×6 = Hố, tách 4 px) | — |
ON_ENEMY | H03 | chữ "Vang ×N" = số địch đang 3 Vang + chuông 8×8; pip 3 chấm trên vòng chân địch (world) | pip trên địch |
OBJECTS | H10 | 5 ô 16×6: mỗi ô thanh 8 s còn lại + glyph nguyên tố kế 6×6 | — |
CHAMBERS | H08 | 2 ổ × 3 viên 6×6, icon loại đạn theo thứ tự nạp; ổ đang bắn viền trắng | Nạp Nóng |
CLOCK | H12 | 16 pip 4×6 cách 2 (Nhịp 0–16) + kim phách 120 BPM chạy đồng hồ Hero | vòng nhịp quanh chân |
- Đầy tài nguyên (
full_event): viền thanh loé 0.2 s, không âm UI riêng (âm do hero). Tài nguyên = 0 không nhấp nháy (INV-11: 0 vẫn ĐÁP).
4.4 Theo dõi mục tiêu (OBJECTIVE, 112×30)
Dòng 1 FNT_BW_S tên mục tiêu ≤ 18 ký tự · dòng 2 tiến độ chữ + thanh 104×3 ui-text-2. Đổi số → nảy ×1.2 0.1 s. Xong → dòng gạch ngang 0.4 s rồi khối mờ 0.3 s.
| Mục tiêu | Dòng 2 (mẫu loc, {param}) |
|---|---|
| PURGE | "Diệt {count}/{n}" hoặc "Trụ {seconds} s" (theo luật nào đến trước, 15 §10) |
| VIGIL | "Giữ lò {seconds} s" + thanh HP lò 300 |
| BELLS | "Chuông {count}/3" |
| TIDE | "Đợt {count}/3" |
| NEST | "Mộ Mở {count}/3" |
| GAUNTLET | "Qua hành lang" + thanh tiến độ theo quãng đường |
| CHASE | "Đuổi {seconds} s" + mũi tên mép SAFE chỉ kẻ mang báu (luôn hiện) |
| DUEL · HUNT | "Hạ Tinh Anh {count}/{n}" (DUEL dùng BOSSBAR cỡ M, khối này ẩn) |
| RESCUE | "Phá kén {value}/400" |
CHL: thêm dòng "Thử Lửa ×2" + glyph mutator cục bộ / ◆ thế đáp bật sẵn. Phòng có MESO dịch spawn: ◆ nhỏ cạnh tên mục tiêu suốt phòng.
4.5 Thanh boss, nameplate, Mắt Tro
4.5.1 BOSSBAR (prefab UI_BossBar, 3 cỡ)
| Cỡ | Dùng | Tên | HP | Thế |
|---|---|---|---|---|
| L | boss Hồi, BS_FINAL, BS_TRUE | FNT_BW_L ≤ 24 ký tự, căn giữa (93, 7, 240, 17) | NS_BOSS_BAR (93, 25, 240, 8) | (93, 34, 240, 3) ui-poise |
| M | mini-boss MBS, Tinh Anh ELT DUEL | FNT_BW_M ≤ 24 (113, 9, 200, 12) | (113, 22, 200, 6) | (113, 29, 200, 2) |
| M×2 | HUNT (2 Tinh Anh) · boss tách thân (BS_B4 P2) | 2 tên FNT_BW_S | 2 thanh 118×6 cách 4, trái = mục tiêu đầu | 2 thanh 118×2 |
- HP: đoạn mất chuyển
ui-hp-lagtrễ 0.40 s rồi lùi 0.25 s; khấc 1×8ui-inkở mỗi ngưỡng pha (bosses/<id>.jsonpha theo % HP); số tích luỹ "−1.234"FNT_BW_Sui-text-2bên phải thanh = tổng sát thương trong cửa sổ 1.0 s trượt, biến mất 1.0 s sau cú cuối. Màu HP boss =ui-textngà trên nềnui-panel(không đỏ — đỏ là HP hero). - Thế (bạc): chỉ hiện khi < 100% hoặc trong Vỡ Thế; Vỡ Thế → thanh nháy
ui-poise/ui-text4 Hz suốt 3.0–4.0 s (Giảm chớp → đặc liền + chữ "VỠ THẾ"FNT_BW_S) + callout "VỠ THẾ" (ưu tiên thấp nhất) (10§4.1). - Bất tử chuyển pha: khung đổi
locked(2 xích 8×8 hai đầu), HP không giảm, boss_phase_change t = 0 VFX_SHARED_screen_phase; mở lại khi pha mới nhận đòn. - Glyph thích nghi (doc 14 §14): 2 khe ◆ 9×9 bên trái tên (cỡ L: (75, 11) và (84, 11); cỡ M: dịch theo tên). Trạng thái mỗi khe: rỗng (viền 1 px
ui-ash-eye) = thế đáp đã biết (codex) chưa bật · đặcui-ash-eye= đang bật · nứt (đặc + vết nứt 1 pxui-ink) = Sẹo. Khe chưa gặp: không vẽ. Bật/đổi thế: khe loé 0.4 s đồng bộ khựng 0.6 s của boss. Tooltip của khe chỉ đọc được trongAshInspect. Khi chơi H02: ◆ thêm viền 1 px#2a2420(DEC-2026-11-07-11). - Thẻ MACRO đầu trận: (113, 44, 200, 24)
NS_TOOLTIP"{boss} nhớ: bạn {habit} {pct}%" 2.5 s trong lúc khoá cổng (14§9.3); cài đặt "Hiện số %" TẮT → "{boss} nhớ: bạn {habit} nhiều". - Thanh vào: trượt từ y −20 trong 0.25 s sau thoại mở màn; boss chết: thanh vỡ thành tro 0.4 s đồng bộ hitstop kết.
4.5.2 Nameplate world (NS_NAMEPLATE, canvas WorldUI)
| Đối tượng | Hiện | Nội dung |
|---|---|---|
| Quái S | không bao giờ | — |
| Quái M | khi bị trúng; ẩn sau 2.0 s không trúng | thanh HP 16×2 ui-text trên socket overhead +4 |
Tinh Anh EL_ (phòng thường) | luôn | tên FNT_BW_S ≤ 16 ký tự · HP 32×3 · Thế 32×2 · ≤ 2 glyph Ấn EM 8×8 · tag "◆ {tên thế đáp}" khi có thế đáp bật |
| Tinh Anh săn đuổi MRN14 | luôn | như Tinh Anh + glyph móng vuốt 8×8 |
| Mini-boss / boss | không (dùng BOSSBAR) | — |
| Kẻ mang báu CHASE | luôn | rương 8×8 + thanh thời gian 32×2 |
- Nameplate ở lớp dưới tell (
Prioritize); khi glint Y/vùng P của chính Tinh Anh đó đang chạy, nameplate α 0.35.
4.5.3 Mắt Tro & AshInspect
EYE: 0–3 con ngươi = số thế đáp đang bật ảnh hưởng hero (gồm MICRO ASH) (14§14); loé 0.4 s khi bật/đổi; ngủ → mờ α 0.4; cấp hiệu dụng 0 (60 s đầu run, 3 run đầu đời, Thương Xót "Tro Nhớ 0", CUSTOM 0, HP < 25%) → mắt nhắm.- Giữ View/Tab →
AshInspect(World KHÔNG dừng): panel (93, 60, 240, 120) α 0.70, không che vùng cấm HUD quá 50% chiều cao; nội dung: tiêu đề "Tro đang nhớ" · ≤ 3 trục cờ bật "Gạt 72% · Lướt trái 64%" + lệch baseline "▲+30"/"▼−22" · danh sách thế đáp bật: tên kẻ địch · thói quen · mẹo (hint_key) · 2 khe ◆ của boss có tooltip. Nhả nút → đóng 0.1 s. Relic "Sổ Trắng": trục A01 hiện "—". - Callout đổi thế: "NÓ ĐÃ ĐỌC BẠN: {habit}" 2.5 s ở
CALLOUT+ AshVariantOn (Tro Nhớ đổi thế: khựng 0.6 s + ◆ Mắt Tro, ≥ 1.0 s trước… SFX_SHARED_ash_read; MESO đầu phòng: "TRO DỒN BẦY: {name} · +{pct}% Tro Hồn" 2.5 s + AshMesoShift (callout MESO đầu phòng) + stinger surge SFX_SHARED_ash_meso. Phụ đề âm "[Tro đọc]" luôn kèm khi bật phụ đề.
4.6 Đọc được giữa bầy (150–250 quái)
Thứ bậc (cao → thấp, 31 §1): tell Y/P/N → thân hero + vòng chân + x-ray → FX hero → số sát thương → thân địch → FX địch → hazard trang trí → môi trường. HUD nằm trên tất cả về lớp vẽ nên phải nhường bằng độ mờ:
| Luật | Số |
|---|---|
| H1 Nhường tell/hero | mỗi khối HUD (rect + 8 UI px): nếu giao với vòng chân hero, nguồn glint Y, vùng P, vùng N đang hiện hoặc thân Tinh Anh/boss → α khối → 0.35 trong 0.15 s; hết giao 0.5 s → về α gốc trong 0.25 s. BOSSBAR chỉ xuống 0.60 |
| H2 Độ mờ gốc | Cài đặt "Độ mờ HUD" 50–100% (mặc định 100%) nhân α mọi khối trừ HP, DASH, ULT (sàn 80%) |
| H3 Vùng cấm | không HUD trong (133, 83, 160, 100) (§4.1) |
| H4 Số sát thương | 10 §6.5 nguyên văn: ≤ 260 số, ≤ 24 số mới/tick, gộp cùng mục tiêu + cùng loại 0.10 s, DoT 1 số/1.0 s; thứ tự bỏ (1) phụ trên S → (2) thường trên S → (3) thường trên M+ → (4) chí mạng trên S; không bao giờ bỏ số hero nhận, hồi phục, số trên L/XL, chí mạng trên M+. Chí mạng ngà ×1.5 + "!" (không vàng) |
| H5 Số chạm HUD | điểm sinh số rơi vào rect khối HUD đang hiện (α > 0.35) → dời theo trục y ra ngoài rect + 4; vẫn chạm → bỏ theo H4 (trừ số "không bao giờ bỏ": vẽ ở mép rect) |
| H6 Cài đặt số | "Số sát thương": Đầy đủ (mặc định) · Chỉ chí mạng + boss · Tắt; "Số hero nhận" bật/tắt riêng (mặc định bật) |
| H7 Callout | ≤ 1 trên màn, hàng đợi ≤ 2, cùng ưu tiên thay cái cũ; chữ in hoa FNT_BW_L ≤ 28 ký tự VI; sống 1.2 s (Cộng Hưởng, Tiến Hoá) / 2.5 s (Tro Nhớ) |
| H8 Không chớp HUD | không khối HUD nào nhấp nháy > 3 lần/s (31 R9); HP thấp nhịp 72 BPM (1.2 Hz) |
| H9 Không màu tell | HUD không dùng #ffd84a/#b14cff; ngoại lệ: mũi tên ngoài màn + chỉ hình hướng tell (§9) dùng đúng màu + hình tell vì chúng LÀ tell |
| H10 Test 5 s | ảnh chụp 250 quái B2 và B4, 3 hero (H05, H09, H02) + boss bar + callout: người test chỉ ra hero, HP, Dư Âm, tell Y/P trong 5 s, ≥ 9/10 người (INV-09, DEC-2026-11-07-09) |
4.7 Sự kiện HUD (World)
| Sự kiện | Phản hồi UI | Âm |
|---|---|---|
| Hero trúng đòn | HERO nháy trắng 0.07 s, HP tụt + lag, viền tối màn 40% 0.20 s (10 §6.4), số ui-dmg-taken ×1.3 | HeroDamaged (kèm SFX_{H}_vo_hurt) SFX_SHARED_hero_hurt_impact |
| HP < 25% | HeroLowHp (HP < 25%) → loop tới HP ≥ 30% VFX_UI_hp_lowhp_pulse (72 BPM) + hero_hp < 25% → loop; ≥ 25% → tắt 0.3 s VFX_SHARED_screen_lowhp viền tối 24 px; Giảm chớp → sáng tĩnh 80% | HeroLowHp (HP < 25%) bật loop; tắt khi HP ≥ 30% hoặc chết SFX_SHARED_hero_low_hp |
| Lên cấp trong phòng thường | pip loé + Draft mở (World ×0.15) | LevelUp (trước DraftOpen; nhạc stinger level_up của MusicDirector) SFX_SHARED_level_up |
| Lên cấp khi Cổng/boss/Elite windup | thêm pip "+N cấp chờ" | LevelQueued (pip '+N cấp chờ' trên HUD khi lên cấp giữa giao tranh) SFX_UI_level_queue |
| Cộng Hưởng đạt bậc | callout "CỘNG HƯỞNG: {name}" / "CỘNG HƯỞNG II: {name}" 1.2 s; icon RESONANCE đổi viền | ResonanceCallout tier=I ('CỘNG HƯỞNG: <tên>' 1.2 s) SFX_UI_resonance_1 / ResonanceCallout tier=II ('CỘNG HƯỞNG II: <tên>' 1.2 s) SFX_UI_resonance_2 |
| Nhặt Vàng Mã / cầu máu | số RUN đếm lên; cầu máu: HP tăng + số ui-ok | PickupCollected type=gold (Vàng Mã CUR_PAPER_GOLD) SFX_SHARED_gold_pickup / heal_orb |
| Phòng xong | OBJECTIVE gạch xong, cửa ready → nhắc INTERACT | RoomCleared (+ stinger nhạc room_clear) SFX_SHARED_room_clear |
Nhắc INTERACT | world: glyph 11×11 + nhãn ≤ 14 ký tự trên vật ready khi tâm hero trong r24 (12 §1.1); giữ 0.5 s → vòng UI_C_Hold | — |
| Mũi tên ngoài màn | Tinh Anh/boss ngoài SAFE: mũi tên 7×7 ui-text ở mép SAFE; tell ngoài vùng (11 §4.2, Trợ năng): mũi tên tell ≥ 0.45 s trước va chạm | — |
75. Màn trong run
Mọi màn 0/×0.15 dưới đây: lớp ui-dim phủ World, HUD ẩn trừ HP + RUN (để người chơi biết máu/tiền khi chọn). Rect theo SAFE; "Focus đầu" = phần tử nhận focus khi mở.
5.1 ActIntro (3.5 s, bỏ qua sau 1 s bằng A/Enter — 16 §7.3)
| Phần tử | Rect | Chuyển động |
|---|---|---|
"HỒI II" FNT_BW_XL + tên biome FNT_BW_L | (63, 80, 300, 40) | chữ hiện từng hàng px từ trên xuống 0.3 s (mực thấm) |
| Thẻ Act Mutator (từ Hồi II) | (138, 130, 150, 60): glyph 16×16 + tên + 2 dòng body | lật thẻ 1.5 s (16 §7.2); DAILY: 2 thẻ mutator cạnh nhau |
- Âm: MapOpen (sau phòng xong / nút bản đồ) SFX_UI_map_open khi lật thẻ. Nhạc cue biome vào ở giây 0.
5.2 Map (bản đồ Hồi; mở bằng d-pad lên / M ở bất kỳ lúc nào trong run để XEM — chọn nút chỉ khi ở trạng thái MAP)
| Vùng | Rect | Nội dung |
|---|---|---|
| Tờ bản đồ | (110, 4, 207, 243) NS_MAP_PAPER | lưới 6 hàng × 3 làn: R1 dưới (y = 224), BOS trên (y = 24); khoảng hàng 40, khoảng làn 54, jitter ±3 (giữ tỉ lệ làn/hàng của 16 §2.1 ≈ 4:3) |
| Nút | icon 16×16 tâm tại toạ độ lưới | 11 pictogram loại nút; BOS/MBS icon 24×24 (×1.5, MapNodeChosen + trạng thái nút: khả dụng (thở) / đã đi (mực đặc) / kh… VFX_UI_map_node_pick); ELT_RISK viền 1 px ui-risk + 2 lưỡi chéo; EVT = "?" (UP_DOCK_1 → icon loại sự kiện); MRN14 thêm móng vuốt 8×8 |
| Icon thưởng | 8×8 dưới-phải nút | EDGE+ · GOLD · SKILL · HEAL · META; RSC lần đầu Hồi II: icon mở hero; CHL: "×2" FNT_BW_S |
| Đường | MapOpen (đường R1→R6 hiện) + MapNodeChosen (đường đã chọn đậm lên) VFX_UI_map_path_ink | mực nét gạch (không chấm tròn — dành vùng N); đã đi = mực đậm; có thể đi = mực nhạt nhấp 1 Hz; không với tới = mờ α 0.35 |
| Vị trí hiện tại | chân dung por_<code>_hud thu 16×16 vẽ riêng | trên nút vừa xong |
| Trái | (4, 24, 102, 200) | "Hồi II · Đầm Vải Liệm" · thẻ Act Mutator (glyph + tên + 3 dòng) · "Độ Tang N" + ≤ 15 glyph MRN 8×8 · HP, bình, Vàng Mã, Relic n/3 |
| Phải | (321, 24, 102, 200) | nút đang focus: tên loại FNT_BW_M · mô tả 3 dòng body · thưởng · thời lượng ước tính "~60 s" (16 §3.1) · cảnh báo "Thử Lửa: {mutator}" / "Tinh Anh có thế đáp" |
| Nhắc nút | y 251 | A Chọn · X Đổi làn (UP_DOCK_2, R4, 1 lần/run) · B Đóng (khi xem) · Menu Tạm dừng |
- Focus đầu: nút có thể đi bên trái nhất của hàng kế. D-pad trái/phải: giữa các nút có thể đi của hàng kế; lên/xuống: xem các hàng khác (focus "xem", xác nhận bị khoá → UiError (hành động không được phép: thiếu tiền, khoá, ô đầy) SFX_UI_nav_error). Chuột: bấm nút có thể đi.
- Chọn nút: mực chấm vào nút 0.25 s (MapNodeChosen (chọn nút CMB/ELT/CHL/EVT/SHP/RST/SEC/RSC/MBS/BOS/DOCK) SFX_UI_map_node) → mờ 0.25 s → tải phòng. Mở map: MapOpen (sau phòng xong / nút bản đồ) SFX_UI_map_open, cuộn giấy trải từ dưới 0.3 s.
- 3 Hồi đầu tiên đời: tooltip 1 lần trên nút
ELT"Cổng: phải qua 1 Cổng mỗi Hồi" (§10).
5.3 Draft (lên cấp / EDGE+; luật 13 §2–§4)
| Vùng | Rect | Nội dung |
|---|---|---|
| Tiêu đề | (63, 6, 300, 17) | "LÊN CẤP {n}" hoặc "PHẦN THƯỞNG" FNT_BW_L; draft boss: "THƯỞNG BOSS" |
| Đồng hồ tự chọn | (183, 24, 60, 2) | chỉ draft phòng thường (World ×0.15): thanh 6.0 s lùi; mọi input điều hướng đặt lại 6.0 s; tạm dừng dừng đồng hồ |
| 3 thẻ | x = 14 / 150 / 286, y = 30, mỗi thẻ 128×176 | §5.3.1; 4 thẻ (LV04): x = 4 / 110 / 216 / 322, thẻ 101×176, mọi hộp trong thẻ rộng 89, hiệu ứng 89 × 74 (6 dòng ở 125%) |
| Lượt | (14, 212, 400, 12) | "Đổi {n} · Xoá {n} · Giữ {n}" + glyph; hết lượt → ui-text-off |
| Nhắc nút | y 251 | A Chọn · Y Đổi · X giữ Xoá · LB Giữ · B giữ Bỏ qua (+15 Vàng Mã) · KB: Enter/R/Del/G/Backspace giữ (13 §4.2) |
- Focus đầu: thẻ ô 1 (ô bảo đảm tag, = thẻ tự chọn). Trái/phải giữa thẻ, không vòng. Chuột: rê = focus, LMB chọn, RMB = Xoá (giữ 0.5 s).
- Khoá xác nhận 0.30 s đầu (§3.1). Hero bất tử suốt màn + 0.5 s sau chọn (World ×0.15) — màn không hiện gì thêm.
- Xoá Edge là nửa công thức Tiến Hoá → popup
UI_C_Confirm"Khoá Tiến Hoá: {name}" (ui-warn), focus mặc định Huỷ (13§4.2). - Hàng đợi nhiều draft: mở liên tiếp, giữa 2 draft 0.2 s, tiêu đề "LÊN CẤP {n} · còn {count}".
5.3.1 Thẻ (UI_Card, 128×176; nội dung sinh từ mẫu câu params)
| Phần | Rect trong thẻ | Luật |
|---|---|---|
| Khung | NS_CARD_<R> | rarity; Then Chốt = LEGENDARY động Thẻ LEGENDARY/Then Chốt hoặc Tiến Hoá đang hiện trong draft (loop tới… VFX_UI_card_frame_legend (≤ 1/draft); Lời Nguyền Thẻ/Relic Lời Nguyền RL049–RL060 hiện hoặc được chọn VFX_UI_card_cursed |
| Chấm rarity | (4, 4) | 1/2/3 chấm · ✶ · "—" (§1.6) |
| Tên | (8, 8, 112, 24) | name ≤ 2 dòng, căn giữa |
| Icon | (48, 34, 32, 32) | icon ghép / vẽ tay |
| Tag | (8, 70, 112, 10) | ≤ 2 chip: glyph tag 8×8 + tên caption |
| Hiệu ứng | (8, 82, 112, 62) | body ≤ 96 ký tự VI, ≤ 2 mệnh đề, số thật theo chỉ số hiện tại (13 §2.3, §5.9); Relic Lời Nguyền: dòng 2 bắt đầu "—" #d8cfc0 |
| Chân | (8, 148, 112, 20) | trái "Cộng Hưởng {count}/3" (sau bậc I: "/5"); phải "Hạng I → II" nếu là thẻ nâng hạng |
| Góc đồng Tiến Hoá | (112, 4, 12, 12) | khi thuộc công thức đã lộ (13 §9.3); tooltip View/Tab "Tiến Hoá: {name}" |
| Ghim Giữ | (58, 0, 12, 8) | thẻ Giữ từ draft trước (ô cuối) |
| Nhãn "mới" | (96, 160, 24, 9) | mục pool vừa mở ở Chợ Đò, lần gặp đầu (18 §6.5) |
- Focus: thẻ nâng 2 px + con trỏ focus; thẻ khác α 0.85. DraftOpen: 3 thẻ rút ra lệch 0.06 s (cả màn chọn Relic/Edge hero đầu … VFX_UI_card_reveal (thẻ 2 trễ 0.06 s, thẻ 3 trễ 0.12 s, trượt lên 24 px 0.18 s) + DraftOpen (sau LevelUp; 3 thẻ rút ra lệch 60 ms; snapshot SN_DRAFT) SFX_UI_draft_open; rê UiCardHover (focus/rê sang thẻ trong draft, shop, chọn Relic) SFX_UI_card_hover; chọn DraftPick (thẻ được chọn; các thẻ khác rơi xuống α → 0) VFX_UI_card_pick_burst + DraftPick rarity=COMMON|RARE|EPIC (biến thể 01 COMMON, 02 RARE, 03 EP… SFX_UI_card_pick (Then Chốt/LEGENDARY DraftPick rarity=LEGENDARY (Then Chốt) hoặc chọn thẻ Tiến Hoá SFX_UI_card_pick_legend, Lời Nguyền DraftPick/hiện thẻ Relic Lời Nguyền RL049–RL060 SFX_UI_card_cursed), 2 thẻ còn lại rơi xuống 0.12 s; Đổi/Xoá/Giữ DraftReroll (Đổi, biến thể 01) · DraftBanish (Xoá, 02) · DraftHold (G… SFX_UI_card_edit (3 biến thể).
- Thẻ kỹ năng trong draft: khung
SKILL, chân phải "Học mới" / "Đổi" / "Hạng I → II".
5.4 SkillPick · LinchpinPick · Tiến Hoá
| Màn | Bố cục | Luật |
|---|---|---|
SkillPick | 3 thẻ SKILL như §5.3 (tiêu đề "KỸ NĂNG"); ≥ 1 thẻ Nâng hạng nếu hợp lệ | chọn "Đổi" → màn phụ: 3 ô hiện tại 28×28 + tên (x 120 / 200 / 280, y 100) + "Huỷ"; chọn ô bị thay → kỹ năng mới hạng I (13 §6.3); SkillLearned / SkillSwapped / SkillRankUp (draft SKILL, hub chọn 2 kỹ… SFX_UI_skill_learn |
LinchpinPick | 2 thẻ LEGENDARY x = 80 / 219, tiêu đề "THEN CHỐT" | chỉ sau draft boss BS_B2 khi Lv ≥ 11 (DEC-2026-11-07-14; 13 §5.6); không Đổi/Xoá/Giữ/Bỏ qua; B không đóng — phải chọn 1 (13 §5.6 không có lựa bỏ) |
| Tiến Hoá (trình diễn, không màn) | sau khi Draft đóng: World ×0, 0.8 s (EVO1–3) / 1.5 s (EVO4): 2 icon nguồn bay từ vị trí thẻ vào giữa thành icon đồng 32×32 + callout "TIẾN HOÁ: {name}" / "THỨC TỈNH VŨ KHÍ" | EvolutionFuse (draft đóng → World ×0 0.8 s EVO1–3 / 1.5 s EVO4) VFX_UI_evo_fuse + EvolutionFuse (draft đóng → World ×0 0.8 s EVO1–3 / 1.5 s EVO4; 2 ico… SFX_UI_evo_fuse; hero bất tử + 0.5 s (13 §9.4) |
5.5 Reward · Rest · Secret · Event · Shop · Dock · BossGate
| Màn | Bố cục (rect SAFE) | Phần tử & trạng thái | Focus đầu · nút | Âm / FX |
|---|---|---|---|---|
Reward | panel (93, 30, 240, 190) NS_PANEL; tiêu đề "PHÒNG SẠCH" | dòng thưởng chung: "+8% HP" · Tro Hồn · Vàng Mã (đếm lên 0.4 s); thưởng icon: GOLD số · HEAL thanh HP tăng · META "+60 Tro Hồn · 1 trang Sổ Tang"; EDGE+/SKILL → mở Draft/SkillPick sau 0.4 s; Relic (ELT 1/2, ELT_RISK/MUT05 1/3, MBS 1/2 + Mảnh Vọng): thẻ Relic 128×176 dàn ngang | thẻ 1 · A Nhận · B (không đóng khi còn lựa) | RewardPanelOpen (Relic chọn 1/2 hoặc 1/3, Lễ Vật, bảng tiền cuối run) VFX_UI_reward_reveal, RewardPanelOpen (thưởng phòng: chọn Relic 1/2 hoặc 1/3 ELT_RISK, thẻ … SFX_UI_reward_reveal; Relic RelicChestOpen (rương Relic/thưởng phòng mở) SFX_SHARED_relic_chest |
Reward — Relic đầy | 2 lựa dưới thẻ: "Đổi lấy Relic đang có" · "Phân rã" | Đổi → danh sách Relic đang có (Lời Nguyền xám, không chọn được); Phân rã → 2 nút "+80 Vàng Mã" / "+1 hạng Edge" (→ danh sách Edge chưa max) (13 §10.1) | "Đổi" · B lùi 1 bước | DraftReroll (Đổi, biến thể 01) · DraftBanish (Xoá, 02) · DraftHold (G… SFX_UI_card_edit |
Rest | 3 thẻ lựa 128×120 (x 14 / 150 / 286, y 50) | "Hồi 40% HP" (xem trước HP sau hồi) · "Nâng hạng 1 kỹ năng" (→ chọn ô) · "Gỡ 1 Relic Lời Nguyền" (chỉ hiện khi có) | thẻ 1 · A | UiConfirm (A / Enter / click trái) SFX_UI_nav_confirm; hồi: hero_heal t = 0 VFX_SHARED_heal_pulse |
Secret | chữ Mộ Lạc 2 dòng (63, 20, 300, 24) + 2 thẻ Lời Nguyền x 80 / 219 + Relic sẽ mất (icon 32 + tên, viền ui-warn) | chưa có Relic: dòng "+80 Vàng Mã" | thẻ 1 · A · không B khi đã vào (phải chọn) | DraftPick/hiện thẻ Relic Lời Nguyền RL049–RL060 SFX_UI_card_cursed |
Event | tranh 160×90 (8, 20) · chữ sự kiện (176, 20, 243, 90) body ≤ 420 ký tự · 2–3 nút lựa (176, 120 + 20k, 243, 16) | mỗi lựa: chữ ≤ 48 ký tự + dòng hệ quả caption ("−60 Vàng Mã · +1 Relic"); không đủ điều kiện → ui-text-off + lý do | lựa 1 · A | UiPopupOpen / UiPopupClose (biến thể 01 open, 02 close) SFX_UI_popup; kết quả → Reward |
Shop (SHP 6 ô / DOCK 4–5 ô) | lưới 3 × 2 ô 128×76 (x 14 / 150 / 286, y 30 / 110); dịch vụ (14, 192, 400, 16): "Mua Đổi 40" · "Mua Xoá 60" · "Phân rã Relic"; dòng Bà Mott 1 câu (14, 14, 400, 12) | ô: icon 32 + tên + giá ui-cur-gold; thiếu tiền → giá ui-warn, A → rung ±2 px + UiError (hành động không được phép: thiếu tiền, khoá, ô đầy) SFX_UI_nav_error; đã mua → dấu "ĐÃ BÁN"; Relic đầy → ô Relic đổi Edge (canon ẩn Relic); lượt mua dịch vụ ≤ 2/loại/lần ghé hiện "{count}/2" | ô 1 · A Mua · View chi tiết · B Rời | ShopPurchase (Sạp Rong mua bằng Vàng Mã) VFX_UI_shop_buy, ShopPurchase (Sạp Rong SHP/DOCK, mua bằng Vàng Mã; Chợ Đò mở pool dùn… SFX_UI_shop_buy |
Dock | tiêu đề "BẾN GIỮA HỒI" + 4 nút dọc (163, 70, 100, 16 + 20k): "Sạp Rong" · "Đổi thẻ miễn phí (1)" (dùng trong Sạp) · "Nói với Calla" (beat, khi có) · "Sang Hồi {act}" | hồi 25% HP tự áp khi vào (số ui-ok bay lên HP); không đồng hồ trên màn (ngân sách ≤ 20 s là mục tiêu thiết kế, không ép) | "Sạp Rong" · B = không (phải "Sang Hồi") | DOCK · Bến Giữa Hồi (nút DOCK sau boss Hồi I–IV, ≤ 20 s, Sạp Rong + chở đò Calla sang Hồi… MUS_dock_crossing; DepartConfirmed ở ST_DOCK (t=0 cảnh 6 s) SFX_HUB_dock_depart khi rời |
BossGate | tên boss FNT_BW_XL (13, 60, 400, 22) + danh hiệu FNT_BW_M; icon boss 64×64 (181, 100); thẻ MACRO (113, 170, 200, 24); gợi ý phản chế (UP_TEST_BELL_3) (113, 198, 200, 24); nút "Uống bình" (khi có bình, HP < 100%) | 4 s rồi tự vào trận; bỏ qua sau 1 s (A); dùng bình không tốn thời gian (16 §7.1) | "Vào trận" · X Uống bình | UiPopupOpen / UiPopupClose (biến thể 01 open, 02 close) SFX_UI_popup; stinger boss_intro |
5.6 Pause (Menu / Esc; World + Hero dừng; nhạc snapshot pause; UiPause open/close (snapshot SN_DRAFT; World + Hero dừng) VFX_UI_pause_dim, UiPause open/close (Start / Esc; snapshot SN_DRAFT; UI ignoreListener… SFX_UI_pause)
| Vùng | Rect | Nội dung |
|---|---|---|
| Cột lệnh | (14, 30, 100, 200) | Tiếp tục · Build · Chỉ số · Relic · Bản đồ · Cài đặt · Báo lỗi · Thoát về tiêu đề · Bỏ run (9 nút, cách 20, nút 16 → y 30…190) |
| Nội dung | (122, 30, 291, 215) NS_PANEL | theo lệnh đang focus (xem trước ngay khi focus, không cần A) |
| Đầu | (14, 8, 400, 17) | "TẠM DỪNG" · hero · mode · Hồi/hàng · đồng hồ run (đã dừng) · seed (CUSTOM/DAILY) |
| Lệnh | Nội dung panel | |
| --- | --- | |
| Build | lưới Edge 32×32 (8 cột) có vạch hạng; 3 ô kỹ năng + hạng; Ult + Dạng Rèn; tiến độ 6 Cộng Hưởng hero + Cộng Hưởng chung "n/3 · n/5"; công thức Tiến Hoá đã lộ (2 icon + điều kiện); Then Chốt; View = chi tiết thẻ focus | |
| Chỉ số | bảng chỉ số hiệu dụng (10 §2.1): sát thương, tốc đánh, chí mạng, cửa sổ ĐÁP, nạp Lướt, Dư Âm/s, hồi phục ×; icon "đã giảm dần" / "chạm trần" (13 §15.1) | |
| Relic | n/3 (GD3: /4) Relic + 2 affix mỗi cái; UP_FORGE_2: lệnh "Cuộn lại 1 affix" (1 lần/run) → chọn affix → UI_C_Confirm → kết quả (13 §11.1) | |
| Bản đồ | Map chế độ xem | |
| Cài đặt | Settings đủ 7 tab; bật bất kỳ mục Thương Xót giữa run → UI_C_Confirm "Run này không tính bảng xếp hạng và thành tựu Độ Tang" (Bible §4.3), cờ giữ tới hết run kể cả khi tắt lại | |
| Báo lỗi | mô tả 1 dòng "Gửi log để đội sửa lỗi" + A → BugReport (§6.13); có ở bản phát hành và qa/rc (43 §15.3) | |
| Thoát về tiêu đề | UI_C_Confirm "Tiến độ trong phòng này sẽ mất; run giữ ở điểm lưu cuối" (16 §11) | |
| Bỏ run | UI_C_Hold 1.0 s; chữ "Tính như chết: giữ tiền meta, mất Vàng Mã" (+ DAILY: "Nộp điểm hiện tại, dùng hết lượt") (16 §8.2) |
- Focus đầu: Tiếp tục. B/Menu = Tiếp tục. Mở/đóng: panel trượt 8 px + mờ 0.12 s.
5.7 Chết, hồi sinh, thắng, tổng kết, kết
| Màn | Bố cục | Luật & chuyển động | Âm |
|---|---|---|---|
Revive | không panel; callout "LỬA GỬI" + icon REVIVE bay từ HUD vào hero 0.4 s | 1.0 s bất tử (10 §8.3); icon REVIVE tắt | HeroRevive (Lửa Gửi hồi sinh + sóng đẩy r120) SFX_SHARED_revive_ember |
DeathRecap | thẻ recap (63, 14, 300, 128): tiêu đề "TÀN TRO" FNT_BW_L + 5 dòng "{name} · {glyph Y/P/N} · −{value} · {seconds} s trước" + dòng kết liễu đậm; ◆ cạnh đòn của thế đáp · "Tro đã học" (63, 146, 300, 56): top 3 trục + 1 mẹo/trục · bia mộ (163, 206, 100, 40) EpitaphShown (bia mộ TMB_Hxx cuối recap chết) VFX_UI_epitaph_stamp (tên hero + nguyên nhân + Hồi) | World ×0.3 trong 0.5 s → ui-dim → mỗi dòng hiện cách 0.25 s; A lần 1 = hiện hết, lần 2 = RunSummary; glyph Y/P/N dùng hình + màu tell (ngoại lệ H9) | DeathRecapLine / dòng 'Tro đã học' (INV-16), 1 lần/dòng, cách ≥ 0.25 s SFX_UI_recap_line mỗi dòng, EpitaphShown (bia mộ đóng dấu cuối recap, TMB_Hxx) SFX_UI_epitaph; DEATH · hết Lửa Gửi trong run (mọi biome, mọi mode) · bắt đầu đồng bộ thẻ recap INV-16 = … MUS_death_epitaph |
BossVictory | tiêu đề "{boss} ĐÃ NGÂN" (63, 30, 300, 17); dòng thưởng Tro Hồn / Mảnh Vọng / XP (113, 60, 200, 60); nút "Khắc Sẹo" (sau END_BELL_TOLL, chỉ BS_B1–BS_B4, ≤ 2/boss) + "Tiếp" | Khắc Sẹo → UI_C_Confirm: thế đáp sẽ bật + "+20% Tro Hồn từ boss này" (14 §9.4) | CurrencyChanged delta>0 (cuối run, nhặt Mảnh Vọng, đổi ở Chuông Thử) VFX_UI_currency_fly, CurrencyChanged delta>0 curId ∈ {CUR_SOUL_ASH 01, CUR_ECHO_SHARD 02, … SFX_UI_currency_gain |
RunSummary | 3 tab LB/RB (14, 8, 400, 14): Kết quả · Build · Thưởng (16 §9.1) ; nội dung (14, 26, 400, 220) | bỏ qua sau 2 s; "Thức Lại" Y/R (ẩn run 1–2, 18 §12) · "Về Tháp" A/Space; Thưởng: tiền bay vào ô tổng, thanh MR chạy (lên MR → UnlockGranted (hero/Dạng Rèn/ult/mode/trang codex) và MasteryRankUp VFX_UI_unlock_seal + MasteryRankUp (lên MR01–MR20 / xong TT1–TT5) SFX_UI_mastery_rank), tiến độ mở khoá ≤ 3 dòng; DAILY/ENDLESS/BOSS_RUSH: điểm đếm ScoreCount (DAILY/ENDLESS/BOSS_RUSH, bảng điểm cuối) VFX_UI_score_count (A nhảy tới kết quả) + hạng tạm | UiTabSwitch (LB/RB, Q/E, click tab) SFX_UI_tab_switch, ScoreCount (đếm điểm DAILY/ENDLESS/BOSS_RUSH; pitch +1 bán cung mỗi 1… SFX_UI_score_tick |
FinalChoice | 2 nút lớn 160×24 (40, 120) "Gióng chuông" · (227, 120) "Giữ lõi" + chữ Dravos 2 dòng | chỉ khi Lựa chọn Giữ lõi hiện ở trận BS_FINAL (END_ASH_CROWN). FLAG_DRAVOS_PAGE_READ; không đồng hồ; focus đầu "Gióng chuông"; xác nhận = UI_C_Hold 1.0 s (quyết định kết) | UiHoldStart → loop cháy dần (1.0 s mặc định) → UiHoldComplete 'phụt';… SFX_UI_hold_confirm |
Ending | toàn màn cảnh; END_QUIET_SHORE: 12 thẻ kết theo hero (thẻ hero đang chơi hiện đầu) | không tương tác; bỏ qua: giữ A 1.0 s, chỉ từ lần xem thứ 2 (16 §7.3) | ENDING · END_BELL_TOLL Hồi Chuông (Gióng chuông sau BS_FINAL) · phần tuyến tính 180 s = f… MUS_end_bell_toll / ENDING · END_QUIET_SHORE Bến Bình Yên (hạ BS_TRUE ở B6) · 210 s tuyến tính đi cùng 12 thẻ… MUS_end_quiet_shore / ENDING · END_ASH_CROWN Mũ Tro (chọn "Giữ lõi" ở BS_FINAL) · 120 s tuyến tính: hero đội Mũ… MUS_end_ash_crown |
Credits | cột chữ giữa 300 rộng (63, 0 → cuộn), tiêu đề mục FNT_BW_L ui-text, dòng FNT_BW_S ui-text-2; nội dung từ credits.json (§5.7.1) | A giữ = ×4; B thoát (lần đầu sau END_BELL_TOLL: giữ B 1.0 s) | credit loop của ENDING · END_BELL_TOLL Hồi Chuông (Gióng chuông sau BS_FINAL) · phần tuyến tính 180 s = f… MUS_end_bell_toll |
RushBuild | 4 vòng: 6 thẻ thu gọn 128×84 (2 hàng × 3) chọn đủ 3 (bật/tắt) rồi "Xác nhận"; sau đó 3 Relic chọn 1 | đếm "Đã chọn {count}/3"; tổng 12 Edge + 1 Relic (16 §10.4) | DraftPick rarity=COMMON|RARE|EPIC (biến thể 01 COMMON, 02 RARE, 03 EP… SFX_UI_card_pick |
5.7.1 Nguồn nội dung Credits (Assets/_Project/Data/credits.json, sinh lúc build)
| Khoá | Luật |
|---|---|
| Định dạng | { "sections": [ { "title_key": "<khoá loc>", "lines": ["<chuỗi>", …] } ] }; title_key = khoá loc (credits.team, credits.audio_ccby, credits.fonts, credits.oss, credits.thanks); lines không dịch (tên người, tên tệp, giấy phép giữ nguyên văn) |
| Thứ tự mục | 1 Đội ngũ · 2 Âm thanh (CC BY) · 3 Phông chữ · 4 Thư viện mã nguồn mở · 5 Cảm ơn |
| 1 Đội ngũ | nhập tay: Assets/_Project/Data/credits_team.json (vai · tên) |
| 2 Âm thanh (CC BY) | gộp Assets/_Project/Audio/sfx-credits.json (32 §11, tạo bởi make_credits của bf-sfx): mọi dòng CC BY chép nguyên văn ("tên âm" by tác giả, giấy phép, link); CC0 không bắt buộc, liệt kê gộp 1 dòng "Âm CC0 từ Freesound" |
| 3 Phông chữ | thư mục licenses/: font pixel Latin + tiếng Việt (OFL) và font pixel CJK (50 §12, Bible §10.3): tên font · tác giả · "SIL Open Font License 1.1"; toàn văn OFL nằm ở licenses/ đi kèm build |
| 4 Thư viện mã nguồn mở | thư mục licenses/: wrapper C# Steamworks (50 §10) + mọi gói UPM bên thứ ba có giấy phép yêu cầu ghi công: tên · giấy phép · dòng bản quyền nguyên văn |
| 5 Cảm ơn | nhập tay: người chơi thử, nhóm cộng đồng (credits_team.json mục thanks) |
| Kiểm CI | bước build credits_check: mỗi id SFX trong audio_sfx.csv (32 §4.2) có nguồn Freesound CC BY (mục tương ứng trong sfx-credits.json, 32 §11) phải có đúng 1 dòng trong mục 2; mỗi tệp trong licenses/ phải có ≥ 1 dòng ở mục 3 hoặc 4; thiếu → build FAIL (= AT-08 32 §14) |
86. Màn ngoài run
6.1 Khởi động & tiêu đề
| Màn | Bố cục | Phần tử · luật | Focus đầu | Âm |
|---|---|---|---|---|
PhotoWarning | toàn màn ui-void; chữ giữa (63, 90, 300, 40) FNT_BW_M song ngữ VI/EN "Trò chơi có chớp sáng và chuyển động nhanh. Có thể giảm ở Trợ năng." · nút "Mở Trợ năng ngay" (163, 150, 100, 16) · glyph A "Tiếp" ở UI_C_PromptBar | hiện 4 s rồi tự sang Language; A/Enter bỏ qua chỉ sau 1.5 s (trước đó A bị nuốt, không âm lỗi); "Mở Trợ năng ngay" → Settings tab Trợ năng (chỉ nhóm §4 nhạy sáng + Giảm chuyển động hiện đầu), B → quay lại luồng ở Language; chỉ lần chạy đầu (42 §1.2 bước 1); không chớp, không tween ngoài mờ vào 0.25 s | "Mở Trợ năng ngay" | UiConfirm (A / Enter / click trái) SFX_UI_nav_confirm khi A |
Language | danh sách giữa (143, 40, 140, 200), mỗi dòng 18 | tên ngôn ngữ viết bằng chính chữ của nó; chỉ hiện ngôn ngữ đã ship (43 §12.1); Deck/HĐH gợi ý ngôn ngữ hệ thống lên đầu | ngôn ngữ hệ thống | UiConfirm (A / Enter / click trái) SFX_UI_nav_confirm |
Consent | panel NS_PANEL (63, 40, 300, 180): tiêu đề (71, 46, 284, 14) FNT_BW_L "Dữ liệu chơi" · khối 1 (71, 64, 284, 60) · khối 2 (71, 128, 284, 60) · link "Chính sách quyền riêng tư" (71, 192, 140, 12) · nút "Tiếp" (283, 200, 72, 16) | Khối 1 telemetry: câu "Gửi dữ liệu chơi ẩn danh để cân bằng game" (≤ 160 ký tự mô tả) + 2 nút "Đồng ý" (79, 104, 100, 16) · "Không" (191, 104, 100, 16) cùng cỡ, cùng NS_BUTTON, cùng màu, không nút nào được chọn sẵn; chọn → nút đó vẽ trạng thái pressed + dấu ✓ 7×7. Khối 2 báo crash: "Báo lỗi khi game bị crash" + bộ chọn 3 nấc (d-pad trái/phải) "Luôn gửi · Hỏi mỗi lần · Không bao giờ", mặc định Hỏi mỗi lần. Link → overlay Steam tới trang chính sách (overlay tắt → trình duyệt, 43 §10) · "Tiếp" (A) khoá (NS_BUTTON disabled, ui-text-off, A → UiError (hành động không được phép: thiếu tiền, khoá, ô đầy) SFX_UI_nav_error) cho tới khi khối 1 đã chọn; B không bỏ qua màn; không có "Bỏ qua" (43 §15.1, 60 PV01). Đổi lại ở Cài đặt › Dữ liệu & quyền riêng tư | tiêu đề panel (đọc màn hình đọc cả đoạn; d-pad xuống → "Đồng ý"/"Không" không chọn sẵn) | UiConfirm (A / Enter / click trái) SFX_UI_nav_confirm khi chọn; UiError (hành động không được phép: thiếu tiền, khoá, ô đầy) SFX_UI_nav_error khi "Tiếp" còn khoá |
QuickSetup | tiêu đề "Thiết lập nhanh" (14, 8, 400, 17) · danh sách 6 dòng (14, 30, 250, 120), dòng 20 · xem trước (270, 30, 143, 120): câu mẫu / ảnh tell trước-sau 128×72 · nút "Xong" (163, 220, 100, 16) | 6 dòng theo 42 §1.2 bước 3, mỗi dòng trái/phải đổi giá trị, áp ngay: 1 Cỡ chữ 100/125/150% (a11y.text_scale; xem trước "Ừ, đã hiểu rõ: ổn định, vững vàng.") · 2 Tell mù màu tắt/bật (a11y.tell_shapes; ảnh trước/sau) · 3 Phụ đề tell tắt/bật (a11y.tell_subs) · 4 Rung màn 100/50/0% (cam.shake) · 5 Giảm chớp tắt/bật (a11y.flash_reduce) · 6 Preset điều khiển (input.preset: Mặc định / Không chuột / 1 tay trái / 1 tay phải / Bàn phím 1 tay, 41 §8.2); mặc định = giá trị PC/Deck của 42; mọi dòng bỏ qua được; "Xong"/B/Menu → Title | dòng 1 Cỡ chữ | UiSliderStep (mỗi bước thanh trượt; pitch = −6..+6 bán cung theo giá … SFX_UI_slider_tick khi đổi; UiConfirm (A / Enter / click trái) SFX_UI_nav_confirm "Xong" |
Title | logo pixel (63, 24, 300, 90) · menu dọc (163, 118, 100, 16 + 20k), ≤ 6 nút (tới y 234) · phiên bản FNT_BW_S (343, 255) | bản chính: Tiếp tục run (chỉ khi có run_active.json) · Chơi · Lộ trình EA (chỉ bản EA → EaProgress) · Cài đặt · Credits · Thoát (UI_C_Confirm) · bản demo: Tiếp tục run · Chơi · Wishlist (ActivateGameOverlayToStore tới app chính; overlay tắt → trình duyệt, 43 §3.2) · Góp ý (form web, URL trong config) · Cài đặt · Thoát (Credits xem ở Cài đặt › Dữ liệu & quyền riêng tư); nền: tháp chuông gãy động, tro rơi | Tiếp tục run, không thì Chơi | TITLE · màn tiêu đề + menu chính (Cài đặt/Credits mở từ đây giữ nguyên cue dưới SN_DRAFT)… MUS_title_mute_night phát từ mẫu 0 khi logo hiện xong |
ChoosePath | tiêu đề "Chọn cách đi" FNT_BW_XL (13, 14, 400, 22) · 3 thẻ preset 128×150 tại x 14 / 150 / 286, y 44 (NS_CARD_SKILL) · dòng chú thích (14, 202, 400, 24) body · nút "Bắt đầu" (163, 230, 100, 16) | thẻ trái→phải: Kể Chuyện · Đồng Hành · Hành Trình (mặc định); mỗi thẻ: tên FNT_BW_L + 4 dòng giá trị (19 §6.2, 42 §9: Sát thương nhận · ĐÁP · Tự ngắm · Phòng Thủ Tự Động) + dòng Verb giữ Giữ/Bật (Y đổi; chỉ Kể Chuyện/Đồng Hành) + nhãn "Không tính bảng xếp hạng" ui-text-2 trên Kể Chuyện/Đồng Hành; chú thích: "Đổi lại ở Cài đặt › Thương Xót bất cứ lúc nào. Không khoá truyện, hero, kết."; A trên thẻ = chọn (+ dấu ✓), "Bắt đầu" → Loading → hub Lửa Canh ST_HEARTH; B = giữ Hành Trình; chỉ hiện 1 lần (Hub chỉ hiện ST_HEARTH + ST_DOCK; bật hàng đợi onboarding run 1. FLAG_FIRST_WAKE, 19 §5.6) | thẻ Hành Trình | UiCardHover (focus/rê sang thẻ trong draft, shop, chọn Relic) SFX_UI_card_hover khi focus thẻ, DraftPick rarity=COMMON|RARE|EPIC (biến thể 01 COMMON, 02 RARE, 03 EP… SFX_UI_card_pick khi chọn |
- "Chơi" khi có run dở →
UI_C_Confirm"Tiếp tục run · Bỏ run" (Bỏ =UI_C_Hold1.0 s,16§11). Lệchcontent_versionkhông migration → chỉ còn "Bỏ run".
6.2 Hub (HubHud, HubTravel, Dialogue)
| Phần tử | Rect / vị trí | Luật |
|---|---|---|
| Dải tiền meta | (283, 4, 140, 12) | Tro Hồn · Mảnh Vọng · Nến Canh (icon 8×8 + số); Nến Canh ẩn tới khi có ≥ 1 |
| Nhắc trạm (world) | trên prop trạm, khi tâm hero trong r24 | glyph INTERACT (B / G) + tên trạm ≤ 14 ký tự; hub: Đánh (X / LMB) cũng tương tác (Bible §1.1, DEC-2026-11-07-06) |
| Dấu beat | "!" 5×9 ui-text trên NPC có beat chờ / trạm có mục mới (trang Sổ Tang chưa đọc, mở khoá mới) | tắt khi đã xem |
| Gợi ý dịch chuyển | (4, 255, 120, 9) | "{glyph MAP} Dịch chuyển" — chỉ khi ≥ 4 trạm mở (18 §12 bước 2b) |
HubTravel | danh sách trạm đã mở (14, 30, 140, 200) + bản đồ hub thu nhỏ 960×544 → 240×136 (170, 60) | chọn → mờ 0.25 s → đứng trước trạm (18 §1.1); FastTravel t=0 (rời chỗ cũ) SFX_HUB_fast_travel; nút = MAP (d-pad lên / M) |
Dialogue | hộp (120, 205, 299, 56) NS_DIALOGUE; thẻ tên (124, 197, 100, 12); chân dung _bust 128×128 tại (−8, 131) (tràn trái, cắt bởi SAFE) | chữ dialogue hiện 40 ký tự/s + BarkShown (mỗi 3 ký tự 1 blip; 8 bộ: 7 NPC + hero; giọng NPC lấy SFX_… SFX_UI_bark_blip mỗi 3 ký tự (bộ theo NPC); A = hiện hết dòng / dòng kế; giữ B 0.5 s = bỏ qua beat (hệ thống vẫn mở, 18 §12); lựa chọn (≤ 3) là nút trên hộp, cách 20 |
- Mở menu trạm: hero dừng, camera giữ; panel trượt từ phải 0.15 s; UiPopupOpen / UiPopupClose (biến thể 01 open, 02 close) SFX_UI_popup. Đóng: B → về hub ở đúng vị trí.
- Menu / Esc ở hub (không màn nào mở) →
HubPause(§6.13): đường duy nhất từ hub vềTitlehoặc thoát game.
6.3 Settings (7 tab; mọi thay đổi áp ngay, "Mặc định" theo tab: UI_C_Confirm)
42 sở hữu mọi option, khoá, giá trị và mặc định; bảng dưới chỉ xếp chỗ: mỗi ô = khoá tên · giá trị · mặc định PC / Deck (1 giá trị = cả hai), đúng thứ tự 42. Lệch 42 → 42 thắng, sửa bảng này.
| Tab | Mục |
|---|---|
Trò chơi (42 §8) | Ngôn ngữ · ngôn ngữ đã ship (43 §12.1) · ngôn ngữ hệ thống · game.hints Gợi ý nút · tắt/bật · bật · game.glossary_auto Tự chú giải từ khoá lần đầu · tắt/bật · bật · game.draft_timer Đồng hồ tự chọn draft · 6 s / 12 s / Tắt · 6 s · game.objective_reminder Nhắc mục tiêu phòng · tắt/bật · bật · game.ash_pct Hiện số % Tro Nhớ · tắt/bật · bật · game.hud_declutter Giảm nhiễu HUD · tắt/bật · tắt · game.auto_pause_focus Tự tạm dừng khi mất focus · tắt/bật · bật / khoá bật (§3.1) · game.combat_toasts Thông báo trong trận · Ngay / Hoãn tới phòng sạch · Hoãn · game.cross_run_memory Trí nhớ xuyên run (công tắc Sổ Thù 14 §9) · tắt/bật · bật |
Điều khiển (42 §7.1) | input.preset Preset điều khiển · PAD_DEFAULT / PAD_SOUTHPAW / PAD_LEFT_ONLY / PAD_RIGHT_ONLY / KBM_DEFAULT / KBM_KEYS / KB_LEFT_ONLY / CUSTOM · theo thiết bị · input.bindings.* Remap · 2 ô/action/họ thiết bị (41 §8.1; trùng phím → cảnh báo ui-warn + hoán đổi) · input.ls_deadzone Vùng chết cần trái · 0.10–0.40 bước 0.05 · 0.20 · input.rs_deadzone Vùng chết cần phải · 0.15–0.45 bước 0.05 · 0.30 · input.swap_sticks · input.invert_y Đảo cần · Đảo trục Y · tắt/bật · tắt · input.mouse_sens Độ nhạy chuột · ×0.5–×2.0 bước 0.1 · ×1.0 · input.cursor_confine Khoá con trỏ trong cửa sổ · tắt/bật · bật (toàn màn) / tắt (cửa sổ) · input.aim_assist Trợ ngắm tay cầm · 0–100% bước 10 · 100 · input.boss_lock_hard Khoá boss cứng (R3 / chuột giữa) · tắt/bật · tắt · input.ash_inspect_toggle Xem Tro Nhớ kiểu bật · tắt/bật · tắt · input.skill_hold_mode Kỹ năng ngắm · Giữ-thả / Chạm-chạm · Giữ-thả · input.attack_toggle Đánh kiểu bật · tắt/bật · tắt · input.move_latch Giữ hướng đi khi nhả cần · 0 / 0.25 / 0.50 s · 0 · input.confirm_swap Đảo xác nhận/huỷ · tắt/bật · tắt · input.confirm_style Kiểu xác nhận lệnh nguy hiểm · Giữ / 2 bước · Giữ · input.ui_repeat_delay Trễ lặp điều hướng · 0.25–0.80 s · 0.35 · input.haptic_strength · input.haptic_tells Rung tay cầm · Rung tell · 0–100% · 100 · bật · ngưỡng giữ ĐÁP/verb giữ: dòng chỉ đọc |
Hiển thị (42 §2, nhóm video.*/hud.*/cam.*) | video.window_mode Chế độ cửa sổ · Toàn màn không viền / Toàn màn / Cửa sổ · không viền / toàn màn · video.resolution Độ phân giải · chỉ độ phân giải zoom nguyên · gốc màn / 1280×800 · video.fps_cap Trần khung hình · 30 / 40 / 45 / 60 · 60 · video.vsync V-sync · tắt/bật · bật · video.safe_margin Vùng an toàn màn · 0 / 4 / 8 / 12 / 16 UI px · 0 / khoá 0 · video.fx_preset Preset FX · Cao / Deck 70% / Thấp · Cao / Deck 70% · hud.opacity Độ mờ HUD · 50–100% bước 10 · 100 · hud.dmg_numbers Số sát thương · Đầy đủ / Chỉ chí mạng + boss / Tắt · Đầy đủ · hud.hero_dmg_numbers Số hero nhận · tắt/bật · bật · hud.button_hints Hiện nút trên HUD · tắt/bật · bật · cam.shake Rung màn · 0–100% bước 10 · 100 |
Âm thanh (42 §5) | audio.vol_master Tổng · 0–100 bước 5 · 80 · audio.vol_music · vol_sfx · vol_amb · vol_ui · vol_vo Nhạc · Hiệu ứng · Môi trường · UI · Giọng · 0–100 bước 5 · 100 · audio.vol_tell Âm tell · 50–150% · 100 · audio.dynamic_range Dải động · Rộng / Thường / Hẹp · Thường / Hẹp khi loa trong · audio.small_speaker Loa nhỏ · tắt/bật · tắt / tự bật khi Deck không tai nghe · audio.mono Mono · tắt/bật · tắt · audio.tell_positional Âm tell theo vị trí · tắt/bật · tắt · audio.tell_enhanced Âm tăng cường · tắt/bật · tắt · audio.h12_click Click nhịp H12 · tắt/bật · tắt · audio.latency_ms Hiệu chỉnh trễ âm · −100…+100 ms bước 10 · 0 (+ nút "Đo trễ" → màn đo 42 §5) · audio.mute_unfocused Tắt âm khi mất focus · tắt/bật · bật · a11y.visual_sound Chỉ hình · tắt/bật · tắt |
Trợ năng (42 §2 nhóm a11y.*, §3, §4, §6, §7 thời gian giữ, §10) | a11y.particles_reduce Giảm hạt FX · tắt/bật · tắt · a11y.reduce_motion Giảm chuyển động · tắt/bật · tắt · a11y.hero_outline Viền hero · 1 / 2 / 3 px · 1 · a11y.hero_ring_boost Vòng chân đậm · tắt/bật · tắt · a11y.contrast_boost Tăng tương phản · tắt/bật · tắt · a11y.offscreen_arrows Mũi tên ngoài màn · tắt/bật · tắt · a11y.aim_reticle Reticle ngắm · Khi ngắm / Luôn · Khi ngắm · a11y.cursor_size Cỡ dấu ngắm chuột · 1× / 2× / 3× · 1× · a11y.low_hp_vignette Viền HP thấp · Nhịp / Tĩnh / Tắt · Nhịp · a11y.tell_shapes Tell mù màu (◇/▲/chấm) · tắt/bật · tắt · a11y.cvd_mode Chế độ mù màu · Tắt / Đỏ–lục / Lam–vàng / Đơn sắc · Tắt · a11y.flash_reduce Giảm chớp · tắt/bật · tắt · a11y.text_scale Cỡ chữ · 100 / 125 / 150% · 100 / 125 · a11y.text_contrast Nền chữ đặc · tắt/bật · tắt · a11y.dialogue_speed Tốc hiện chữ thoại · 20 / 40 / 80 ký tự/s / tức thì · 40 · a11y.dialogue_auto Tự chuyển dòng · tắt/bật · tắt · a11y.screen_reader Đọc màn hình · tắt/bật · tắt · sub.enabled Phụ đề · tắt/bật · bật · sub.speaker Tên người nói · tắt/bật · bật · sub.bg_opacity Nền phụ đề · 0–100% bước 10 · 60 · sub.size Cỡ phụ đề · theo Cỡ chữ / 125 / 150% · theo Cỡ chữ · a11y.tell_subs Phụ đề tell · tắt/bật · tắt · sub.sound_captions Chú thích tiếng động · tắt/bật · tắt · input.hold_time_mult Thời gian giữ · ×0.5–×2.0 bước 0.25 · ×1.0 · Preset nhanh (42 §10): Nhìn kém · Nghe kém · Mù màu · Nhạy sáng & chuyển động · Vận động · Nhận thức · nút "Thử ở Sân Tập" (chỉ ở hub) |
Thương Xót (42 §9) | dải chữ đầu tab: "Bật bất kỳ mục nào: không tính bảng xếp hạng và thành tựu Độ Tang" · preset "Chọn cách đi" Kể Chuyện / Đồng Hành / Hành Trình (19 §6.2; chỉnh tay → "Tự chỉnh") · mercy.dmg_taken Sát thương nhận · 0 / −25 / −50 / −75% · 0 · mercy.answer_window Cửa sổ ĐÁP · +0 / +0.03 / +0.06 s · +0 · mercy.game_speed Tốc game · 70–100% bước 5 · 100 · mercy.auto_aim Tự ngắm · tắt/bật · tắt · mercy.hold_toggle Verb giữ · Giữ / Bật · Giữ · mercy.ash_zero Tro Nhớ 0 · tắt/bật · tắt · mercy.auto_defense Phòng Thủ Tự Động 50% · tắt/bật · tắt · mercy.h12_beat Nhịp Ambrin · ±0.12 / ±0.16 s · ±0.12 · mercy.h07_peak Đỉnh Hơi Veyra · +0 / +0.04 s · +0 · mercy.latency_offset Hiệu chỉnh trễ · −0.10…+0.10 s bước 0.01 · 0 |
Dữ liệu & quyền riêng tư (43 §7.3, §15.1; 60 PV03) | Telemetry · tắt/bật · theo Consent · Báo crash · Luôn gửi / Hỏi mỗi lần / Không bao giờ · theo Consent (mặc định Hỏi mỗi lần) · "Xoá dữ liệu đã gửi" → UI_C_Confirm "Gửi yêu cầu xoá theo mã ẩn danh; xử lý ≤ 30 ngày" · "Tạo mã ẩn danh mới" → UI_C_Confirm (telemetry_id mới, 43 §15.2) · Đồng bộ Cloud · trạng thái chỉ đọc ("Đã đồng bộ {date}" / "Ngoại tuyến") · "Xoá Sổ Thù" UI_C_Hold 1.0 s · "Xoá toàn bộ tiến trình" UI_C_Hold 2.0 s × 2 lần (lần 2 chữ ui-warn "Không thể hoàn tác"; chép bản sao vào local/conflict/ trước khi xoá, 43 §7.3) · link "Chính sách quyền riêng tư" · Credits (→ Credits) |
- Bố cục: tab (14, 8, 400, 14) · danh sách mục (14, 26, 250, 218), dòng 16 · mô tả mục focus (270, 26, 143, 218)
body+ ảnh minh hoạ 128×72 (Trợ năng: ảnh tell trước/sau). Focus đầu: mục 1 của tab. Trái/phải đổi giá trị (UiSliderStep (mỗi bước thanh trượt; pitch = −6..+6 bán cung theo giá … SFX_UI_slider_tick); A bật/tắt; tab UiTabSwitch (LB/RB, Q/E, click tab) SFX_UI_tab_switch. - Đổi độ phân giải/chế độ cửa sổ → popup "Giữ thiết lập này?" tự quay lại sau 10 s.
6.4 Khuôn menu trạm (UI_StationMenu, dùng cho §6.5–§6.12)
| Vùng | Rect | Nội dung |
|---|---|---|
| Đầu | (14, 6, 260, 17) | tên trạm FNT_BW_L + NPC FNT_BW_S |
| Tiền | (283, 6, 140, 12) | chỉ tiền trạm dùng |
| Tab | (14, 26, 400, 14) | LB/RB |
| Danh sách | (14, 44, 184, 200) | dòng 20: icon 16×16 + tên name ≤ 22 ký tự + giá/trạng thái căn phải |
| Chi tiết | (202, 44, 211, 200) NS_PANEL_INSET | icon 32×32 · tên · mô tả body ≤ 240 ký tự · điều kiện (✓ ui-ok / ✗ ui-text-off + tiến độ "112/150") · giá |
| Nhắc nút | y 251 | A Mua/Chọn · View Chi tiết · LB/RB Tab · B Rời |
- Luật mua (
18§2): A mua; giá ≥ 500 Tro Hồn hoặc ≥ 10 Mảnh Vọng →UI_C_Hold0.5 s. Thiếu tiền: dòng + nút xám, giáui-warn+ "thiếu {value}", A → UiError (hành động không được phép: thiếu tiền, khoá, ô đầy) SFX_UI_nav_error. Mua xong: CurrencyChanged delta<0 (mọi tiền meta; Phục Dựng, nâng trạm, mở hero… SFX_UI_currency_spend + UnlockGranted (hero/Dạng Rèn/ult/mode/trang codex) và MasteryRankUp VFX_UI_unlock_seal (mở khoá) + UnlockGranted (hero 01 · Dạng Rèn 02 · ult 03 · mode 04 · trang codex… SFX_UI_unlock; dòng chuyển "ĐÃ MỞ". - Focus đầu: dòng mua được rẻ nhất; không có → dòng 1. Danh sách dọc vòng; phải → nhảy sang chi tiết (khi chi tiết có nút).
6.5 Hearth — Lửa Canh (Lửa Canh ST_HEARTH)
Tab Kẻ Thức (bố cục riêng, không khuôn §6.4):
| Vùng | Rect | Nội dung · trạng thái |
|---|---|---|
| Lưới hero | (14, 44, 140, 104): 4 × 3 ô 32×32 cách 4 | por_<code>_hud; đã mở: viền slot 1 px · khoá: bóng ui-locked + khoá 8×8 · đủ điều kiện chưa rèn: "!" (→ rèn ở Lò Rèn); thứ tự H01…H12 |
| Thông tin | (14, 152, 140, 92) | tên + danh hiệu · vũ khí · Độ khó 1–5 chấm · tài nguyên · ĐÁP (tên + cửa sổ "0.16 s") · verb giữ · MR + thanh XP + TT n/5; hero khoá: điều kiện + tiến độ + giá Mảnh Vọng |
| Chân dung | (156, 44, 192, 192) | por_<code>_select thở 24 frame @12 fps; HeroSelected ở Lửa Canh (chọn hero / ult / Dạng Rèn / kỹ năng khởi đầ… VFX_UI_hero_select lửa tô LUT slot khi đổi hero (khoá: lửa xám + UiError (hành động không được phép: thiếu tiền, khoá, ô đầy) SFX_UI_nav_error) |
| Hành trang | (318, 44, 95, 200) | ô Ult 28 · ô Dạng Rèn 28 · 2 ô kỹ năng 28 (MRN09: 1) + tên caption; "Hành trang lưu 1–3" (UP_WARDROBE_1) |
- A trên hero đã mở → focus sang "Hành trang"; A trên ô →
Loadout(popup (63, 30, 300, 210)): Ult 3 thẻ thu gọn 96×120 · Dạng Rèn 3 · Kỹ năng lưới 4 × 2 icon 32 + tên (chọn đúng 2, ô đã chọn đánh số 1/2 = ô LB/Q và LT/E); mục chưa mua:ui-locked+ "Lò Rèn: {value} Mảnh Vọng". UP_WARDROBE_2 → chân dung chạy anim Dạng Rèn đang focus. - Âm: đổi hero HeroSelected (Lửa Canh: xác nhận hero / ult / Dạng Rèn / 2 kỹ năng kh… SFX_UI_hero_select; chọn kỹ năng SkillLearned / SkillSwapped / SkillRankUp (draft SKILL, hub chọn 2 kỹ… SFX_UI_skill_learn.
Tab Phục Dựng: GD1–GD5 dòng (giá, mở gì, cảnh truyện) — mua = UI_C_Hold 0.5 s (giá ≥ 500) → cảnh 4 s RestoreStageBought GD1–GD5 (t=0 cảnh) SFX_HUB_restore_stage. Tab Nâng trạm: UP_HEARTH_1–4 (khuôn §6.4).
6.6 Forge — Lò Rèn Vọng: tab Rèn Kẻ Thức (12 dòng: điều kiện chiến công + giá 0–16 Mảnh Vọng; rèn → cảnh 4 s ForgeUnlock (rèn mở hero): 3 nhát cách 0.3 s + tôi nước t=0.9 s SFX_HUB_forge_unlock) · Dạng Rèn (12 hero × AS2/AS3 8/15) · Ult (UL2/UL3 6/10) · Tiến Hoá (công thức EVO1–EVO4 mỗi hero: đã lộ = 2 icon + điều kiện; chưa = bóng "?"; EVO4 hiện ở MR12) · Nâng trạm (UP_FORGE_1–5).
6.7 DockDepart — Bến Đò
| Vùng | Nội dung |
|---|---|
| Danh sách mode (14, 44, 184, 120) | Hành Trình · Lễ Ngày · Truy Tuần · Canh Thâu Đêm · Đêm Hồi Chuông · Lễ Tự Chọn; khoá: điều kiện mở (Bible §3.4) |
| Chi tiết (202, 44, 211, 200) | luật 4 dòng · hệ số tiền (Tro Hồn/Mảnh Vọng/Nến Canh/Thông Thạo) · DAILY/Truy Tuần: hero + Dạng Rèn + ult cho mượn, 3 Khăn Tang, 2 mutator, "Lượt tính điểm: còn 1/1", giờ đổi seed (UTC) · CUSTOM: thanh trượt HP/sát thương địch 25–300%, mật độ, thời gian hồi chiêu, Tro Nhớ 0–3, seed 16 ký tự hex (bàn phím ảo tay cầm), bất tử, Edge/Relic khởi đầu |
| Tóm tắt (14, 168, 184, 76) | hero · hành trang · Lễ Vật · Độ Tang · "Chìa Đò" (khi có Calla trao Chìa Đò (arc Calla xong). FLAG_FERRY_KEY) |
- "Xuất phát" (A) → cảnh đò 6 s (DepartConfirmed ở ST_DOCK (t=0 cảnh 6 s) SFX_HUB_dock_depart) →
ActIntro. Có run dở →UI_C_Confirm"Bỏ run đang dở?". Lần đầu (Hub chỉ hiện ST_HEARTH + ST_DOCK; bật hàng đợi onboarding run 1. FLAG_FIRST_WAKE): chỉ hiện Hành Trình. - DAILY / Truy Tuần / ENDLESS / BOSS_RUSH: lần đầu chọn →
RankedNotice(§6.13); dòng "Xếp hạng: Bật / Chơi không xếp hạng" (X đổi) trong Chi tiết; "Chơi không xếp hạng" hoặc lượt DAILY đã dùng → run gắn thẻ "TẬP" (khốiMODE§4.1).
6.8 Ledger — Sổ Tang (tab: Codex · Lịch Sử Run · Bia Mộ · Sổ Thù · Bàn Thờ Ký Ức · Sưu Tập · Bảng Xếp Hạng)
- Codex: cây mục trái (Kẻ Thức, Kẻ địch, Tinh Anh, Boss, Nơi chốn, NPC, Relic, Tro Nhớ, Truyện); trang
CDX_*: mục "bóng" = tên + hình đen; trang đã viết: tranh 160×90 (nếu muaART_*) + chữbodycuộn + tab con "Frame data" (UP_LEDGER_1) + "Thế đáp" (trục, thói quen, mẹo, đòn bị đổi;14§14). Trang mới "!"; đọc ≥ 2 s = đã đọc (18§9). Lật trang LedgerPageTurn (Hol idle 8–12 s; đổi tab/trang Sổ Tang) SFX_HUB_ledger_page. - Lịch Sử Run: bảng 100 dòng (hero, mode, Độ Tang, kết quả, phút) → A mở build (như
RunSummarytab Build, chỉ đọc). - Bia Mộ: 12 bia (TMB_Hxx từ MR18); "Thắp Nến Bia" 25 Nến Canh/nến.
- Sổ Thù: boss Hồi × hero: 5 bản ghi (ngày, kết quả, Độ Tang, thói quen nổi bật), thế mở màn dự kiến, Sẹo; "Xoá Sổ Thù"
UI_C_Hold1.0 s. - Bàn Thờ Ký Ức: danh sách Sẹo đang khắc → "Gột" 200 Tro Hồn (UP_TEST_BELL_4: 150),
UI_C_Hold1.0 s. - Sưu Tập: thanh % 12 nhóm (
18§9) + "Hoàn tất tài khoản". Bảng Xếp Hạng:Leaderboard— tab DAILY/Truy Tuần/ENDLESS/BOSS_RUSH × Toàn cầu/Bạn bè/Quanh tôi; 10 dòng/trang (hạng, tên Steam ≤ 16 ký tự + "…", điểm, hero glyph).
6.9 TestBell — Chuông Thử
- Khăn Tang (sau END_BELL_TOLL): 15 dòng MRN (glyph 8×8 + tên + bậc ô vuông 0–max + điểm/bậc); trái/phải tăng/giảm bậc; khoá: MRN11–MRN15 trước GD3 (
ui-locked+ "Phục Dựng GĐ3"); số "Độ Tang {do_tang}"FNT_BW_XLgóc trên-phải + vải khăn MourningBandChanged (buộc/cởi MRN01–MRN15 ở Chuông Thử) VFX_UI_mourning_knot; mỗi đổi MourningBandChanged (buộc/cởi MRN01–MRN15: lớp vải; tổng Độ Tang đổi:… SFX_UI_mourning_band. Chi tiết: hiệu ứng đầy đủ + thưởng (Nến Canh = Độ Tang, mốc 4/8/16/24/32). - Mắt Tro: UP_TEST_BELL_1/2 → 1/3 trục PSP cao nhất (chữ + thanh); không đổi Tro Nhớ. Đổi Nến Canh: thanh trượt bội 100 Tro Hồn → "= {n} Nến Canh";
UI_C_Hold1.0 s (1 chiều). Nâng trạm.
6.10 Market — Chợ Đò: tab Pool (Edge chung + Relic chưa mở; lọc LB/RB phụ theo loại, X đổi lọc tag/rarity; thứ tự rẻ trước, nhóm theo tag — 18 §6.5; sau GD2 +12 mục) · Lễ Vật (LV01–LV06, chọn ≤ 1 (UP_MARKET_3: 2), tắt khi mode đã chọn là DAILY/BOSS_RUSH: "Không dùng ở chế độ này") · Nâng trạm (UP_MARKET_1–5).
6.11 Yard — Sân Tập (menu nổi trên sân, World chạy)
- Panel thu gọn (283, 30, 140, 200) mở bằng
INTERACTtại Răm: Dummy (tell Y/P/N, hạng S/M/L/XL, hệ số windup ×1.0–×2.0, tốc, nhịp lừa bật/tắt, mẫu boss — UP_YARD_1) · Bài tập ĐÁP (10/30 lần, đếm hoàn hảo) · Frame data (overlay hitbox + số tick trên dummy) · Replay 10 s (UP_YARD_2: 30 s) · Đo DPS (cửa sổ 10 s) · Thử Thách TT1–TT5 của hero (tiến độ chỉ đọc) · Xem trước Trợ năng. - Panel không che hero: tự lật sang trái khi hero ở nửa phải màn. 0 thưởng (
18§2).
6.12 Wardrobe — Tủ Áo Tang (GD4): tab Skin (hero → 4 skin, xem trước LUT trên _select) · Trang trí (6 tượng, 18 hộp nhạc — A nghe thử 10 s, 30 tranh) · Hành trang lưu (UP_WARDROBE_1: 3 ô) · Màu phụ (UP_WARDROBE_3, trong slot INV-01).
6.13 Màn hệ thống & thông báo (#44–#53, trạng thái Leaderboard)
| Màn | Bố cục | Phần tử · luật | Focus đầu | Âm |
|---|---|---|---|---|
HubPause | UiPause open/close (snapshot SN_DRAFT; World + Hero dừng) VFX_UI_pause_dim phủ canvas · tiêu đề "TẠM DỪNG" (14, 8, 400, 17) + Tro Hồn/Mảnh Vọng · cột lệnh (14, 30, 100, 80) 4 nút cách 20 · panel mô tả (122, 30, 291, 80) NS_PANEL | Tiếp tục · Cài đặt (→ Settings) · Thoát về tiêu đề (UI_C_Confirm "Về màn tiêu đề? Tiến trình hub đã lưu") · Thoát game (UI_C_Confirm "Thoát game?"); Báo lỗi (→ BugReport) là dòng phụ X; World HUB dừng (NPC, tro, hero), nhạc snapshot pause; B/Menu = Tiếp tục; trước khi về tiêu đề/thoát: lưu meta (43 §7.2) | Tiếp tục | UiPause open/close (Start / Esc; snapshot SN_DRAFT; UI ignoreListener… SFX_UI_pause mở/đóng; UiPopupOpen / UiPopupClose (biến thể 01 open, 02 close) SFX_UI_popup cho Confirm |
SaveConflict | tiêu đề "Chọn bản lưu" (14, 8, 400, 17) · 2 thẻ NS_PANEL 190×150 tại (14, 40) "Bản trên máy này" và (223, 40) "Bản Steam Cloud" · chữ giải thích (14, 196, 400, 24) | mỗi thẻ: {ngày giờ ghi utc_written theo giờ máy, giờ chơi, Tro Hồn, số hero đã mở /12, Hồi xa nhất (I–VI)}; số lớn hơn tô ui-ok; chọn = UI_C_Hold 1.0 s trên thẻ; bản không chọn chép local/conflict/<file>_<utc>.json (giữ 3 bản, 30 ngày); không có B (bắt buộc chọn) (43 §7.3 luật 2) | thẻ có save_seq cao hơn | UiHoldStart → UiHoldComplete (giữ để xác nhận 1.0 s); thả sớm = vòng … VFX_UI_hold_ring + UiHoldStart → loop cháy dần (1.0 s mặc định) → UiHoldComplete 'phụt';… SFX_UI_hold_confirm |
SaveNotice | UI_C_Confirm 1 nút "Đã hiểu" (200×72 giữa SAFE) | 3 mẫu: luật 3 meta "Bản lưu hỏng, đã khôi phục bản gần nhất" · luật 3 run / luật 4 "Run dở không đọc được nên đã bỏ; tiền meta giữ nguyên" · luật 5 "Bản lưu mới hơn game. Hãy cập nhật game" (khoá chỉ-đọc: mọi lưu tắt, chữ ui-warn ở Title dưới phiên bản) (43 §7.3) | "Đã hiểu" | UiPopupOpen / UiPopupClose (biến thể 01 open, 02 close) SFX_UI_popup |
PadLost | lớp phủ Overlay 200×72 giữa SAFE trên Pause/HubPause; icon tay cầm 32×32 + "Kết nối lại tay cầm" FNT_BW_M | mở trong frame tay cầm rời (cả khi game.auto_pause_focus tắt); tự đóng khi tay cầm (bất kỳ) kết nối lại, giữ nguyên tạm dừng (không tự tiếp tục — 43 §10); bàn phím/chuột vẫn điều khiển Pause dưới lớp phủ (Enter = đóng lớp phủ) (43 §8.1, 60 DV04) | — | UiPause open/close (Start / Esc; snapshot SN_DRAFT; UI ignoreListener… SFX_UI_pause |
RankedNotice | UI_C_Confirm 2 nút (200×88 giữa SAFE) | lần đầu chọn DAILY / ENDLESS / BOSS_RUSH ở DockDepart: "Điểm và thống kê run sẽ gửi tới máy chủ bảng xếp hạng." · "Tiếp tục" · "Chơi không xếp hạng" (run gắn thẻ "TẬP", không nộp, không tiêu lượt DAILY); ghi lựa chọn đã thấy vào settings_shared.json, không hỏi lại; đổi ở DockDepart mục "Xếp hạng" bật/tắt (43 §15.1, 60 PV05) | "Tiếp tục" | UiPopupOpen / UiPopupClose (biến thể 01 open, 02 close) SFX_UI_popup |
CrashPrompt | UI_C_Confirm (200×72 giữa SAFE) | chỉ khi crash lần trước + lựa chọn "Hỏi mỗi lần": "Game đã gặp lỗi lần trước. Gửi báo lỗi?" · "Gửi" · "Không"; dòng phụ ui-text-2 "Đổi ở Cài đặt › Dữ liệu & quyền riêng tư"; "Luôn gửi" → gửi ngầm không hỏi; "Không bao giờ" → dump giữ 7 ngày rồi xoá (43 §15.1, §15.3) | "Không" (an toàn) | UiPopupOpen / UiPopupClose (biến thể 01 open, 02 close) SFX_UI_popup |
BugReport | panel (63, 40, 300, 180) NS_PANEL: tiêu đề "Báo lỗi" · ô mô tả (71, 64, 284, 90) · checkbox "Đính kèm ảnh" (71, 160) · nút "Gửi" (283, 200, 72, 16) / "Huỷ" (199, 200, 72, 16) | mô tả ≤ 500 ký tự, đếm "{count}/500"; nhập bằng ShowFloatingGamepadTextInput khi dùng tay cầm (43 §8.1); checkbox mặc định TẮT (ảnh chỉ gửi khi tick); gửi log 2 000 dòng + build_number + content_version (43 §15.3); ngoại tuyến → xếp hàng local/crash/, toast "Sẽ gửi khi có mạng" | ô mô tả | UiConfirm (A / Enter / click trái) SFX_UI_nav_confirm khi gửi |
DemoEnd | toàn màn: tiêu đề "Còn tiếp ở Early Access" FNT_BW_XL (13, 40, 400, 22) · 2 dòng nội dung EA (63, 70, 300, 30) · 3 nút dọc (163, 130, 100, 16 + 20k) | chỉ bản demo, sau BossVictory BS_B1 (43 §3.1): Wishlist (ActivateGameOverlayToStore app chính; overlay tắt → trình duyệt) · Góp ý (form web, URL config) · Chơi lại (→ RunSummary → hub); telemetry demo_end_screen {wishlist_clicked} (43 §15.2, chỉ khi đồng ý); nút Wishlist cũng có trên Title demo và DeathRecap lần chết thứ 3 (43 §3.2, 60 DM06–DM07) | Wishlist | UiConfirm (A / Enter / click trái) SFX_UI_nav_confirm; nhạc credit loop ENDING · END_BELL_TOLL Hồi Chuông (Gióng chuông sau BS_FINAL) · phần tuyến tính 180 s = f… MUS_end_bell_toll |
EaProgress | tiêu đề "Lộ trình Early Access" (14, 8, 400, 17) · trục 4 mốc ngang (14, 40, 400, 180): cột 96 × 180 cách 4 | đọc config/ea_roadmap.json đóng gói theo build (không gọi mạng; 43 §4); schema: danh sách { "ms": "<MS04…MS07>", "month": "<MM/YYYY>", "items_vi": ["…"] } (EN qua bảng loc); cột: mã mốc + tháng FNT_BW_M + ≤ 6 dòng items_vi body; mốc đã phát hành (build ≥ mốc) đóng dấu ✓ ui-ok, mốc kế viền ui-focus; chỉ ở bản EA (ẩn ở 1.0 và demo); B → Title | cột mốc kế | UiTabSwitch (LB/RB, Q/E, click tab) SFX_UI_tab_switch khi đổi cột |
Loading | toàn màn ui-void; 1 dòng mẹo (63, 240, 300, 12) FNT_BW_S ui-text-2; dấu chuông quay 8×8 (415, 255) | chuyển cảnh mực (shader UI InkWipe, không phải id VFX) 0.25 s vào/ra; chỉ hiện khi tải > 0.5 s (tải ngắn hơn: chỉ ink-wipe); mẹo = 1 câu ngẫu nhiên từ trang codex đã mở (codex.json, trang CDX_* đã gặp, không lặp 3 lần liền); ngân sách tải hub → run ≤ 5 s, DOCK → Hồi kế ≤ 3 s (50 §5.3) — quá ngân sách vẫn hiện, ghi log hiệu năng; không nhận input | — | không âm riêng; nhạc giữ (lọc thấp) |
Leaderboard (trạng thái) | khối trạng thái (14, 26, 400, 12) trên danh sách | "Không kết nối" (Steam ngoại tuyến / không có Steam, 43 §13: danh sách ẩn, chỉ điểm tốt nhất cục bộ) · "Điểm đang chờ duyệt" (held, 43 §6.3 bước 4; dòng của người chơi ui-text-2 + icon đồng hồ 8×8, không buộc tội) · "Đang chờ gửi" (hàng local/score_queue/, bước 5) · "Đã quá hạn nộp" (quá 48 h) · run "TẬP"/Thương Xót: "Run này không tính bảng xếp hạng" | danh sách | — |
97. Chuyển động & âm UI
7.1 Luật chuyển động (ArtStyle §8e)
- Mọi vị trí bắt vào lưới UI px; không co giãn lẻ (chữ/khung pixel không scale 1.25 — "nảy" = dời 1–2 px hoặc đổi sprite); không blur; easing
outQuartlấy mẫu rồi làm tròn về UI px. - Đồng hồ: UI chạy đồng hồ
Real(không theo World ×0.15/×0.3, không theo slow-mo); tạm dừng dừng mọi tween HUD trừ con trỏ focus. - "Giảm chuyển động": bỏ hạt UI, bỏ trượt (chỉ mờ α), con trỏ focus đứng yên, DraftOpen: 3 thẻ rút ra lệch 0.06 s (cả màn chọn Relic/Edge hero đầu … VFX_UI_card_reveal = hiện cùng lúc; thời lượng mờ giữ nguyên.
| Mẫu | Thời lượng | Mô tả |
|---|---|---|
| Panel vào / ra | 0.15 / 0.10 s | trượt 8 px + α 0 → 1 |
Popup (UI_C_Confirm) | 0.12 / 0.10 s | α + dời 4 px từ dưới |
| Màn toàn phần đổi | 0.20 s | mờ qua ui-void |
| Thẻ hiện | 0.18 s, trễ 0 / 0.06 / 0.12 s | trượt lên 24 px |
| Focus đổi | 0.06 s | con trỏ nhảy tới (không bay) |
| Số đếm lên | 0.40 s | outQuart trên giá trị nguyên |
| HP lag | trễ 0.40 s, lùi 0.25 s | §1.3 ui-hp-lag |
| Callout | vào 0.12 s (dời lên 4 px + α), giữ 1.2 / 2.5 s, ra 0.20 s | §4.6 H7 |
| Toast | vào 0.15 s từ phải, giữ 3.0 s, ra 0.20 s | ≤ 2 xếp chồng |
| Mực bản đồ | 0.25 s/nút | MapOpen (đường R1→R6 hiện) + MapNodeChosen (đường đã chọn đậm lên) VFX_UI_map_path_ink |
| Nhịp chờ | 1 Hz (nút có thể đi, Dư Âm đầy) · 2 Hz (con trỏ focus) · 1.2 Hz (HP thấp) | ≤ 3 Hz mọi thứ (31 R9) |
7.2 Bản đồ âm UI (37 SFX_UI_*, bus UI, đồng hồ UI — 32 §7.1)
- Âm hệ thống dùng lại từ SHARED/HUB (không phải UI): AshVariantOn (Tro Nhớ đổi thế: khựng 0.6 s + ◆ Mắt Tro, ≥ 1.0 s trước… SFX_SHARED_ash_read, AshMesoShift (callout MESO đầu phòng) + stinger surge SFX_SHARED_ash_meso, UltGaugeFull (Dư Âm ULT_GAUGE = 100), 1 lần, không lặp SFX_SHARED_ult_ready, LevelUp (trước DraftOpen; nhạc stinger level_up của MusicDirector) SFX_SHARED_level_up, HeroLowHp (HP < 25%) bật loop; tắt khi HP ≥ 30% hoặc chết SFX_SHARED_hero_low_hp, RoomCleared (+ stinger nhạc room_clear) SFX_SHARED_room_clear, RelicChestOpen (rương Relic/thưởng phòng mở) SFX_SHARED_relic_chest, HeroRevive (Lửa Gửi hồi sinh + sóng đẩy r120) SFX_SHARED_revive_ember,
SFX_HUB_*(§6). Không âm UI nào > 300 ms trừ unlock/mastery_rank/achievement/card_pick_legend (≤ 2.0 s).
108. Giới hạn chữ cho loc
- Nguồn VI → EN trục → 8 ngôn ngữ (
43§12.2). Giới hạn đo bằng UI px ở cỡ 125% (bề rộng thật), không bằng ký tự; cột "≈ ký tự" chỉ để người viết ước lượng (VI/EN, bước TBFNT_BW_M6 px,FNT_BW_S4 px). Mọi chuỗi phải vừa ở 140% độ dài EN (DE/RU/PT-BR); CI chạy pseudo-loc (+40% + dấu chồng) chụp mọi màn, lỗi khi tràn hộp. - Cấm cắt "…" trên chữ gameplay; chỉ tên người chơi (bảng xếp hạng) được cắt. Tràn → rút gọn bản dịch, không thu font.
- Chuỗi UI không thuộc file dữ liệu:
Assets/_Project/Localization/ui_strings.csvkhoáui.<screen>.<slug>; chuỗi dữ liệu: khoá<file>.<id>.<field>do build sinh (51§3). Mọi{param}thuộc danh sách placeholder51§3.
| Vai | Hộp (UI px, 125%) | Dòng tối đa | ≈ ký tự VI/EN |
|---|---|---|---|
| Nút | 36–120 × 12 | 1 | ≤ 18 |
| Tab | ≤ 64 × 12 | 1 | ≤ 10 |
| Nhắc nút (nhãn) | ≤ 64 | 1 | ≤ 12 |
| Tên thẻ / Edge / Relic / kỹ năng | 112 × 24 | 2 | ≤ 18 / dòng (name_vi ≤ 30 tổng) |
| Hiệu ứng thẻ | 112 × 62 | 5 | ≤ 96 |
| Chip tag | 52 × 9 | 1 | ≤ 9 |
| Callout | 240 × 17 (FNT_BW_L) | 1 | ≤ 28 |
| Phụ đề tell | 140 × 9 | 1 | ≤ 24 |
| Gợi ý onboarding | 200 × 12 | 1 | ≤ 32 |
| Mục tiêu (tên / tiến độ) | 112 × 9 | 1 + 1 | ≤ 18 / ≤ 22 |
| Tên boss (L) / Tinh Anh (nameplate) | 240 / 64 | 1 | ≤ 24 / ≤ 16 |
| Thẻ MACRO / mẹo Tro Nhớ | 200 × 24 | 2 | ≤ 56 |
| Thoại NPC (1 hộp) | 291 × 36 | 3 | ≤ 140 |
| Bark | — | 1 | ≤ 48 (14 §14) |
Sự kiện EVT thân / lựa | 243 × 90 / 243 × 16 | 7 / 1 + hệ quả | ≤ 420 / ≤ 48 |
| Mô tả chi tiết menu trạm | 203 × 120 | 10 | ≤ 240 |
| Codex trang | 203 × cuộn | không giới hạn (cuộn) | ~150 từ (Bible §10.3) |
| Toast | 128 × 18 | 2 | ≤ 40 |
| Tooltip | 152 × 54 | 6 | ≤ 120 |
- CJK: hộp như trên; tính theo trường hợp chật nhất (Deck: ô 8 UI px, dòng 10 UI px) → giới hạn ký tự CJK = ⌊rộng / 8⌋ × ⌊cao / 10⌋ (vd hiệu ứng thẻ 112 × 62 → 14 × 6 = 84 ký tự).
119. Móc trợ năng (UI phía thực thi; luật gốc 11 §4, Bible §4.3, meta.accessibility)
Mọi tuỳ chọn đọc qua 1 dịch vụ AccessibilitySettings phát sự kiện AccessibilityChanged(key); mọi prefab UI lắng nghe và dựng lại trong ≤ 1 frame; không màn nào đọc PlayerPrefs trực tiếp.
| Tuỳ chọn | Móc UI | Ghi chú |
|---|---|---|
| Tell mù màu | HUD: mũi tên ngoài màn + phụ đề dùng ◇ / ▲ / chấm; recap INV-16 dùng cùng glyph; Cài đặt có ảnh trước/sau | world do VFX (31 R11) |
| Phụ đề tell | khối SUBS (§4.1), "[tinh · trái]" / "[ù · sau lưng]" / "[ĐÁP]" + "[Tro đọc]" | ≤ 3 dòng chồng, 1.2 s/dòng |
| Chỉ hình | cung sáng 8 px quanh vòng chân hero (world, VFX) — UI chỉ bật cờ | 11 §4.2 |
| Mũi tên ngoài màn | mũi tên 7×7 ở mép SAFE, màu + hình tell, ≥ 0.45 s trước va chạm | ngoại lệ H9 |
| Giảm chớp | HUD không nháy (HP thấp tĩnh 80%, Vỡ Thế đặc liền, ult đầy tĩnh); tắt chớp màn | 31 R9 |
| Giảm chuyển động | §7.1 | — |
| Cảnh báo nhạy sáng | PhotoWarning (§6.1) trước Language lần đầu; nút "Mở Trợ năng ngay" | 42 §1.2 |
| Tự tạm dừng khi mất focus | game.auto_pause_focus (§3.1); Deck khoá bật | 42 §8 |
| Cỡ chữ | §1.2 (100/125/150%) | Deck sàn 125% |
| Thời gian giữ | UI_C_Hold ×0.5–×2.0 | áp cả "giữ B bỏ qua", "giữ X Xoá" của Draft |
| Remap / 1 tay | màn remap theo action_id; preset 1 tay đổi cả map UI (xác nhận/quay lại về cùng nửa tay cầm) | không hành động UI nào cần 2 nút cùng lúc |
| Độ mờ HUD · Số sát thương · Hiện nút trên HUD | §4.6 H2/H6, §4.1 | — |
| Thương Xót | cờ run mercy_used "không tính bảng": HUD khối MODE (icon nến tắt 8×8, §4.1) + Pause đầu + RunSummary + Leaderboard (biểu tượng + chữ) | Bible §4.3 |
| Đọc màn hình | mỗi phần tử focus phát chuỗi a11y_label (tên + giá trị + trạng thái) cho API đọc màn hình của HĐH nếu có; thẻ: tên · rarity · tag · hiệu ứng | không chặn ship nếu nền tảng không có API |
| Rung tay cầm | Cài đặt 0–100%; UI không tự rung trừ UI_C_Hold chốt (40 ms) | — |
1210. Onboarding & hướng dẫn
10.1 Lần chạy đầu (khớp 18 §12)
PhotoWarning (4 s, bỏ qua sau 1.5 s) → Language → Consent (2 câu hỏi) → QuickSetup (6 dòng, bỏ qua được) → Title ("Chơi" duy nhất nổi bật) → cảnh mở 20 s (bỏ qua sau 2 s) → ChoosePath (3 preset, mặc định Hành Trình; 19 §5.6) → Loading → Lửa Canh ST_HEARTH (Ulla, H01 khoá sẵn SK01 + SK03, UL1, AS1, không menu) → đi bộ tới Bến Đò ST_DOCK (chỉ 2 trạm sáng; nhắc INTERACT) → DockDepart chỉ có Hành Trình → run 1. Không popup chữ dài; mọi hướng dẫn = beat NPC (≤ 3 câu) + 1 dòng HINT.
10.2 Gợi ý trong run (HINT, 1 dòng, glyph nút theo thiết bị)
Luật: mỗi gợi ý hiện tối đa 2 lần/tài khoản (đếm ở settings_shared.json), chỉ trong 3 run đầu đời (trừ dòng ghi khác); tự tắt khi người chơi làm đúng hành động hoặc sau 6 s; không hiện khi boss đang windup P hoặc trong 60 s đầu Hồi I nếu đã hiện 3 gợi ý trong phòng đó; Cài đặt "Gợi ý nút" TẮT → không hiện.
| Kích | Chữ (mẫu loc) | Tắt khi |
|---|---|---|
| Vào phòng 1 run 1 | "{MOVE} Di chuyển · {ATTACK} Đánh" | đánh trúng 5 lần |
| 10 s sau phòng 1 bắt đầu | "{DASH} Lướt — xuyên qua đòn" | Lướt 1 lần |
| Glint 1 của tell vàng đầu tiên nhắm hero | "Vàng: chạm {ANSWER} để ĐÁP" | ĐÁP thành công 1 lần |
| Vùng tím đầu tiên | "Tím: chỉ Lướt mới thoát" | Lướt ra khỏi vùng P |
| Vùng chấm đầu tiên | "Chấm xám: bước ra ngoài" | rời vùng |
| Draft đầu tiên | tooltip trên thẻ 1: "Chọn 1 thẻ · {Y} Đổi · {B} giữ: Bỏ qua" | chọn thẻ |
| Dư Âm đầy lần đầu | "{ULT} Tuyệt kỹ sẵn sàng" | dùng Ult |
| HP < 50% và có bình | "{POTION} Uống bình máu" | uống |
Map lần đầu | tooltip nút ELT/MBS: "Mỗi Hồi phải qua đúng 1 Cổng" | chọn nút |
| Tinh Anh đầu tiên | "Thanh bạc = Thế: ĐÁP và đòn nặng làm vỡ" | Vỡ Thế 1 lần |
| Run 2, phòng 1 | "Giữ {ANSWER}: {verb giữ của hero}" | dùng verb giữ |
| Lần bật thế đáp Tro Nhớ đầu tiên đời (run ≥ 4) | "Giữ {ASH_INSPECT}: xem Tro đang nhớ" | mở AshInspect |
| Lên cấp khi Cổng/boss (lần đầu) | "Cấp chờ: thẻ mở sau trận" | — (2 lần) |
- Hub: run 1 →
RunSummarytab Thưởng nhấn "Giữ 100% tiền meta khi chết"; về hub: beat Ulla (Phục Dựng), Grem (rèn H02), Hol (bia mộ) — tối đa 2 trạm mới/lần về hub; run 3: Răm mời bài ĐÁP 1 ở Sân Tập. "Thức Lại" ẩn run 1–2. - Không có màn hướng dẫn riêng/không phòng tập bắt buộc; Sân Tập là tuỳ chọn (0 thưởng).
1311. Telemetry UI (chỉ khi đồng ý, 43 §15)
ui_screen {screen, from, dwell_s} · ui_draft {options[], picked, rerolls, banish, lock, skip, time_s, auto_pick} · ui_setting {key, value} · ui_hint {hint, shown, done_s} · ui_ash_inspect {hold_s}. Dùng để kiểm P5 (đọc thẻ < 3 s: trung vị time_s ≤ 3.0 ở draft thứ 10+) và KPI Tro Nhớ (≥ 60% người chơi mở AshInspect ≥ 1 lần trong 5 run).
14Quy tắc cho dev/AI
- HUD và mọi màn dựng trong
SAFE427×267 UI px; 1 bản số cho 1080p và Deck; không neo phần tử tương tác ra mép canvas. Chỉ zoom nguyên, chỉ fontFNT_BW_*/ CJK đã duyệt, không scale lẻ chữ/khung. - Màu chỉ từ token §1.3; thêm màu = thêm token (lý do + màn) và kiểm hue/S ngoài dải tell (INV-01a). Không bao giờ vàng
#ffd84a/tím#b14cffhay màu cùng dải trên UI, trừ ngoại lệ H9 (biểu diễn chính tell). - Không phần tử HUD nào trong vùng cấm 160×100 giữa
SAFE; mọi khối HUD áp luật nhường H1; số sát thương theo10§6.5 nguyên văn. - Chữ thẻ/tooltip = mẫu câu từ
params(không viết tay số); giới hạn §8 đo ở 125%; CI pseudo-loc trên mọi màn. - Mọi màn: điều hướng tường minh, focus đầu như spec, khoá xác nhận 0.30 s cho màn mở do sự kiện, nhắc nút đúng bộ glyph thiết bị cuối, chạy 100% bằng tay cầm.
- Hành động phá huỷ/không hoàn →
UI_C_Hold1.0 s (ngoại lệ: "Xoá toàn bộ tiến trình" 2.0 s × 2 lần,43§7.3); mua meta giá lớn → 0.5 s; focus mặc định của popup = lựa an toàn; màn đồng ý (Consentkhối 1) không có lựa chọn sẵn, 2 nút ngang nhau. - Mọi option trong
Settingslấy khoá/giá trị/mặc định từ42(§6.3 chỉ xếp chỗ); thêm option = thêm vào42trước. - Credits sinh từ
credits.jsonlúc build (§5.7.1); thêm âm CC BY hoặc thư viện có giấy phép = thêm nguồn credit, CIcredits_checkchặn thiếu. - Hiện/ẩn màn qua
UIManager(khôngSetActivetay); async bằng UniTask; tween DOTweenSetUpdate(true)(đồng hồ Real) và Kill khi đóng (rule third-party). - Id âm/FX chỉ từ
UI.json(SFX_UI_*,VFX_UI_*) + SHARED/HUB đã liệt kê; nhạc chỉ cue doc 32 §3.7. - Tên hiển thị theo Bible §11 (Khăn Tang, Độ Tang, Dạng Rèn, Dư Âm, Then Chốt…); không hiện id loại; không tên game/studio/thương hiệu có thật trong chuỗi UI.
- Sửa doc này khi đổi số UI → đồng bộ hub ArtStyle §8 (token, kit, chữ, motion) cùng lượt + chạy
art-style.py lint --changed.
15Quyết định đã chốt
| Mã / ngày | Quyết định | Lý do |
|---|---|---|
| UI-01 · 2026-11-07 | Toạ độ UI = UI px trong SAFE 427×267 giữa canvas, thang = zoom world nguyên; 1 bố cục chung 1080p và Deck | Bible §10.4 "UI neo theo vùng an toàn"; Deck 427×267 = SAFE |
| UI-02 · 2026-11-07 | Font = bộ bitmap tự vẽ FNT_BW_S/M/L/XL/NUM (2 tầng dấu tiếng Việt) + 1 font CJK 12 px giấy phép mở; cỡ chữ = đổi font, không scale | Bible §10.3 + 43 §12.2; tránh rủi ro giấy phép font; hub ArtStyle §8d còn "open" → cần đồng bộ |
| UI-03 · 2026-11-07 | INV-01a áp cho UI: XP bar ui-xp (lục xám) thay vàng demo; Thế boss bạc; HP boss ngà | 08-Arena-HUD.md dùng XP vàng + Thế vàng → trái INV-01a (demo = lịch sử) |
| UI-04 · 2026-11-07 | Khung rarity UI = hex canon Bible §6 (#9a95a8 / #5fa8d3 / #c86a8a / #f4f1ea / #141016 + #d8cfc0); glyph mù màu rarity = số chấm (1/2/3/✶/—) | UI.json DraftOpen: 3 thẻ rút ra lệch 0.06 s (cả màn chọn Relic/Edge hero đầu … VFX_UI_card_reveal/card_pick_burst ghi hex khác [ASSUMED, chờ token UI hub] (#9a96a8, #8fb4d8, #c0584a) và glyph ◆/▲ trùng nghĩa Tro Nhớ/tell P → chủ UI.json sửa theo doc này |
| UI-05 · 2026-11-07 | Hub: tương tác = INTERACT B / G (+ Đánh X / LMB), dịch chuyển nhanh = MAP d-pad lên / M; View/Tab ngoài trận = "Chi tiết" | Bible §1.1 + DEC-2026-11-07-06; 18 §1.1 ghi "MAP (Back/Tab)", "INTERACT (A/E)" lệch canon → doc 18 sửa |
| UI-06 · 2026-11-07 | Bản đồ Hồi: khoảng làn 54, khoảng hàng 40 UI px (± 3 jitter) | 16 §2.1 "96/72 px UI" không vừa 6 hàng trong 267 UI px; giữ tỉ lệ ≈ 4:3 |
| UI-07 · 2026-11-07 | Không minimap; vị trí địch quan trọng = mũi tên mép SAFE | phòng = 1 sân; giảm che màn trong bầy |
| UI-08 · 2026-11-07 | HUD nhường tell/hero bằng độ mờ (α 0.35, boss bar 0.60) thay vì dời khối | giữ vị trí cố định (đọc theo thói quen) mà không che tell (31 §1 thứ bậc) |
| UI-09 · 2026-11-07 | Giữ để xác nhận: phá huỷ 1.0 s, mua meta lớn 0.5 s, chỉnh ×0.5–×2.0 | 16 §8.2 (Bỏ run 1.0 s) + 18 §2 (0.5 s) + UiHoldStart → UiHoldComplete (giữ để xác nhận 1.0 s); thả sớm = vòng … VFX_UI_hold_ring |
| UI-10 · 2026-11-07 | Thẻ draft 128×176 (4 thẻ: 101×176), hiệu ứng ≤ 96 ký tự ở 125% | đọc < 3 s (P5), vừa Deck mặc định 125% |
| UI-11 · 2026-11-07 | Thêm 13 màn #41–#53 (PhotoWarning, QuickSetup, ChoosePath, HubPause, SaveConflict, SaveNotice, PadLost, RankedNotice, CrashPrompt, BugReport, DemoEnd, EaProgress, Loading) + trạng thái Leaderboard (§6.13) | 42 §1.2, 19 §5.6/§6.2, 41 §4, 43 §3, §4, §7.3, §8.1, §15, 50 §5.3, 60 PV01/PV03/PV05/DV04/DM06–07 đòi màn mà danh mục chưa có |
| UI-12 · 2026-11-07 | Consent = 2 câu hỏi (telemetry không chọn sẵn, 2 nút ngang nhau; crash 3 nấc mặc định "Hỏi mỗi lần"), "Tiếp" khoá tới khi chọn khối 1, focus đầu = tiêu đề panel | 43 §15.1 + 60 PV01; bản cũ 1 câu, focus "Không" = gợi ý ngầm |
| UI-13 · 2026-11-07 | QuickSetup 6 dòng (Cỡ chữ · Tell mù màu · Phụ đề tell · Rung màn · Giảm chớp · Preset điều khiển), không phải 5 | 42 §1.2 bước 3 liệt kê 6 mục; 42 sở hữu option |
| UI-14 · 2026-11-07 | Giữ game.auto_pause_focus là option (mặc định bật, khoá bật trên Deck); §3.1 tạm dừng theo option; Deck suspend + tay cầm rời luôn tạm dừng | 42 §8 đã có khoá này; 43 §8.3 bắt buộc trên Deck (suspend) — PC cửa sổ được chọn chạy nền |
| UI-15 · 2026-11-07 | Khối HUD MODE (343, 44, 80, 10); cột phải dời: MODS (311, 56) · OBJECTIVE (311, 68) · TOAST (295, 100, 128, 24) | MODE cần ngay dưới đồng hồ RUN; TOAST cũ (283, 90, 140) chạm vùng cấm HUD x ≤ 293 |
| UI-16 · 2026-11-07 | Tab Cài đặt "Dữ liệu" đổi tên "Dữ liệu & quyền riêng tư"; "Xoá toàn bộ tiến trình" giữ 2.0 s × 2 | 43 §15.1 gọi "Quyền riêng tư", 43 §7.3 "giữ nút 2 s" |
| UI-17 · 2026-11-07 | Màn tải Loading dùng shader InkWipe (không id VFX) + 1 dòng mẹo codex, chỉ hiện khi tải > 0.5 s | UI.json không có VFX_UI_* chuyển cảnh; tránh chớp màn tải cho tải ngắn |
| UI-18 · 2026-11-07 | LinchpinPick mở khi Lv ≥ 11 (không phải 12); công tắc "Trí nhớ xuyên run" = khoá game.cross_run_memory (tab Trò chơi, mặc định bật) | DEC-2026-11-07-14 (Lv 11) thắng bản cũ; khoá theo 42 §8 để mọi option Cài đặt có khoá lưu |