1Giới thiệu & bản đồ tài liệu
Mục đích: hợp đồng dữ liệu của toàn game: mọi file JSON trong GDD/Full/data/, mọi field (kiểu, đơn vị, giá trị cho phép, nghĩa, doc sở hữu luật), quy ước ID, tham chiếu chéo, quy ước chữ, ví dụ; cách chạy tools/validate.py. Phụ thuộc: 00-Design-Bible.md + data/_bible.json (canon ID §11, số lượng §6/§10.3); 10-Combat-Core (chỉ số, hitbox, dmg_kind, hit_class, STS_) · 11-Defense-Tells (tell, sàn windup) · 12-Hero-Framework (§8 mẫu hero, §9–§10 mechanic_key + lãnh thổ) · 13-Upgrades-Builds (§1.1 hợp đồng hàng nâng cấp) · 14-Adaptive-AI (đòn địch, CV) · 15-Horde-Director-Encounters (TP, wave script) · 16-Run-Structure-Map (bản đồ, nút) · 17-Economy-Balance (đường cong, kinh tế) · 30/31/32 (mẫu actor/tile/VFX/SFX/nhạc). Được dùng bởi: agent nội dung (điền JSON), build (JSON → Markdown, CSV cho Unity, HTML), tools/validate.py + CI, tools/balance_calc.py, loader Unity (Db), agent art/VFX/audio (dựng asset từ spec trong av/).
Mục lục chi tiết (## và ###)
- 0. Nguyên tắc
- 1. Bản đồ file
- 2. Quy ước ID (canon Bible §11; ID ASCII, bất biến sau ship, duy nhất toàn cục)
- 2.1 Bảng mẫu
- 2.2 Chủ AV (av/<OwnerId>.json) và tiền tố id media hợp lệ trong file
- 3. Quy ước chữ
- 4. Bảng field (sinh từ tools/schema/.schema.json; ★ = bắt buộc)
- 4.0 Khối dùng chung (common.schema.json#/$defs + def trong schema)
- 4.1 heroes/<Hxx>.json — hero.schema.json (luật: doc 12 §2, §8, §10.6 · 10 §2.1 · 11 §3)
- 4.2 hero_upgrades/<Hxx>.json — hero_upgrades.schema.json (luật: doc 13 §1.1, §5, §8, §9 · 12 §10)
- 4.3 shared_edges.json — shared_edges.schema.json (luật: doc 13 §5)
- 4.4 shared_resonances.json — shared_resonances.schema.json (luật: doc 13 §8)
- 4.5 relics.json — relics.schema.json (luật: doc 13 §10)
- 4.6 affixes.json — affixes.schema.json (luật: doc 13 §11)
- 4.7 mechanics.json — mechanics.schema.json (luật: doc 12 §9–§10)
- 4.8 tags.json — tags.schema.json (luật: doc 13 §5.7)
- 4.9 statuses.json — statuses.schema.json (luật: doc 10 §5)
- 4.10 enemies/<Bn>.json — enemies.schema.json (luật: doc 14 §2, §12 · 11 §1 · 15 §2.1 · 17 §5)
- 4.11 bosses/<BossId>.json — boss.schema.json (luật: doc 14 §6, §8.3, §9 · 11 · 17 §5.3)
- 4.12 elite_modifiers.json — elite_modifiers.schema.json (luật: doc 15 §7.2 · Bible §7.3)
- 4.13 av/<OwnerId>[__<part>].json — av.schema.json (luật: doc 30 §5.1, §6.4 · 31 §9 · 32 §4.2, §9)
- 4.14 biomes/<Bn>.json · biomes/HUB.json — biome.schema.json (luật: doc 15 §9 · 20 §4 · 30 §3.3, §6)
- 4.15 encounters.json — encounters.schema.json (luật: doc 15 §2–§13)
- 4.16 run_map.json — run_map.schema.json (luật: doc 16 §2–§6, §12)
- 4.17 events.json — events.schema.json (luật: doc 16 §3 · Bible §2)
- 4.18 mourning_bands.json — mourning_bands.schema.json (luật: doc 17 §7.1 · Bible §4)
- 4.19 mutators.json — mutators.schema.json (luật: doc 17 §7.2)
- 4.20 modes.json — modes.schema.json (luật: doc 16 §10 · Bible §4.1)
- 4.21 currencies.json — currencies.schema.json (luật: doc 17 §8, §10)
- 4.22 meta.json — meta.schema.json (luật: doc Bible §3 · 12 §2.7–2.8 · 17 §10)
- 4.23 npcs.json — npcs.schema.json (luật: doc 20 §8)
- 4.24 dialogue.json — dialogue.schema.json (luật: doc 20 · 32 §9)
- 4.25 endings.json — endings.schema.json (luật: doc Bible §7.6 · 16 §8.3)
- 4.26 codex.json — codex.schema.json (luật: doc 20 §9)
- 4.27 music.json — music.schema.json (luật: doc 32 §3.6–3.7)
- 4.28 achievements.json — achievements.schema.json (luật: doc Bible §11)
- 4.29 curves.json — curves.schema.json (luật: doc 17 §1–§9)
- 4.30 tuning.json — tuning.schema.json (luật: doc 13 §0 · 14 §16 · 15 §14 · 17 §11.2)
- 4.31 psp_axes.json — psp_axes.schema.json (luật: doc 14 §7)
- 5. Tham chiếu chéo (luật; validate.py --all kiểm)
- 6. tools/validate.py
- 7. Ví dụ gọn (1/thực thể; … = field bắt buộc khác lược bỏ; số = minh hoạ hình dạng, số thật ở file dữ liệu)
- 8. Render & ánh xạ CSV cho Unity (build đọc JSON, không ngược lại)
- Quy tắc cho dev/AI
- Quyết định đã chốt
20. Nguyên tắc
- JSON trong
GDD/Full/data/= nguồn sự thật duy nhất. Doc Markdown nội dung (doc hero, bestiary…), CSV cho Unity (hero_moves_<Hxx>.csv,enemy_attacks.csv,wave_scripts.csv,audio_sfx.csv…) và HTML là bản render; không sửa tay bản render. - Mỗi loại file có 1 schema
tools/schema/<name>.schema.json(JSON Schema draft 2020-12,additionalProperties: falseở mọi object có field cố định). Field mới = sửa schema + doc này cùng lượt + dòng Quyết định có ngày. - Thứ bậc khi lệch:
_bible.json(số/ID canon) > doc luật của khối (cột "luật" ở §4) > doc này (hình dạng dữ liệu). Doc này KHÔNG đặt số gameplay; số nằm trong file dữ liệu. - UTF-8 không BOM, LF, thụt 1–2 space; số dùng dấu chấm thập phân; không comment trong JSON (ghi chú → field
note_vi/note). [ASSUMED]→ fieldassumed: truetrên hàng (hoặcassumed_note_vi); núm chỉnh để ởtuning.json.
31. Bản đồ file
| File | Schema | Nội dung | Số lượng 1.0 | Doc luật |
|---|---|---|---|---|
_bible.json | — (canon, chỉ đọc) | ID + tên + số canon | 1 | 00 |
tuning.json | tuning | núm [ASSUMED]/canon theo section combat defense draft rarity shop relic affix caps director ai ash run economy meta mourning platform audio vfx + ai_archetypes + ash_spawn_shift | 1 | 13 §0, 14 §16, 15 §14, 17 §11.2 |
curves.json | curves | XP lên cấp kế CRV_xp_level Hệ số XP nhận theo Hồi CRV_xp_act_mult Chỉ số sức mạnh build theo phút CRV_power_index Nhân HP địch theo Hồi lệch gốc CRV_enemy_hp_act Nhân sát thương địch theo Hồi lệch gốc CRV_enemy_dmg_act Trọng số rarity draft theo may mắn CRV_rarity_luck Vàng Mã icon GOLD theo Hồi CRV_gold_room Điểm Thông Thạo lên hạng MR CRV_mastery_rank (+ Tốc nạp ngân sách đe doạ theo Hồi CRV_bps_act Đường cong pha mật độ trong phòng CRV_phase Nhân mật độ density_mult CRV_density) | ≥ 8 | 17 |
statuses.json · tags.json · psp_axes.json | cùng tên | 12 STS_ · 21 tag + sub-tag · 12 trục A01–A12 | 12 · 21 · 12 | 10 §5 · 13 §5.7 · 14 §7 |
currencies.json | currencies | 4 tiền tệ: nguồn, đích, mục tiêu, nhân mode | 4 | 17 §8, §10 |
mechanics.json | mechanics | 46 trigger, 186 primitive (lớp, chủ, dmg_kind, params), lãnh thổ 12 hero, vùng chồng O1–O10, trần lớp | 1 | 12 §9–§10 |
heroes/<Hxx>.json | hero | định danh, hình ảnh, chỉ số, tài nguyên, passive, input, phòng thủ, đòn, 8 kỹ năng, 3 ult, 3 Dạng Rèn, Thông Thạo, AV hero | 12 | 12 §8 |
hero_upgrades/<Hxx>.json | hero_upgrades | 40 Edge (E37–E40 Then Chốt), 6 Cộng Hưởng, 4 Tiến Hoá, mẫu câu TPL_ | 12 | 13 |
shared_edges.json · shared_resonances.json | cùng tên | SE001–SE072 (+ nhóm XG_SHARED_*) · SRS01–SRS11 | 72 · 11 | 13 §5, §8 |
relics.json · affixes.json | cùng tên | RL001–RL060 (RL049–060 Lời Nguyền) · AF01–AF24 + dải u + trọng số nhóm | 60 · 24 | 13 §10–§11 |
elite_modifiers.json | elite_modifiers | EM01–EM16 | 16 | Bible §7.3, 15 §7.2 |
enemies/<Bn>.json | enemies | quái thường EN_ + Tinh Anh EL_ của biome (B1–B4, B6) | 5 file, 39 con | 14, 11, 15 §2.1, 17 §5 |
bosses/<BossId>.json | boss | 7 mini MB_, 4 boss Hồi, Vua Dravos, Mũ Chuông BS_FINAL, Cái Lặng BS_TRUE | 13 | 14 §6–§9, 17 §5.3 |
av/<OwnerId>[__<part>].json | av | actor spec, env asset, vfx[], sfx[], barks[] của 1 chủ | 39 chủ (§2.2) | 30, 31, 32 |
biomes/<Bn>.json · biomes/HUB.json | biome | môi trường, palette, tile, prop, hazard, phòng, landmark, đạo cụ OBJ_, WS dùng, ambience, nhạc | 7 | 15 §9, 20, 30 §3.3/§6 |
encounters.json | encounters | 10–13 mục tiêu, 14 mẫu spawn, hồ sơ Director/biome, bảng TP, wave_scripts[] | 1 | 15 |
run_map.json | run_map | 6 Hồi, lưới, 11 loại nút, khuôn làn, tần suất con, bản đồ dự phòng, icon thưởng, giá Sạp, ngân sách HP | 1 | 16 |
events.json | events | EVT_<Bn>_nn | 40 | 16 §3, Bible §2 |
mourning_bands.json · mutators.json · modes.json | cùng tên | MRN01–15 (+ meta) · MUT01–12 · 5 mode | 15 · 12 · 5 | 17 §7, Bible §4 |
meta.json | meta | hub, 8 trạm, GD1–5, 30 UP_, LV01–06, nút mở khoá, Thông Thạo MR01–20/TT1–5, pool, cờ, kinh tế meta, mỹ phẩm | 1 | Bible §3, 12 §2.7–2.8, 17 §10 |
npcs.json · dialogue.json · endings.json · codex.json | cùng tên | 7 NPC + arc · dòng thoại DLG_ · 3 kết · trang CDX_ | 7 · — · 3 · ~120 | 20, 32 §9 |
music.json | music | cue MUS_ (18 + 4 bộ stem H12) + leitmotif LM_ | 22 | 32 §3 |
achievements.json | achievements | ACH_ | 60 | Bible §11 |
- File con: tên file = ID chủ (
heroes/H03.json,bosses/BS_B2.json,enemies/B4.json); validator soid/hero/biome/ownervới tên file. - Thư mục/tệp bắt đầu bằng
_(trừ_bible.json) bị bỏ qua (nháp).
42. Quy ước ID (canon Bible §11; ID ASCII, bất biến sau ship, duy nhất toàn cục)
2.1 Bảng mẫu
| Loại | Regex schema | Ví dụ |
|---|---|---|
| Hero · kỹ năng · ult · Dạng Rèn · passive | H\d{2} · H\d{2}_SK0[1-8] · H\d{2}_UL[1-3] · H\d{2}_AS[1-3] · H\d{2}_PASSIVE | Hàng Cọc Tro H01_SK03 |
Đòn hero (move_id) | H\d{2}_[A-Z][A-Z0-9_]* = <Hxx>_<SLOT>_<n> | A3 · COMBO_A H01_COMBO_A_3, DASH_STRIKE · DASH_ATTACK H01_DASH_ATTACK, SKILL1 · SKILL H01_SK01_HIT, ULT_BURST · ULT H01_UL1_BURST |
Đích Edge (params.target) | Hxx_MV_<alias|đuôi move_id> · Hxx_SKnn · Hxx_ULn · Hxx_ASn · VERB:<COMBO|FINISHER|ANSWER|HOLD|DASH|COUNTER|SKILL|ULT> · RES · SELF | H01_MV_A3 (alias), H01_MV_COMBO_A_3 |
| Edge hero · Edge chung | H\d{2}_E(01–40) · SE\d{3} | Quỹ Đạo Không Ngừng H05_E38, Than Trong Lưỡi SE049 |
| Cộng Hưởng · chung · Tiến Hoá | H\d{2}_RS[1-6] · SRS\d{2} · H\d{2}_EVO[1-4] | Ống Tên Đầy H07_RS5 |
| Relic · affix · trạng thái · tag | RL\d{3} · AF\d{2} · STS_[A-Z]+ · 21 tag (+ ANSWER:X, RES:X) | Nhẫn Chết Chung RL049, Ghim STS_PIN, RES:INK |
mechanic_key | ^[a-z_]+\.[a-z_]+$ hoặc ^MK_[A-Z_]+__[A-Z_]+$ (cùng 1 key, doc 12 §10) | skill.crescent_wave ≡ MK_SKILL__CRESCENT_WAVE |
| Nhóm loại trừ · mẫu câu | XG_(Hxx|SHARED)_[A-Z0-9_]+ · TPL_(Hxx|SHARED)_[a-z0-9_]+ | XG_H01_FINISHER_ZONE |
| Quái · Tinh Anh · mini · boss | EN_B\d_\d{2} · EL_B\d_\d{2} · MB_B\d_\d · BS_B[1-4], Vua Dravos, Mũ Chuông BS_FINAL, Cái Lặng BS_TRUE | Đấu Sĩ Cánh Quạ EL_B4_03 |
| Đòn địch · thế đáp | <enemyId>_A\d{2} · <enemyId>_CV[12] | Hồi Chuông Tang BS_B1_A02, EL_B2_01_CV1 |
| Ấn · Khăn Tang · mutator · sự kiện | EM\d{2} · MRN\d{2} · MUT\d{2} · EVT_B\d_\d{2} | Sạp Nổi Của Bà Mott EVT_B2_04 |
| Biome · phòng · hazard · landmark · env · đạo cụ | B[1-6]/HUB · RM_<B>_<slug> · HZ_<B>_<slug> · LMK_<B>_<slug> · ENV_<B>_<slug> · OBJ_<NAME> | Chuông Làng HZ_B1_bell, OBJ_BRAZIER |
| Kịch bản sóng · khuôn làn · bản đồ dự phòng | WS_<Bn>_<OBJ>_\d{2} · LN_<NAME> · MAP_FB_<act>_<n> | Thuỷ Triều: trụ qua 3 sóng 15 / 18 / 22 giây; mỗi sóng 3 giây đầu là nghỉ. WS_B1_TIDE_01 |
| Tiền tệ · NPC · trạm · Phục Dựng · nâng trạm · Lễ Vật | CUR_* · NPC_* · ST_* · GD[1-5] · UP_<ST>_<n> · LV\d{2} | Khuôn Đôi UP_FORGE_3 |
| Thông Thạo · thử thách · cờ · mốc · trục | MR\d{2} · TT[1-5] · FLAG_* · MS\d{2}b? · A\d{2} | Run sau mở B6 sau BS_FINAL (BS_TRUE). FLAG_SHORE_OPEN |
| VFX · SFX · bark | VFX_<ownerId>_<slug> · SFX_<ownerId>_<slug> · BARK_<ownerId>_<slug>; slug snake thường ≤ 24 | H01_UL1_BURST Trăng Máu pha 2 (clip ul1, 132 tick = 2.2 s, bất tử toà… VFX_H01_UL1_moon, EnemyWindupStart tellClass=Y → lịch PlayScheduled đỉnh transient đúng… SFX_SHARED_tell_y_tinh |
| Nhạc · leitmotif · thành tựu · kết | MUS_[a-z0-9_]+ · LM_* · ACH_[a-z0-9_]+ · END_[A-Z_]+ | EXPLORE/COMBAT · Hồi I B1 Đồi Mộ Tro · bản đồ + mọi nút CMB/ELT/CHL/RSC/EVT/SHP/RST/SEC c… MUS_b1_grave_hill |
| Thoại · codex · đường cong · skin · bia mộ | DLG_<SPEAKER>_<CTX>_\d{3} · CDX_[a-z0-9_]+ · CRV_[a-z0-9_]+ · SKN_Hxx_n · TMB_Hxx | Con lại thức rồi. DLG_ULLA_HUB_001 |
| Mỹ phẩm Thông Thạo (MR13/14/17/19/20) | FRAME_PORTRAIT_SILVER_Hxx · FRAME_CARD_Hxx · HEARTH_FLAME_LUT_Hxx · SUBTITLE_Hxx · TITLE_Hxx_MR20 (mẫu Hxx ở meta.json mastery.ranks[].unlock_ids; hero ghi Hxx thật trong heroes/<Hxx>.json mastery.mastery_unlocks) | FRAME_CARD_H04, TITLE_H04_MR20 |
2.2 Chủ AV (av/<OwnerId>.json) và tiền tố id media hợp lệ trong file
| Owner file | Tiền tố VFX_/SFX_/BARK_ được định nghĩa | Ghi chú |
|---|---|---|
| Varek H01…Ambrin H12 | <Hxx> (gồm <Hxx>_SKnn_…, <Hxx>_ULn_…, <Hxx>_EVOn_…) | hero + actor hero |
EN_B1…EN_B4, EN_B6 | EN_<Bn>, EL_<Bn> (gồm EN_B1_03_A01_…) | mọi quái thường + Tinh Anh biome |
MB_*, BS_* (13) | <BossId> | 1 file/boss |
ENV_B1…ENV_B6, ENV_HUB | <Bn>, ENV_<Bn>; HUB thêm HUB, ST_, NPC_ | tile/prop/hazard/ambience; actor NPC ở ENV_HUB |
SHARED | SHARED, STS_, EM, MUT, MRN | thư viện chung (doc 31 §11 74 VFX, doc 32 §8 57 SFX) |
UI | UI | âm UI 29 sự kiện + FX UI-world |
- Tách file:
av/H01__skills.json+av/H01__ult.json→ build gộp theo owner; id duy nhất trong owner;part= phần sau__.
53. Quy ước chữ
- Field chữ tiếng Việt kết thúc
_vi(UTF-8 có dấu); ID, khoá code, tên field: tiếng Anh ASCII. Ngoại lệ đã chốt:name(tên riêng hero, 1–2 âm tiết bịa),note(ghi chú CSV, không loc),text_vi(thoại). - Chữ thẻ/tooltip = mẫu câu có
{param}; mọi{name}phải là khoá trongparams/rule_params/ranks[].params/field số của chính object hoặc object cha, hoặc placeholder toàn cục:{hero} {boss} {enemy} {habit} {pct} {rank} {n} {value} {count} {stat} {biome} {name} {tag} {time} {score} {act} {do_tang} {resource} {player} {seconds} {kills}. Validator báo{x}không giải được. - Ngữ pháp mẫu câu thẻ: doc 13 §5.9 (≤ 2 mệnh đề, ≤ 80 ký tự/dòng, % nguyên, giây ≤ 2 chữ số thập phân, không khoảng số, không "có thể/đôi khi", không tên game/thương hiệu thật).
- Loc: build sinh khoá
<file>.<id>.<field>từ mọi_vi; chỉ dịch mẫu, không dịch câu đã thay số.name_loc_key/title_loc_keycủa hero ghi tường minh. - Cấm trong mọi chuỗi: tên game/studio/nhà phát hành/thương hiệu/nhân vật có thật và tên dịch nghĩa từ chúng (Bible §11; CI quét
banned_terms).
64. Bảng field (sinh từ tools/schema/.schema.json; ★ = bắt buộc)
Kiểu: string /regex/, number [min..max], [ item ] (min..max phần tử), map key → value, → def = khối dùng chung ở §4.0. Đơn vị theo hậu tố: _s giây · _t/_ticks tick 60 Hz · _px px sàn · _ms ms · _pct % · _hex #RRGGBB · _vi chữ tiếng Việt.
4.0 Khối dùng chung (common.schema.json#/$defs + def trong schema)
hero_move
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
move_id | string ^H\d{2}_[A-Z][A-Z0-9_]*$ | ★ | <Hxx>_<SLOT>_<n> |
alias | string ^[A-Z0-9_]+$ | tên ngắn để Edge nhắm Hxx_MV_<alias> (A3, DASH_STRIKE) | |
slot | COMBO_A · COMBO_B · HEAVY · DASH · DASH_ATTACK · ANSWER · HOLD · COUNTER · SKILL · ULT · ASPECT · ECHO_MOVE … (14) | ★ | slot kit doc 12 §2.1 |
owner_ref | string | kỹ năng/ult chứa đòn | |
name_vi | string | tên hiển thị tiếng Việt có dấu | |
anim | string ^[a-z][a-z0-9_]*$ | ★ | clip anim |
startup_t | integer [0..600] | ★ | tick khởi động |
active_t | integer [0..600] | ★ | tick hiệu lực |
recovery_t | integer [0..600] | ★ | tick hồi |
post_rate | number [0..3] | tốc follow-through | |
coef | number [0..] | ★ | sát thương = coef × POWER (doc 10 §3.2) |
dmg_kind | MELEE · PROJ · AREA · ZONE · DOT · PURE | ★ | MELEE/PROJ/AREA/ZONE/DOT/PURE |
hit_class | LIGHT · MEDIUM · HEAVY · SKILL · ANSWER · COUNTER · BROKEN · PERFECT_DODGE · ULT · HERO_HURT · DOT | ★ | hạng cú doc 10 §6.1 |
shape | → hero_shape (§4.0) | ★ | hình hitbox doc 10 §1.4 |
layers | ALL · GROUND · AIR | lớp trúng | |
max_targets | integer [1..128] | ★ | trần mục tiêu (48; ult 128) |
rehit_ticks | integer [0..600] | tick giữa 2 lần trúng cùng mục tiêu | |
hits_max | integer [1..60] | số nhịp tối đa | |
step | number [0..] | bước tiến px | |
step_max | number [0..] | bước tối đa px | |
lunge_px | number [0..320] | lao tới px | |
kb_px | number [0..] | đẩy lùi px | |
launch_s | number [0..2] | hất tung giây | |
pull | number [0..240] | kéo px/s (≤ 240) | |
poise_dmg | integer [0..] | ★ | Thế gây |
hitstop_s | number [0..0.12] | ★ | khựng khung (≤ 0.12) |
trauma | number [0..1] | ★ | rung màn 0–1 |
status | string ^STS_[A-Z]+:\d+(\.\d+)?$ | any | STS_X:giây hoặc null | |
execute_pct | number [0..1] | ngưỡng kết liễu | |
pierce | integer [0..] | xuyên | |
pierce_falloff | number [0..1] | giảm/lần xuyên | |
| proj_speed | number [0..] | tốc đạn px/s | |
proj_range | number [0..] | tầm đạn px | |
armor_tier | NONE · FIRM · HYPER · INVULN | ★ | NONE/FIRM/HYPER/INVULN trong startup+active |
invuln_ticks | [ integer [0..600] ] (2..2) | any | [từ, tới] tick bất tử | |
cancel_into | [ string ^(DASH|ANSWER|HOLD|SKILL|ULT|COMBO_A|COMBO_B|HEAVY|DASH_ATTACK|COUNTER|MOVE)@\d+$ ] (duy nhất theo ACTION) | ô nới thêm của ma trận huỷ doc 12 §3.2: ACTION@tick = từ tick (tính từ tick 0 của đòn) được huỷ sang ACTION; ACTION thuộc từ vựng đóng §4.0a; thiếu field / mảng rỗng = dùng nguyên ma trận mặc định doc 12 §3.2 (không có ô nới) | |
res_delta | number | thay đổi tài nguyên | |
flags | [ shieldbreak · crit · airborne · atk_speed_scales · charge_mark_n · finisher · pierce · launch · pull · execute · chain_answer… | ★ | cờ |
tags | [ string ^(COMBO|DASH|ANSWER|COUNTER|SKILL|ULT|RES|CRIT|VITAL|AREA|PROJ|ZONE|SUMMON|CHAIN|MOVE|STS_(EMBER|FROST|SHOCK|ROT|BIND|D… | | tag (21 tag HOA, sub-tag ANSWER:X, RES:X`) | ||
params | → params (§4.0) | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây | |
vfx_id | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | VFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult |
sfx_id | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | SFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult |
note_vi | string | ghi chú thiết kế | |
assumed | any | true = có số [ASSUMED] lượt đầu, playtest chỉnh |
§4.0a Từ vựng ACTION của cancel_into (đóng, 11 token; cột ma trận doc 12 §3.2)
| ACTION | Huỷ sang | Cột doc 12 §3.2 | Ghi chú |
|---|---|---|---|
DASH | Lướt | Lướt | mặc định đã "có" ở mọi pha đánh/kỹ năng (INV-06) → ghi lại chỉ khi đổi tick Lướt 2 / hậu Lướt |
ANSWER | ĐÁP | ĐÁP | mặc định đã "có" (INV-11) → như DASH |
HOLD | verb giữ của hero | verb giữ | |
SKILL | kỹ năng (mọi ô) | Kỹ năng | nới "sau 60%" sớm hơn |
ULT | ult | Ult | |
COMBO_A | cú kế / cú 1 chuỗi COMBO_A | Đánh (cú kế) | thay mọi token cũ COMBO, ATTACK |
COMBO_B | cú 1 chuỗi COMBO_B | Đánh (cú kế) | chỉ hero có slot COMBO_B |
HEAVY | bắt đầu nạp HEAVY | Đánh (cú kế) | thay token cũ STANCE, CHARGE (thế/nạp = slot HEAVY) |
DASH_ATTACK | đòn Lướt chém | Đánh (cú kế) | ngoài nhánh mặc định "Lướt → DASH_ATTACK" |
COUNTER | Phản | Đánh (cú kế) | ngoài cửa sổ Phản mặc định |
MOVE | đi | Đi | nới move_cancel_frac |
- Ngữ nghĩa:
ACTION@t= từ ticktcủa đòn (0 = tick đầu startup) tới hết recovery được huỷ sang ACTION;t ≤ startup_t + active_t + recovery_t; mỗi ACTION tối đa 1 lần/đòn. - Thiếu
cancel_intohoặc[]= ma trận mặc định doc 12 §3.2 nguyên vẹn (hợp lệ, không cần điền 12–13 đòn chỉ để lặp mặc định). Chỉ ghi ô nới (doc 12 §3.2: hero chỉ nới, không siết). - Validator (§6, nhóm hero): token ngoài 11 ACTION → ERROR; token cũ
COMBO/ATTACK/STANCE/CHARGE→ ERROR kèm gợi ý token mới; ACTION trùng trong 1 đòn → ERROR;tvượt tổng tick đòn → ERROR;COMBO_Bkhi hero không có slotCOMBO_B→ ERROR; ô trùng mặc định (vdDASH/ANSWERkhông đổi tick,SKILL@tvớit≥ mốc 60% recovery) → WARN "thừa".
hero_shape
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
shape | CIRCLE · ARC · RECT · LINE · RING · ELLIPSE · NONE · POINT | ★ | hình hitbox doc 10 §1.4 |
r | number [0..] | bán kính | |
r_in | number [0..] | bán kính trong | |
arc | number [0..360] | beat arc / độ cung | |
off_fwd | number | lệch trước px | |
off_side | number | lệch ngang px | |
len | number [0..] | dài px | |
w | number [0..] | rộng | |
p0 | [ number ] (2..2) | điểm neo 0 [x,y] | |
p1 | [ number ] (2..2) | tham số 1 | |
band | number [0..] | dày vòng px | |
rx | number [0..] | bán trục x | |
rz | number [0..] | bán trục z |
hitbox
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
shape | CIRCLE · ARC · RECT · LINE · RING · ELLIPSE · NONE | ★ | hình hitbox doc 10 §1.4 |
r | number [0..] | bán kính | |
r_in | number [0..] | bán kính trong | |
arc | number [0..360] | beat arc / độ cung | |
len | number [0..] | dài px | |
w | number [0..] | rộng | |
off_fwd | number | lệch trước px | |
off_side | number | lệch ngang px | |
off_back | number [0..] | lệch sau px | |
rx | number [0..] | bán trục x | |
rz | number [0..] | bán trục z | |
band | number [0..] | dày vòng px | |
r_start | number [0..] | bán kính đầu | |
r_speed | number [0..] | tốc lan px/s | |
gap_deg | number [0..360] | độ khe | |
gap_count | integer [0..] | số khe | |
layers | ALL · GROUND · AIRBORNE · FLYING | lớp trúng |
attack
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
id | string ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)_A\d{2}$ | ★ | ID duy nhất (mẫu ở §2) |
name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
kind | melee · lunge · projectile · aoe_self · aoe_front · ring · leap · summon · beam · cone · zone · line … (15) | ★ | loại (enum) |
tell | Y · P · N · NONE | ★ | Y vàng / P tím / N vùng / NONE (INV-02) |
beats | integer [1..8] | số nhịp Y×n | |
beat_gap_s | number [0.35..] | khe nhịp ≥ 0.35 | |
windup_s | number [0..] | ★ | windup (sàn doc 11 §1.2) |
active_s | number [0..] | ★ | hiệu lực (s) |
recovery_s | number [0..] | ★ | hồi sau đòn (s) |
dmg | number [0..] | ★ | sát thương ở Hồi gốc |
dmg_kind | MELEE · PROJ · AREA · ZONE · DOT · PURE | ★ | MELEE/PROJ/AREA/ZONE/DOT/PURE |
shape | → hitbox (§4.0) | ★ | hình hitbox doc 10 §1.4 |
r_min | number [0..] | ★ | cự ly dùng nhỏ nhất |
r_max | number [0..] | ★ | cự ly dùng lớn nhất |
angle_max | number [0..180] | góc lệch tối đa | |
cooldown_s | number [0..] | ★ | hồi chiêu (s) |
weights | [ number [0..] ] (1..3) | ★ | trọng số theo pha 1..3 |
phase_mask | [ integer [1..3] ] (1..3) | ★ | pha được dùng |
links | [ → link (§4.0) ] | chuỗi {to, p, gap_min, gap_max} | |
signature | any | đòn chữ ký | |
variant_of | string ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)_A\d{2}$ | đòn gốc của biến thể | |
adaptive_source | BASE · ASH | ★ | BASE/ASH (Bible §11) |
ash_default_vi | string | mặc định trung tính khi Tro Nhớ tắt | |
token | MELEE · PROJ · P_FLOOR · HEAVY · SIGNATURE · NONE | ★ | loại token tấn công INV-08 |
proj | object | khối đạn | |
proj.proj_cat | Y_REFLECT · Y_HEAVY · P | ★ | Y_REFLECT/Y_HEAVY/P (doc 11 §1.3) |
proj.speed | number [0..] | ★ | tốc px/s |
proj.radius | number [0..] | ★ | bán kính px |
proj.count | integer [1..] | ★ | số |
proj.spread_deg | number [0..360] | toả độ | |
proj.range | number [0..] | tầm px | |
proj.destructible | any | phá được 1 cú | |
proj.height_px | number [0..] | cao px | |
zone | object | vùng N | |
zone.tick_s | number [0.5..] | ★ | chu kỳ tick ≥ 0.5 |
zone.dmg_per_tick | number [0..4] | ★ | ≤ 4/tick |
zone.duration_s | number [0..] | ★ | thời lượng (s) |
zone.slow | number [0..1] | chậm 0–1 | |
summon | object | gọi quái | |
summon.enemy | string ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)$ | ★ | id quái |
summon.count | integer [1..] | ★ | số |
summon.cap | integer [1..] | ★ | trần |
summon.vortex_s | number [1.0..] | ★ | xoáy báo ≥ 1.0 s |
lunge_px | number [0..] | lao tới px | |
hero_kb_px | number [0..96] | đẩy hero ≤ 96 | |
hits_enemies | any | trúng cả quái | |
hyper | any | siêu giáp | |
chain_answer | string ^(NONE|BROKEN|STUN:\d+(\.\d+)?)$ | chuỗi ĐÁP: NONE/BROKEN/STUN:s | |
statuses | [ → status_apply (§4.0) ] | 12 trạng thái doc 10 §5 | |
anim | string ^[a-z0-9_]+$ | ★ | clip anim |
pose_vi | string | tư thế windup | |
desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} |
counter_hint_vi | string | gợi ý khắc chế | |
vfx | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | danh sách VFX id phát cùng hàng |
sfx | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | danh sách SFX id phát cùng hàng |
assumed | any | true = có số [ASSUMED] lượt đầu, playtest chỉnh | |
demo_id | string | id demo cũ (ánh xạ Bible §2.4) |
counter_variant
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
cv_id | string ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)_CV[12]$ | ★ | <ownerId>_CV1|2 |
layer | MICRO · MESO | ★ | MICRO/MESO |
adaptive_source | BASE · ASH | ★ | BASE/ASH (Bible §11) |
axis | string ^A(01\.(DEFLECT|HOLD|DASH)|0[2-9]|1[0-2])$ | ★ | trục |
dir | HIGH · LOW · LEFT · RIGHT · SIDE | ★ | HIGH/LOW/LEFT/RIGHT/SIDE |
thr_on | number [0.3..0.85] | ★ | ngưỡng bật |
thr_off | number [0.15..0.7] | ★ | = thr_on − 0.15 |
min_rooms | integer [0..3] | ★ | phòng tối thiểu |
effect_type | WEIGHT_MULT · UNLOCK_ATTACK · PARAM_MOD | ★ | WEIGHT_MULT/UNLOCK_ATTACK/PARAM_MOD |
targets | [ string ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)_A\d{2}$ ] (1..) | ★ | đòn bị đổi |
mult | map ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)_A\d{2}$ → number [0.25..3.0] | nhân trọng số | |
variant_attack | string ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)_A\d{2}$ | đòn biến thể mở | |
take_f | number [0.1..1.0] | tỉ lệ lấy | |
param | aim_lead_px · aim_offset_px · angle_offset_deg · windup_hold_s · chain_stop · link_order · extra_beat · step_px · payload · `weapon… | | tham số whitelist §12.2 | ||
lo | number/string | biên dưới | |
hi | number/string | biên trên | |
default | number/string | mặc định | |
phase_mask | [ integer [1..3] ] (1..3) | ★ | pha được dùng |
answers | [ DEFLECT · DASH · EXIT · BREAK_OBJECT · POISE_BREAK ] (2..) | ★ | ≥ 2 cách trả lời |
recover_add_s | number [0.15..0.5] | ★ | hồi thêm 0.15–0.50 |
feint | integer [0..1] | ★ | 1 = nhịp lừa (≤ 0.35 s) |
habit_vi | string | ★ | thói quen bị đọc |
hint_vi | string | ★ | gợi ý |
bark_vi | string ≤ 64 ký tự | ★ | bark ≤ 64 ký tự |
budget_cost | integer [0..1] | ★ | ASH 1 / BASE 0 |
scar_ok | integer [0..1] | ★ | cho Sẹo |
codex | string ^CDX_[a-z0-9_]+$ | ★ | trang Sổ Tang CDX_* |
variant_clip | any | cần clip mới |
status_apply
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
status | string ^STS_[A-Z]+$ | ★ | STS_X:giây hoặc null |
duration_s | number [0..] | thời lượng (s) | |
stacks | integer [1..3] | lớp | |
chance | number [0..1] | xác suất 0–1 | |
mass_override | string | ghi đè theo hạng |
condition
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
kind | string | ★ | loại (enum) |
ref | string | id được trỏ | |
op | >= · <= · == · > · < · != | phép so sánh | |
value | number/string/boolean | giá trị | |
note_vi | string | ghi chú thiết kế (không chứa điều kiện máy đọc) | |
and | [ → condition ] (1..6) | điều kiện phụ, TẤT CẢ phải đúng cùng điều kiện chính (AND, doc 21 §2.3); được lồng |
link
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
to | string ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)_A\d{2}$ | ★ | đòn kế |
p | number [0..1] | ★ | xác suất |
gap_min | number [0.35..] | ★ | khe min ≥ 0.35 |
gap_max | number [0.35..] | ★ | khe max |
cond | string | điều kiện chuỗi |
edge_params
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
target | string `^(H\d{2}_MV_[A-Z0-9_]+|H\d{2}_SK0[1-8]|H\d{2}_UL[1-3]|H\d{2}_AS[1-3]|VERB:(COMBO|FINISHER|ANSWER|HOLD|DASH|COUNTER|SKILL|ULT)|RES… | | đích Edge doc 13 §5.4 | ||
offer_requires | string ^(EDGE:H\d{2}_E\d{2}|SKILL:H\d{2}_SK0[1-8]|UL:H\d{2}_UL[1-3]|AS:H\d{2}_AS[1-3]|RS[12]:(H\d{2}_RS[1-6]|SRS\d{2})|LV:\d{1,2})$ | điều kiện có mặt (1) | |
offer_excl | string ^XG_(H\d{2}|SHARED)_[A-Z0-9_]+$ | nhóm loại trừ XG_* | |
icd_s | number [0..] | hồi nội trigger | |
proc_from_proc | any | kích bởi đòn sinh từ nâng cấp | |
tpl | string ^TPL_(H\d{2}|SHARED)_[a-z0-9_]+$ | id mẫu câu CUSTOM_HOOK | |
kill_class | S · M+ | S hoặc M+ |
shared_edge
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa | ||
|---|---|---|---|---|---|
name_vi | string | ★ | tên hiển thị tiếng Việt có dấu | ||
tags | [ string ^(COMBO|DASH|ANSWER|COUNTER|SKILL|ULT|RES|CRIT|VITAL|AREA|PROJ|ZONE|SUMMON|CHAIN|MOVE|STS_(EMBER|FROST|SHOCK|ROT|BIND|D… | ★ | tag (21 tag HOA, sub-tag ANSWER:X, RES:X`) | ||||
rarity | COMMON · RARE · EPIC · LEGENDARY · CURSED | ★ | COMMON/RARE/EPIC/LEGENDARY/CURSED (doc 13 §5.1) | ||
max_rank | integer [1..3] | ★ | hạng tối đa theo rarity | ||
trigger | PASSIVE · ON_HIT · ON_CRIT · ON_KILL · ON_ANSWER · ON_PERFECT_DODGE · ON_DASH · ON_COUNTER · ON_HOLD_START · ON_HOLD_BLOCK · `ON_… | ★ | trigger thẻ doc 13 §5.9 (PASSIVE, ON_HIT…) | ||||
action | STAT · SPAWN_PROJ · SPAWN_ZONE · BLAST · APPLY_STATUS · MODIFY_MOVE · RESOURCE · ULT_GAUGE · HEAL · SHIELD · COOLDOWN · DRAFT… | ★ | hành động doc 13 §5.9 | ||
stat | HP_MAX · MOVE_SPEED · ACCEL_TIME · POWER · DMG_INC · ATK_SPEED · CRIT_CHANCE · CRIT_MULT · AREA · PROJ_SPEED · DURATION · CDR… | chỉ số hero_stats | |||
stat_mode | FLAT · INC · MORE · NONE | ★ | FLAT/INC/MORE/NONE | ||
params | → edge_params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây | ||
desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} | ||
mechanic | string ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$ | [ string ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$ ] (2..2) | ★ | mechanic_key của hàng; Then Chốt = mảng 2 key | ||
unlock_rank | string ^MR\d{2}$ | bậc mở pool | |||
pool_start | any | ★ | sẵn trong pool | ||
unlock_cost | → cost (§4.0) | ★ | giá mở Chợ Đò | ||
demo_id | string ^E\d{2}$ | id demo cũ (ánh xạ Bible §2.4) | |||
icon | string | tên sprite icon icon_<slug> | |||
vfx_id | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | VFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult | |||
sfx_id | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | SFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult | |||
assumed | any | true = có số [ASSUMED] lượt đầu, playtest chỉnh | |||
id | string ^SE\d{3}$ | ★ | ID duy nhất (mẫu ở §2) | ||
owner | = "SHARED" | ★ | chủ của hàng (Hxx | SHARED | owner AV) |
hook | string ^SHARED\.[a-z][a-z0-9_]*$ | ★ | EventName phát / hook nâng cấp | ||
status | string ^STS_[A-Z]+$ | STS_X:giây hoặc null |
Kiểu vô hướng dùng chung: ach_id string ^ACH_[a-z0-9_]+$ · act_key I · II · III · IV · V · VI · action STAT · SPAWN_PROJ · SPAWN_ZONE · BLAST · APPLY_STATUS · MODIFY_MOVE · RESOURCE · ULT_GAUGE · HEAL · … · adaptive_source BASE · ASH · affix_id string ^AF\d{2}$ · ai_archetype swarm_melee · lunger · ranged_kiter · ranged_lead · shield_bearer · bomber_self · ambusher · stationary… · aspect_id string ^H\d{2}_AS[1-3]$ · attack_id string ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)_A\d{2}$ · av_owner string ^(H\d{2}|EN_B[1-6]|ENV_(B[1-6]|HUB)|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE|SHARED|UI)$ · axis_id string ^A\d{2}$ · bark_id string ^BARK_[A-Z][A-Z0-9_]?_[a-z0-9][a-z0-9_]$ · biome_id string ^B[1-6]$ · boss_id string ^(BS_B[1-4]|BS_FINAL|BS_TRUE|MB_B[1-6]_\d)$ · clip_name string ^[a-z][a-z0-9_]$ · codex_id string ^CDX_[a-z0-9_]+$ · currency_id string ^CUR_[A-Z_]+$ · curve_id string ^CRV_[a-z0-9_]+$ · cv_id string ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)_CV[12]$ · dlg_id string ^DLG_[A-Z0-9_]+_\d{3}$ · dmg_kind MELEE · PROJ · AREA · ZONE · DOT · PURE · doc_ref string · edge_target string ^(H\d{2}_MV_[A-Z0-9_]+|H\d{2}_SK0[1-8]|H\d{2}_UL[1-3]|H\d{2}_AS[1-3]|VERB:(COMBO|FINISHER|ANSWER|HOLD|D… · elite_id string ^EL_B[1-6]_\d{2}$ · em_id string ^EM\d{2}$ · enc_id string ^ENC_(B[1-6]|HUB)_[a-z0-9_]+$ · end_id string ^END_[A-Z_]+$ · enemy_any_id string ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)$ · enemy_stat HP · MOVE_SPEED · RADIUS · MASS · ARMOR · POISE · POISE_REGEN · POISE_DELAY · BROKEN_TIME · BROKEN_M… · env_id string ^ENV_(B[1-6]|HUB)_[a-z0-9_]+$ · event_id string ^EVT_B[1-6]_\d{2}$ · evo_id string ^H\d{2}_EVO[1-4]$ · excl_group string ^XG_(H\d{2}|SHARED)_[A-Z0-9_]+$ · flag_id string ^FLAG_[A-Z_]+$ · gd_id string ^GD[1-5]$ · hazard_id string ^HZ_B[1-6]_[a-z0-9_]+$ · hero_edge_id string ^H\d{2}_E(0[1-9]|[1-3]\d|40)$ · hero_id string ^H\d{2}$ · hero_move_id string ^H\d{2}_[A-Z][A-Z0-9_]$ · hero_res_id string ^H\d{2}_RS[1-6]$ · hero_stat HP_MAX · MOVE_SPEED · ACCEL_TIME · POWER · DMG_INC · ATK_SPEED · CRIT_CHANCE · CRIT_MULT · AREA · PR… · hex string ^#[0-9a-fA-F]{6}$ · hit_class LIGHT · MEDIUM · HEAVY · SKILL · ANSWER · COUNTER · BROKEN · PERFECT_DODGE · ULT · HERO_HURT · DOT · inv_id string ^INV-\d{2}$ · landmark_id string ^LMK_(B[1-6]|HUB)_[a-z0-9_]+$ · lane_id string ^LN_[A-Z0-9_]+$ · lm_id string ^LM_[A-Z0-9_]+$ · lv_id string ^LV\d{2}$ · mapfb_id string ^MAP_FB_(I|II|III|IV|V|VI)_\d$ · mass_class S · M · L · XL · mini_id string ^MB_B[1-6]_\d$ · mk_id string ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$ · mode_id STANDARD · DAILY · ENDLESS · Đêm Hồi Chuông BOSS_RUSH · CUSTOM · mr_id string ^MR\d{2}$ · mrn_id string ^MRN\d{2}$ · ms_id string ^MS\d{2}b?$ · mus_id string ^MUS_[a-z0-9_]+$ · mut_id string ^MUT\d{2}$ · node_type CMB · ELT · CHL · EVT · SHP · RST · SEC · RSC · MBS · BOS · DOCK · normal_id string ^EN_B[1-6]_\d{2}$ · npc_id string ^NPC_[A-Z]+$ · objective PURGE · VIGIL · BELLS · TIDE · NEST · GAUNTLET · CHASE · DUEL · HUNT · RESCUE · BOSS · MINIBOSS… · offer_req string ^(EDGE:H\d{2}_E\d{2}|SKILL:H\d{2}_SK0[1-8]|UL:H\d{2}_UL[1-3]|AS:H\d{2}_AS[1-3]|RS[12]:(H\d{2}_RS[1-6]|SRS\… · primitive_id string ^[a-z][a-z_]$ · prop_id string ^OBJ_[A-Z0-9_]+$ · rarity COMMON · RARE · EPIC · LEGENDARY · CURSED · relic_id string ^RL\d{3}$ · res_key string ^(FLOW|NAIL|TOLL|INK|MOMENTUM|HEAT|BREATH|SHELL|KNOT|SMOKE|SOIL|BEAT)$ · rig biped · quadruped · flyer · serpent · construct_driver · swarm · room_id string ^RM_(B[1-6]|HUB)_[a-z0-9_]+$ · sfx_id string ^SFX_[A-Z][A-Z0-9_]?_[a-z0-9][a-z0-9_]*$ · shared_edge_id string ^SE\d{3}$ · shared_res_id string ^SRS\d{2}$ · skill_id string ^H\d{2}_SK0[1-8]$ · stat_mode FLAT · INC · MORE · NONE · station_id string ^ST_[A-Z_]+$ · status_id string ^STS_[A-Z]+$ · tag string ^(COMBO|DASH|ANSWER|COUNTER|SKILL|ULT|RES|CRIT|VITAL|AREA|PROJ|ZONE|SUMMON|CHAIN|MOVE|STS_(EMBER… · tell Y · P · N · NONE · text_vi string · tpl_id string ^TPL_(H\d{2}|SHARED)_[a-z0-9_]+$ · trigger PASSIVE · ON_HIT · ON_CRIT · ON_KILL · ON_ANSWER · ON_PERFECT_DODGE · ON_DASH · ON_COUNTER · ON_HOLD_S… · trigger12 passive · attack · combo_end · heavy · charge_mark · dash · dash_end · dash_through · dash_attack · … · tt_id string ^TT[1-5]$ · ult_id string ^H\d{2}_UL[1-3]$ · unl_id string ^UNL_[A-Z0-9_]+$ · up_id string ^UP_[A-Z_]+_\d$ · vfx_id string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ · ws_id string `^WS_(B[1-6])_(PURGE|VIGIL|BELLS|TIDE|NEST|GAUNTLET|CHASE|DUEL|HUNT|RESCUE|BOSS|MINIBOSS|TRIAL)_\d{2…
4.1 heroes/<Hxx>.json — hero.schema.json (luật: doc 12 §2, §8, §10.6 · 10 §2.1 · 11 §3)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
id | string ^H\d{2}$ | ★ | ID duy nhất (mẫu ở §2) |
identity | object | ★ | khối định danh doc 12 §8.1 |
identity.id | string ^H\d{2}$ | ★ | ID duy nhất (mẫu ở §2) |
identity.name | string ≤ 12 ký tự | ★ | tên riêng hiển thị (hero) |
identity.title_vi | string | ★ | danh hiệu |
identity.name_loc_key | string ^hero\.H\d{2}\.name$ | ★ | khoá loc tên hero.Hxx.name |
identity.title_loc_key | string ^hero\.H\d{2}\.title$ | ★ | khoá loc danh hiệu |
identity.weapon_class_vi | string | ★ | lớp vũ khí, duy nhất roster |
identity.role_group | MELEE_FAST · MELEE_HEAVY · REACH · CONTROL · RANGED · ZONE · RHYTHM_SUMMON | ★ | nhóm vai doc 12 §5 |
identity.difficulty | integer [1..5] | ★ | độ khó 1–5 = bậc của Σ trục (doc 12 §4) |
identity.difficulty_axes | object | ★ | 5 trục T/R/V/S/D, mỗi trục 0–2 |
identity.difficulty_axes.T | integer [0..2] | ★ | trục Thời điểm / trigger T |
identity.difficulty_axes.R | integer [0..2] | ★ | trục Tài nguyên |
identity.difficulty_axes.V | integer [0..2] | ★ | trục Vị trí |
identity.difficulty_axes.S | integer [0..2] | ★ | trục Số trạng thái / hạng S |
identity.difficulty_axes.D | integer [0..2] | ★ | trục Độ trễ |
identity.unlock | object | ★ | điều kiện + giá mở |
identity.unlock.condition_id | string ^(NONE|[A-Z][A-Z0-9_]*)$ | ★ | id điều kiện mở hero (NONE, KILL_BOSS…) |
identity.unlock.condition_params | → params (§4.0) | ★ | tham số điều kiện |
identity.unlock.condition_vi | string | điều kiện chữ | |
identity.unlock.echo_shard_cost | integer [0..16] | ★ | giá Mảnh Vọng (Bible §3.4) |
identity.milestone | string ^MS\d{2}b?$ | ★ | mốc ra mắt MSxx |
identity.pitch_vi | string ≤ 200 ký tự | ★ | 1 câu bán (≤ 200 ký tự) |
identity.lore_vi | string ≤ 600 ký tự | ★ | lore ngắn |
identity.verb_tags | [ string `^(COMBO|DASH|ANSWER|COUNTER|SKILL|ULT|RES|CRIT|VITAL|AREA|PROJ|ZONE|SUMMON|CHAIN|MOVE|STS_(EMBER|FROST|SHOCK|ROT|BIND|D… | ★ | 6 tag verb canon, thứ tự = RS1..RS6 và khối Edge | ||
identity.banned_terms_checked | any | ★ | CI quét từ cấm đạt |
visual | object | ★ | khối hình ảnh doc 12 §8.2 |
visual.slot_hex | string ^#[0-9a-fA-F]{6}$ | any | ★ | màu slot hero (INV-01b); null nếu vô sắc |
visual.slot_hue | number [0..359] | any | ★ | hue slot (độ) |
visual.achromatic | any | ★ | true chỉ H02 |
visual.palette_ramps | [ object ] (1..4) | ★ | ≤ 4 vật liệu × 4 tông (pixelfx defineCostume) |
visual.palette_ramps[].material | string ^[a-z_]+$ | ★ | tên vật liệu |
visual.palette_ramps[].hexes | [ string ^#[0-9a-fA-F]{6}$ ] (4..4) | ★ | 4 tông sáng → tối |
visual.art_lock_vi | string | ★ | điều cấm/bắt buộc art |
visual.sprite_height_px | integer [24..44] | ★ | cao sprite ≤ 44 |
visual.pixelfx_costume | string ^Tools/pixelfx/src/fx/heroes/_[a-z0-9_]+\.js$ | ★ | file costume pixelfx |
visual.code | string ^h\d{2}$|^[a-z0-9_]+$ | ★ | mã pixelfx/asset ASCII thường |
visual.clips | [ object ] (20..) | ★ | bộ clip anim |
visual.clips[].clip | string ^[a-z][a-z0-9_]*$ | ★ | tên clip |
visual.clips[].frames | integer [1..160] | ★ | số frame @30 |
visual.clips[].loop | any | ★ | lặp |
visual.clips[].hit_frames | [ integer [0..] ] | ★ | frame va chạm |
visual.clips[].dirs | 8 · 5+3 · 1 | ★ | hướng / số hướng |
visual.clips[].reuse_of | string ^[a-z][a-z0-9_]*$ | clip gốc dùng lại | |
visual.portrait | object | ★ | chân dung 64×64 bust + 96×128 thân |
visual.portrait.bust | [ integer [1..] ] (2..2) | ★ | cỡ bust [w,h] |
visual.portrait.body | [ integer [1..] ] (2..2) | ★ | cỡ thân [w,h] |
visual.portrait.rim_hex | string ^#[0-9a-fA-F]{6}$ | viền slot | |
visual.foot_ring | object | ★ | vòng chân (INV-09) |
visual.foot_ring.r_px | integer [4..24] | ★ | bán kính px |
visual.foot_ring.hex | string ^#[0-9a-fA-F]{6}$ | ★ | màu |
visual.skins | [ object ] (4..4) | ★ | 3 skin Nến Canh + skin ngà MR20 |
visual.skins[].id | string ^SKN_H\d{2}_\d$ | ★ | ID duy nhất (mẫu ở §2) |
visual.skins[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
visual.skins[].lut | string | ★ | LUT palette (0 sheet mới) |
visual.skins[].unlock | object | ★ | điều kiện + giá mở |
visual.skins[].unlock.currency | string ^CUR_[A-Z_]+$ | tiền tệ | |
visual.skins[].unlock.cost | integer [0..] | giá: {CUR_*: số} | |
visual.skins[].unlock.mr | string ^MR\d{2}$ | bậc Thông Thạo | |
stats | object | ★ | chỉ số gốc hero_stats (doc 10 §2.1) |
stats.HP_MAX | number | ★ | chỉ số HP_MAX (doc 10 §2.1) |
stats.MOVE_SPEED | number | ★ | chỉ số MOVE_SPEED (doc 10 §2.1) |
stats.ACCEL_TIME | number | chỉ số ACCEL_TIME (doc 10 §2.1) | |
stats.POWER | number | chỉ số POWER (doc 10 §2.1) | |
stats.DMG_INC | number | chỉ số DMG_INC (doc 10 §2.1) | |
stats.ATK_SPEED | number | chỉ số ATK_SPEED (doc 10 §2.1) | |
stats.CRIT_CHANCE | number | chỉ số CRIT_CHANCE (doc 10 §2.1) | |
stats.CRIT_MULT | number | chỉ số CRIT_MULT (doc 10 §2.1) | |
stats.AREA | number | chỉ số AREA (doc 10 §2.1) | |
stats.PROJ_SPEED | number | chỉ số PROJ_SPEED (doc 10 §2.1) | |
stats.DURATION | number | chỉ số DURATION (doc 10 §2.1) | |
stats.CDR | number | chỉ số CDR (doc 10 §2.1) | |
stats.DASH_CHARGES | number | chỉ số DASH_CHARGES (doc 10 §2.1) | |
stats.DASH_RECHARGE | number | chỉ số DASH_RECHARGE (doc 10 §2.1) | |
stats.ANSWER_WINDOW | number | ★ | chỉ số ANSWER_WINDOW (doc 10 §2.1) |
stats.POISE_MAX | number | ★ | chỉ số POISE_MAX (doc 10 §2.1) |
stats.POISE_REGEN | number | chỉ số POISE_REGEN (doc 10 §2.1) | |
stats.DR | number | chỉ số DR (doc 10 §2.1) | |
stats.ELITE_DMG | number | chỉ số ELITE_DMG (doc 10 §2.1) | |
stats.STATUS_POWER | number | chỉ số STATUS_POWER (doc 10 §2.1) | |
stats.HEAL_MULT | number | chỉ số HEAL_MULT (doc 10 §2.1) | |
stats.PICKUP_R | number | chỉ số PICKUP_R (doc 10 §2.1) | |
stats.ULT_GAIN | number | chỉ số ULT_GAIN (doc 10 §2.1) | |
stats.RES_GAIN | number | chỉ số RES_GAIN (doc 10 §2.1) | |
stats.KNOCKBACK | number | chỉ số KNOCKBACK (doc 10 §2.1) | |
stats.SHIELD_CAP | number | chỉ số SHIELD_CAP (doc 10 §2.1) | |
stats.dash_px | number [72..96] | ★ | cự ly Lướt 72–96 |
resource | object | ★ | tài nguyên riêng doc 12 §2.2 |
resource.res_id | string ^(FLOW|NAIL|TOLL|INK|MOMENTUM|HEAT|BREATH|SHELL|KNOT|SMOKE|SOIL|BEAT)$ | ★ | khoá tài nguyên = hậu tố RES:<X> |
resource.res_name_vi | string | ★ | tên tài nguyên |
resource.res_kind | GAUGE · PIPS · ON_ENEMY · OBJECTS · CHAMBERS · CLOCK | ★ | GAUGE/PIPS/ON_ENEMY/OBJECTS/CHAMBERS/CLOCK |
resource.res_min | number | ★ | giá trị nhỏ nhất |
resource.res_max | number | ★ | giá trị lớn nhất |
resource.res_start | number | ★ | đầu run |
resource.gain | [ object ] (1..) | ★ | nguồn nạp {event, amount, cap_per_s} |
resource.gain[].event | passive · attack · combo_end · heavy · charge_mark · dash · dash_end · dash_through · dash_attack · perfect_dodge · answer · `a… | ★ | trigger doc 12 §9.2 | ||
resource.gain[].amount | number | ★ | lượng |
resource.gain[].cap_per_s | number [0..] | trần nạp/giây | |
resource.gain[].note_vi | string | ghi chú thiết kế | |
resource.spend | [ object ] | ★ | cách tiêu {action, cost, partial_ok} |
resource.spend[].action | string | ★ | hành động doc 13 §5.9 |
resource.spend[].cost | number [0..] | ★ | giá: {CUR_*: số} |
resource.spend[].partial_ok | any | ★ | false: thiếu → bản không thưởng/từ chối |
resource.spend[].note_vi | string | ghi chú thiết kế | |
resource.decay | object | any | ★ | giảm theo thời gian; null = không |
resource.on_hit_taken | number | ★ | mất khi trúng đòn Y/P |
resource.thresholds | [ object ] (0..3) | ★ | ≤ 3 mốc trạng thái |
resource.thresholds[].value | number | ★ | giá trị |
resource.thresholds[].state_id | string ^[A-Z][A-Z0-9_]*$ | ★ | id trạng thái mốc HOA |
resource.thresholds[].state_name_vi | string | ★ | tên mốc (Cuồng Lưu…) |
resource.thresholds[].enter_fx | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | VFX khi vào mốc | |
resource.thresholds[].effect_vi | string | ★ | hiệu ứng |
resource.thresholds[].params | → params (§4.0) | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây | |
resource.full_event | passive · attack · combo_end · heavy · charge_mark · dash · dash_end · dash_through · dash_attack · perfect_dodge · answer · `a… | ★ | trigger định nghĩa 'đầy' (TT2) | ||
resource.answer_gain | number | ★ | thưởng tài nguyên khi ĐÁP |
resource.pdodge_gain | number | ★ | thưởng khi Né Hoàn Hảo |
resource.ult_link | string | ★ | công thức nạp Dư Âm từ tài nguyên |
resource.hud | object | ★ | hiển thị HUD |
resource.hud.element | BAR · PIPS · ON_ENEMY · OBJECTS · CHAMBERS · CLOCK | ★ | loại HUD |
resource.hud.anchor | string | ★ | neo HUD |
resource.hud.world_cue | string/null | ★ | cue world-space ≤ 12 px; null = không |
passive | object | ★ | passive doc 12 §2.3 |
passive.id | string ^H\d{2}_PASSIVE$ | ★ | ID duy nhất (mẫu ở §2) |
passive.name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
passive.rule_params | → params (§4.0) | ★ | tham số luật passive |
passive.text_template_vi | string | ★ | mẫu chữ thẻ có {param} |
passive.ui_icon | string ^icon_[a-z0-9_]+$ | ★ | icon passive |
passive.mechanic_key | string ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$ | trigger.primitive (doc 12 §9) hoặc dạng MK_TRIGGER__PRIMITIVE | |
input_override | object | ★ | override input doc 12 §1.4 (chỉ field liệt kê) |
input_override.attack_hold_ticks | integer [9..30] | tick giữ ATTACK | |
input_override.attack_hold_action | AUTO_CHAIN · CHARGE · CHANNEL · STANCE · DIG · NONE | hành động giữ ATTACK | |
input_override.charge_marks | [ number [0..1.5] ] (0..3) | mốc nạp (s) tăng dần | |
input_override.charge_move_mult | number [0.5..0.8] | nhân tốc chạy khi nạp | |
input_override.place_min | number [24..260] | cự ly đặt nhỏ nhất px | |
input_override.place_default | number [24..260] | cự ly đặt mặc định | |
input_override.place_max | number [24..260] | cự ly đặt lớn nhất | |
input_override.aim_rotate_max | number [360..720] | tốc xoay ngắm °/s | |
input_override.skill_cast_mode | map ^H\d{2}_SK0[1-8]$ → TAP · HOLD | TAP/HOLD theo kỹ năng | |
input_override.rhythm_clock | any | máy nhịp (H12) | |
defense | object | ★ | phòng thủ doc 12 §8.5 + doc 11 §3 |
defense.answer | object | ★ | verb ĐÁP |
defense.answer.verb_name_vi | string | ★ | tên verb (Gạt…) |
defense.answer.window_s | number [0.14..0.24] | ★ | cửa sổ ĐÁP (0.14–0.24, INV-11) |
defense.answer.shape | → hero_shape (§4.0) | ★ | hình hitbox doc 10 §1.4 |
defense.answer.shape_params | → params (§4.0) | tham số hình | |
defense.answer.melee_result_vi | string | ★ | kết quả ĐÁP đòn cận chiến |
defense.answer.proj_result_vi | string | ★ | kết quả ĐÁP đạn |
defense.answer.poise_dmg_override | object | Thế gây theo hạng khi ĐÁP | |
defense.answer.poise_dmg_override.M | number [0..] | override khớp | |
defense.answer.poise_dmg_override.L | number [0..] | hạng L | |
defense.answer.poise_dmg_override.XL | number [0..] | chỉ số XL (doc 10 §2.1) | |
defense.answer.res_gain | number | ★ | tài nguyên nhận khi ĐÁP |
defense.answer.special_reward_vi | string | ★ | thưởng riêng |
defense.answer.needs_resource | = false | ★ | luôn false (INV-11) |
defense.answer.move_id | string ^H\d{2}_[A-Z][A-Z0-9_]*$ | ★ | <Hxx>_<SLOT>_<n> |
defense.answer.vfx_id | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | VFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult |
defense.answer.sfx_id | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | SFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult |
defense.hold | object | ★ | verb giữ (doc 11 §2.4) |
defense.hold.verb_name_vi | string | ★ | tên verb (Gạt…) |
defense.hold.mechanic | BLOCK_FRONT · WALL · LEAP · LINE_TRAP · ORBIT · BRACE · RETREAT · NET · PHASE · ANCHOR · AURA_SLOW · DIG … (13) | ★ | kiểu cơ chế của verb giữ (doc 11 §3, doc 12 §2.1) — enum, KHÔNG phải mechanic_key; validator không đối chiếu với mechanics.json |
defense.hold.cost_vi | string | ★ | giá verb giữ |
defense.hold.armor_tier | NONE · FIRM · HYPER · INVULN | ★ | NONE/FIRM/HYPER/INVULN trong startup+active |
defense.hold.move_mult | number [0..1] | ★ | nhân tốc chạy khi giữ |
defense.hold.max_s | number [0..] | ★ | giữ tối đa |
defense.hold.cooldown_s | number [0..] | ★ | hồi chiêu (s) |
defense.hold.p_result_vi | string | ★ | kết quả với đòn P |
defense.hold.move_id | string ^H\d{2}_[A-Z][A-Z0-9_]*$ | ★ | <Hxx>_<SLOT>_<n> |
defense.hold.params | → params (§4.0) | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây | |
defense.hold.vfx_id | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | VFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult |
defense.hold.sfx_id | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | SFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult |
defense.counter | object | ★ | đòn Phản (doc 11 §2.6) |
defense.counter.move_id | string ^H\d{2}_[A-Z][A-Z0-9_]*$ | ★ | <Hxx>_<SLOT>_<n> |
defense.counter.name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
defense.counter.shape | → hero_shape (§4.0) | ★ | hình hitbox doc 10 §1.4 |
defense.counter.lunge_px | number [0..320] | ★ | lao tới px |
defense.counter.damage_eq | number [162..198] | ★ | sát thương quy đổi 180 ±10% |
defense.dash | object | ★ | Lướt |
defense.dash.dash_px | number [72..96] | ★ | cự ly Lướt 72–96 |
defense.dash.anim | string ^[a-z][a-z0-9_]*$ | ★ | clip anim |
defense.dash.afterimage | any | ★ | có dư ảnh |
defense.dash.trail_vfx | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | ★ | VFX vệt Lướt |
defense.dash.sfx_id | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | SFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult |
defense.dash.move_id | string ^H\d{2}_[A-Z][A-Z0-9_]*$ | <Hxx>_<SLOT>_<n> | |
defense.mass_verb | object | any | ★ | verb theo hạng khối Bible §5.2; null H01/H07 |
moves | [ → hero_move (§4.0) ] (6..) | ★ | đòn (1 hàng/đòn hoặc nhịp, doc 12 §8.6) |
skills | [ object ] (8..8) | ★ | 8 kỹ năng SK01–SK08 |
skills[].id | string ^H\d{2}_SK0[1-8]$ | ★ | ID duy nhất (mẫu ở §2) |
skills[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
skills[].role | CLEAR · CONTROL · DUEL · TEMPO | ★ | vai |
skills[].unlock_mr | string ^MR\d{2}$ | ★ | bậc Thông Thạo mở |
skills[].cast_mode | TAP · HOLD | ★ | TAP/HOLD |
skills[].hold_max_s | number [0..1.5] | giữ tối đa ≤ 1.5 | |
skills[].cooldown_s | number [0..] | ★ | hồi chiêu (s) |
skills[].charges | integer [1..3] | lượt | |
skills[].res_cost | number [0..] | ★ | giá tài nguyên (0 = miễn phí) |
skills[].move_ids | [ string ^H\d{2}_[A-Z][A-Z0-9_]*$ ] (1..) | ★ | đòn thuộc khối (trỏ moves[]) |
skills[].ranks | [ object ] (3..3) | ★ | 3 hạng I/II/III {params, text_template_vi} |
skills[].ranks[].params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây |
skills[].ranks[].text_template_vi | string | ★ | mẫu chữ thẻ có {param} |
skills[].rank3_behavior_vi | string | ★ | đổi hành vi ở hạng III |
skills[].tags | [ string ^(COMBO|DASH|ANSWER|COUNTER|SKILL|ULT|RES|CRIT|VITAL|AREA|PROJ|ZONE|SUMMON|CHAIN|MOVE|STS_(EMBER|FROST|SHOCK|ROT|BIND|D… | ★ | tag (21 tag HOA, sub-tag ANSWER:X, RES:X`) | ||
skills[].mechanic_key | string ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$ | ★ | trigger.primitive (doc 12 §9) hoặc dạng MK_TRIGGER__PRIMITIVE |
skills[].icon | string ^icon_[a-z0-9_]+$ | ★ | tên sprite icon icon_<slug> |
skills[].shieldbreak | any | ★ | cờ phá khiên |
skills[].invuln_ticks | [ integer [0..600] ] (2..2) | any | [từ, tới] tick bất tử | |
skills[].vfx_id | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | VFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult |
skills[].sfx_id | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | SFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult |
skills[].assumed | any | true = có số [ASSUMED] lượt đầu, playtest chỉnh | |
ultimates | [ object ] (3..3) | ★ | 3 ult |
ultimates[].id | string ^H\d{2}_UL[1-3]$ | ★ | ID duy nhất (mẫu ở §2) |
ultimates[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
ultimates[].role | AREA · EXECUTE · TRANSFORM | ★ | vai |
ultimates[].unlock | object | ★ | điều kiện + giá mở |
ultimates[].unlock.mr | string ^MR\d{2}$ | bậc Thông Thạo | |
ultimates[].unlock.echo_shard | integer [0..] | Mảnh Vọng | |
ultimates[].invuln_ticks | [ integer [0..600] ] (2..2) | ★ | [từ, tới] tick bất tử |
ultimates[].duration_s | number [0..10] | ★ | thời lượng (s) |
ultimates[].move_ids | [ string ^H\d{2}_[A-Z][A-Z0-9_]*$ ] (1..) | ★ | đòn thuộc khối (trỏ moves[]) |
ultimates[].transform_overrides | map key → number/string/boolean/object/array | UL3: field đòn bị thay | |
ultimates[].world_slow | number [0..1] | ★ | nhân tốc thế giới khi kích |
ultimates[].mechanic_key | string ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$ | ★ | trigger.primitive (doc 12 §9) hoặc dạng MK_TRIGGER__PRIMITIVE |
ultimates[].text_template_vi | string | ★ | mẫu chữ thẻ có {param} |
ultimates[].params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây |
ultimates[].icon | string ^icon_[a-z0-9_]+$ | tên sprite icon icon_<slug> | |
ultimates[].stinger | string ^MUS_[a-z0-9_]+$ | nhạc stinger | |
ultimates[].vfx_id | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | VFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult |
ultimates[].sfx_id | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | SFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult |
ultimates[].assumed | any | true = có số [ASSUMED] lượt đầu, playtest chỉnh | |
aspects | [ object ] (3..3) | ★ | 3 Dạng Rèn |
aspects[].id | string ^H\d{2}_AS[1-3]$ | ★ | ID duy nhất (mẫu ở §2) |
aspects[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
aspects[].weapon_layer | string ^[a-z0-9_]+$ | ★ | lớp vũ khí pixelfx --weapon |
aspects[].combo_params | object | ★ | tempo_mult/arc_add/range_add |
aspects[].combo_params.tempo_mult | number [0.5..1.5] | ★ | nhân nhịp combo |
aspects[].combo_params.arc_add | number [-90..90] | ★ | +độ cung |
aspects[].combo_params.range_add | number [-48..48] | ★ | +px tầm |
aspects[].res_rule_override | object | any | ★ | đổi đúng 1 field tài nguyên; AS1 null |
aspects[].new_clip | string ^[a-z][a-z0-9_]*$ | any | ★ | ≤ 1 clip mới |
aspects[].hue_shift | number [-4..4] | ★ | lệch hue ±4° |
aspects[].unlock | object | ★ | điều kiện + giá mở |
aspects[].unlock.echo_shard | integer [0..] | ★ | Mảnh Vọng |
aspects[].difficulty_axis_delta | object | any | ★ | đổi ≤ 1 điểm 1 trục |
aspects[].mechanic_key | string ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$ | any | ★ | trigger.primitive (doc 12 §9) hoặc dạng MK_TRIGGER__PRIMITIVE |
aspects[].text_template_vi | string | ★ | mẫu chữ thẻ có {param} |
aspects[].params | → params (§4.0) | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây | |
aspects[].move_ids | [ string ^H\d{2}_[A-Z][A-Z0-9_]*$ ] | đòn thuộc khối (trỏ moves[]) | |
aspects[].icon | string ^icon_[a-z0-9_]+$ | tên sprite icon icon_<slug> | |
aspects[].vfx_id | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | any | VFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult | |
aspects[].sfx_id | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | any | SFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult | |
mastery | object | ★ | Thông Thạo |
mastery.mastery_unlocks | map ^MR\d{2}$ → [ string ] | ★ | MRxx → id mở |
mastery.tt_params | object | ★ | số riêng TT1–TT5 |
mastery.tt_params.TT1 | → params (§4.0) | số TT1 (ĐÁP 30 tell vàng) | |
mastery.tt_params.TT2 | → params (§4.0) | số TT2 (full_event 10 lần) | |
mastery.tt_params.TT3 | → params (§4.0) | số TT3 | |
mastery.tt_params.TT4 | → params (§4.0) | số TT4 | |
mastery.tt_params.TT5 | → params (§4.0) | số TT5 | |
mastery.mr11_beat_id | string ^DLG_[A-Z0-9_]+_\d{3}$ | ★ | thoại MR11 |
mastery.mr15_beat_id | string ^DLG_[A-Z0-9_]+_\d{3}$ | ★ | thoại MR15 |
mastery.tombstone_id | string ^TMB_H\d{2}(_[a-z0-9_]+)?$ | ★ | bia mộ riêng |
mastery.title_mr20_vi | string | ★ | danh hiệu MR20 |
av | object | ★ | khối AV hero doc 12 §8.10 |
av.vfx_list | [ object ] (1..) | ★ | 41 sheet {id, kind, template_src} |
av.vfx_list[].id | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | ★ | ID duy nhất (mẫu ở §2) |
av.vfx_list[].kind | SIGNATURE · TEMPLATE · LIBRARY | ★ | loại (enum) |
av.vfx_list[].template_src | string | sheet gốc template | |
av.sfx_list | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | 28 SFX của hero |
av.music_stem | string ^MUS_[a-z0-9_]+$ | any | ★ | chỉ H12 |
av.echo_move | object | ★ | đòn Vọng BS_TRUE P3 |
av.echo_move.move_id | string ^H\d{2}_[A-Z][A-Z0-9_]*$ | ★ | <Hxx>_<SLOT>_<n> |
av.echo_move.shader_id | string ^SHD_[a-z0-9_]+$ | ★ | shader |
av.codex_page_ids | [ string ^CDX_[a-z0-9_]+$ ] (1..) | ★ | trang Sổ Tang |
av.test_yard | object | ★ | Sân Tập |
av.test_yard.dps_dummy_preset | string | ★ | preset hình nộm |
av.test_yard.tell_drill_ids | [ string ] (1..) | ★ | bài tập tell |
av.checklist | map ^(HF|DU)-0[1-8]$ → boolean/string | ★ | HF-01..08, DU-01..08 |
av.refs | object | ★ | đường dẫn tham chiếu |
av.refs.pixelfx | string | record pixelfx | |
av.refs.doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
av.refs.art_review | string | ảnh duyệt | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
assumed_note_vi | string | ghi chú số [ASSUMED] |
4.2 hero_upgrades/<Hxx>.json — hero_upgrades.schema.json (luật: doc 13 §1.1, §5, §8, §9 · 12 §10)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa | ||
|---|---|---|---|---|---|
hero | string ^H\d{2}$ | ★ | hero chủ | ||
edges | [ object ] (40..40) | ★ | Edge | ||
edges[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu | ||
edges[].tags | [ string ^(COMBO|DASH|ANSWER|COUNTER|SKILL|ULT|RES|CRIT|VITAL|AREA|PROJ|ZONE|SUMMON|CHAIN|MOVE|STS_(EMBER|FROST|SHOCK|ROT|BIND|D… | ★ | tag (21 tag HOA, sub-tag ANSWER:X, RES:X`) | ||||
edges[].rarity | COMMON · RARE · EPIC · LEGENDARY · CURSED | ★ | COMMON/RARE/EPIC/LEGENDARY/CURSED (doc 13 §5.1) | ||
edges[].max_rank | integer [1..3] | ★ | hạng tối đa theo rarity | ||
edges[].trigger | PASSIVE · ON_HIT · ON_CRIT · ON_KILL · ON_ANSWER · ON_PERFECT_DODGE · ON_DASH · ON_COUNTER · ON_HOLD_START · ON_HOLD_BLOCK · `ON_… | ★ | trigger thẻ doc 13 §5.9 (PASSIVE, ON_HIT…) | ||||
edges[].action | STAT · SPAWN_PROJ · SPAWN_ZONE · BLAST · APPLY_STATUS · MODIFY_MOVE · RESOURCE · ULT_GAUGE · HEAL · SHIELD · COOLDOWN · DRAFT… | ★ | hành động doc 13 §5.9 | ||
edges[].stat | HP_MAX · MOVE_SPEED · ACCEL_TIME · POWER · DMG_INC · ATK_SPEED · CRIT_CHANCE · CRIT_MULT · AREA · PROJ_SPEED · DURATION · CDR… | chỉ số hero_stats | |||
edges[].stat_mode | FLAT · INC · MORE · NONE | ★ | FLAT/INC/MORE/NONE | ||
edges[].params | → edge_params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây | ||
edges[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} | ||
edges[].mechanic | string ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$ | [ string ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$ ] (2..2) | ★ | mechanic_key của hàng; Then Chốt = mảng 2 key | ||
edges[].unlock_rank | string ^MR\d{2}$ | ★ | bậc mở pool | ||
edges[].pool_start | any | sẵn trong pool | |||
edges[].unlock_cost | → cost (§4.0) | giá mở Chợ Đò | |||
edges[].demo_id | string ^E\d{2}$ | id demo cũ (ánh xạ Bible §2.4) | |||
edges[].icon | string | tên sprite icon icon_<slug> | |||
edges[].vfx_id | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | VFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult | |||
edges[].sfx_id | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | SFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult | |||
edges[].assumed | any | true = có số [ASSUMED] lượt đầu, playtest chỉnh | |||
edges[].id | string ^H\d{2}_E(0[1-9]|[1-3]\d|40)$ | ★ | ID duy nhất (mẫu ở §2) | ||
edges[].owner | string ^H\d{2}$ | ★ | chủ của hàng (Hxx | SHARED | owner AV) |
edges[].linchpin | any | ★ | Then Chốt (E37–E40) | ||
edges[].hook | string ^H\d{2}\.[a-z][a-z0-9_]*$ | ★ | EventName phát / hook nâng cấp | ||
resonances | [ object ] (6..6) | ★ | Cộng Hưởng | ||
resonances[].id | string ^H\d{2}_RS[1-6]$ | ★ | ID duy nhất (mẫu ở §2) | ||
resonances[].owner | string ^H\d{2}$ | ★ | chủ của hàng (Hxx | SHARED | owner AV) |
resonances[].tag | string `^(COMBO|DASH|ANSWER|COUNTER|SKILL|ULT|RES|CRIT|VITAL|AREA|PROJ|ZONE|SUMMON|CHAIN|MOVE|STS_(EMBER|FROST|SHOCK|ROT|BIND|DRE… | ★ | 1 tag | ||||
resonances[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu | ||
resonances[].tier1 | object | ★ | bậc I (đếm ≥ 3) | ||
resonances[].tier1.at | integer [1..9] | ★ | giá trị trigger | ||
resonances[].tier1.desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} | ||
resonances[].tier1.params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây | ||
resonances[].tier1.action | STAT · SPAWN_PROJ · SPAWN_ZONE · BLAST · APPLY_STATUS · MODIFY_MOVE · RESOURCE · ULT_GAUGE · HEAL · SHIELD · COOLDOWN · DRAFT… | hành động doc 13 §5.9 | |||
resonances[].tier1.stat | HP_MAX · MOVE_SPEED · ACCEL_TIME · POWER · DMG_INC · ATK_SPEED · CRIT_CHANCE · CRIT_MULT · AREA · PROJ_SPEED · DURATION · CDR… | chỉ số hero_stats | |||
resonances[].tier1.stat_mode | FLAT · INC · MORE · NONE | FLAT/INC/MORE/NONE | |||
resonances[].tier2 | object | ★ | bậc II (đếm ≥ 5, đổi luật) | ||
resonances[].tier2.at | integer [1..9] | ★ | giá trị trigger | ||
resonances[].tier2.desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} | ||
resonances[].tier2.params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây | ||
resonances[].tier2.action | STAT · SPAWN_PROJ · SPAWN_ZONE · BLAST · APPLY_STATUS · MODIFY_MOVE · RESOURCE · ULT_GAUGE · HEAL · SHIELD · COOLDOWN · DRAFT… | hành động doc 13 §5.9 | |||
resonances[].tier2.stat | HP_MAX · MOVE_SPEED · ACCEL_TIME · POWER · DMG_INC · ATK_SPEED · CRIT_CHANCE · CRIT_MULT · AREA · PROJ_SPEED · DURATION · CDR… | chỉ số hero_stats | |||
resonances[].tier2.stat_mode | FLAT · INC · MORE · NONE | FLAT/INC/MORE/NONE | |||
resonances[].tier2.rule_change_vi | string | ★ | luật mới bậc II | ||
resonances[].mechanic | string ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$ | ★ | mechanic_key của hàng; Then Chốt = mảng 2 key | ||
resonances[].vfx_id | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | VFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult | |||
resonances[].sfx_id | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | SFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult | |||
evolutions | [ object ] (4..4) | ★ | Tiến Hoá EVO1–EVO4 | ||
evolutions[].id | string ^H\d{2}_EVO[1-4]$ | ★ | ID duy nhất (mẫu ở §2) | ||
evolutions[].owner | string ^H\d{2}$ | ★ | chủ của hàng (Hxx | SHARED | owner AV) |
evolutions[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu | ||
evolutions[].awakening | any | ★ | EVO4 Thức Tỉnh Vũ Khí | ||
evolutions[].requires_edges | [ string ^H\d{2}_E(0[1-9]|[1-3]\d|40)$ ] (0..2) | ★ | 2 Edge nguồn ở max | ||
evolutions[].requires_resonance2 | [ string ^H\d{2}_RS[1-6]$ ] (0..2) | ★ | RS bậc II cần (trống = bất kỳ 2) | ||
evolutions[].condition | object | ★ | điều kiện có cấu trúc {kind, ref, op, value} | ||
evolutions[].condition.kind | SKILL_RANK · RESONANCE · RELIC_COUNT · LEVEL · BOSS_KILLED | ★ | loại (enum) | ||
evolutions[].condition.ref | string | id được trỏ | |||
evolutions[].condition.value | number/string | ★ | giá trị | ||
evolutions[].condition.note_vi | string | ghi chú thiết kế | |||
evolutions[].unlock_rank | string ^MR\d{2}$ | ★ | bậc mở pool | ||
evolutions[].params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây | ||
evolutions[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} | ||
evolutions[].mechanic | string ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$ | ★ | mechanic_key của hàng; Then Chốt = mảng 2 key | ||
evolutions[].icon | string | tên sprite icon icon_<slug> | |||
evolutions[].vfx_id | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | VFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult | ||
evolutions[].sfx_id | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | SFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult | ||
templates | [ object ] | mẫu câu TPL_* dùng bởi CUSTOM_HOOK | |||
templates[].id | string ^TPL_(H\d{2}|SHARED)_[a-z0-9_]+$ | ★ | ID duy nhất (mẫu ở §2) | ||
templates[].text_vi | string | ★ | chữ | ||
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.3 shared_edges.json — shared_edges.schema.json (luật: doc 13 §5)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
edges | [ → shared_edge (§4.0) ] (72..72) | ★ | Edge |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
excl_groups | [ object ] (0..6) | nhóm loại trừ Edge chung | |
excl_groups[].id | string ^XG_SHARED_[A-Z0-9_]+$ | ★ | ID duy nhất (mẫu ở §2) |
excl_groups[].members | [ string ^SE\d{3}$ ] (2..3) | ★ | thành viên nhóm |
templates | [ object ] | mẫu câu TPL_* dùng bởi CUSTOM_HOOK | |
templates[].id | string ^TPL_(H\d{2}|SHARED)_[a-z0-9_]+$ | ★ | ID duy nhất (mẫu ở §2) |
templates[].text_vi | string | ★ | chữ |
4.4 shared_resonances.json — shared_resonances.schema.json (luật: doc 13 §8)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
resonances | [ object ] (11..11) | ★ | Cộng Hưởng |
resonances[].id | string ^SRS\d{2}$ | ★ | ID duy nhất (mẫu ở §2) |
resonances[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
resonances[].tags | [ string ^(COMBO|DASH|ANSWER|COUNTER|SKILL|ULT|RES|CRIT|VITAL|AREA|PROJ|ZONE|SUMMON|CHAIN|MOVE|STS_(EMBER|FROST|SHOCK|ROT|BIND|D… | ★ | tag (21 tag HOA, sub-tag ANSWER:X, RES:X`) | ||
resonances[].pair | any | ★ | cặp trạng thái |
resonances[].tier1 | object | ★ | bậc I (đếm ≥ 3) |
resonances[].tier1.at | integer [1..9] | ★ | giá trị trigger |
resonances[].tier1.desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} |
resonances[].tier1.params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây |
resonances[].tier2 | object | ★ | bậc II (đếm ≥ 5, đổi luật) |
resonances[].tier2.at | integer [1..9] | ★ | giá trị trigger |
resonances[].tier2.desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} |
resonances[].tier2.params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây |
resonances[].tier2.rule_change_vi | string | luật mới bậc II | |
resonances[].reaction_vi | string | phản ứng cặp | |
resonances[].mechanic | string ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$ | ★ | mechanic_key của hàng; Then Chốt = mảng 2 key |
resonances[].vfx_id | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | VFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult | |
resonances[].sfx_id | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | SFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.5 relics.json — relics.schema.json (luật: doc 13 §10)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
relics | [ object ] (60..60) | ★ | 60 Relic |
relics[].id | string ^RL\d{3}$ | ★ | ID duy nhất (mẫu ở §2) |
relics[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
relics[].rarity | COMMON · RARE · EPIC · CURSED | ★ | COMMON/RARE/EPIC/LEGENDARY/CURSED (doc 13 §5.1) |
relics[].cursed | any | ★ | Lời Nguyền |
relics[].system | ANSWER_HOLD · DASH_MOVE · COUNTER · SKILL · ULT · HEAL_SHIELD · STATUS · ECONOMY_DRAFT · RESOURCE | ★ | hệ chung mà luật đổi |
relics[].rule | object | ★ | luật {trigger, condition, action, stat, stat_mode, params, hook} |
relics[].rule.trigger | PASSIVE · ON_HIT · ON_CRIT · ON_KILL · ON_ANSWER · ON_PERFECT_DODGE · ON_DASH · ON_COUNTER · ON_HOLD_START · ON_HOLD_BLOCK · `ON_… | ★ | trigger thẻ doc 13 §5.9 (PASSIVE, ON_HIT…) | ||
relics[].rule.condition | → condition (§4.0) | điều kiện có cấu trúc {kind, ref, op, value} | |
relics[].rule.action | STAT · SPAWN_PROJ · SPAWN_ZONE · BLAST · APPLY_STATUS · MODIFY_MOVE · RESOURCE · ULT_GAUGE · HEAL · SHIELD · COOLDOWN · DRAFT… | ★ | hành động doc 13 §5.9 |
relics[].rule.stat | HP_MAX · MOVE_SPEED · ACCEL_TIME · POWER · DMG_INC · ATK_SPEED · CRIT_CHANCE · CRIT_MULT · AREA · PROJ_SPEED · DURATION · CDR… | chỉ số hero_stats | |
relics[].rule.stat_mode | FLAT · INC · MORE · NONE | ★ | FLAT/INC/MORE/NONE |
relics[].rule.params | → edge_params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây |
relics[].rule.hook | string ^SHARED\.[a-z][a-z0-9_]*$ | ★ | EventName phát / hook nâng cấp |
relics[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} |
relics[].drawback_vi | string | any | ★ | cái giá (bắt buộc RARE/EPIC/CURSED) |
relics[].affix_slots | = 2 | ★ | luôn 2 |
relics[].pool_start | any | ★ | sẵn trong pool |
relics[].unlock_cost | → cost (§4.0) | ★ | giá mở Chợ Đò |
relics[].unlock_after | string ^GD[1-5]$ | any | mục chỉ hiện sau GD2 | |
relics[].source_nodes | [ ELT · MBS · SHP · DOCK · SEC · Chuông Nhỏ LV06 ] (1..) | ★ | nút rơi |
relics[].demo_id | string ^R\d{2}$ | id demo cũ (ánh xạ Bible §2.4) | |
relics[].lore_vi | string | ★ | lore ngắn |
relics[].icon | string ^icon_[a-z0-9_]+$ | ★ | tên sprite icon icon_<slug> |
relics[].mechanic | string ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$ | ★ | mechanic_key của hàng; Then Chốt = mảng 2 key |
relics[].vfx_id | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | VFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult | |
relics[].sfx_id | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | SFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult | |
relics[].assumed | any | true = có số [ASSUMED] lượt đầu, playtest chỉnh | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.6 affixes.json — affixes.schema.json (luật: doc 13 §11)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
affixes | [ object ] (24..24) | ★ | 24 affix |
affixes[].id | string ^AF\d{2}$ | ★ | ID duy nhất (mẫu ở §2) |
affixes[].group | OFF · DEF · UTIL | ★ | cỡ nhóm [min,max] |
affixes[].stat | HP_MAX · MOVE_SPEED · ACCEL_TIME · POWER · DMG_INC · ATK_SPEED · CRIT_CHANCE · CRIT_MULT · AREA · PROJ_SPEED · DURATION · CDR… | ★ | chỉ số hero_stats |
affixes[].stat_mode | FLAT · INC | ★ | FLAT/INC/MORE/NONE |
affixes[].unit | % · pt% · HP · px · x · s · /s · pt | ★ | đơn vị hiển thị |
affixes[].min | number | ★ | biên dưới |
affixes[].max | number | ★ | biên trên |
affixes[].step | number [0.001..] | ★ | bước tiến px |
affixes[].condition | → condition (§4.0) | điều kiện có cấu trúc {kind, ref, op, value} | |
affixes[].condition_vi | string | điều kiện chữ | |
affixes[].hero_filter | NONE · HAS_PROJ_MOVE | ★ | lọc kit hero |
affixes[].excl_group | string ^[A-Z_]+$ | cùng nhóm stat ≤ 1/Relic | |
affixes[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} |
affixes[].demo_id | string ^X\d{2}$ | id demo cũ (ánh xạ Bible §2.4) | |
affixes[].mechanic | string ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$ | mechanic_key của hàng; Then Chốt = mảng 2 key | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
rarity_u | object | ★ | dải u theo rarity Relic |
rarity_u.COMMON | [ number [0..1] ] (2..2) | ★ | chỉ số COMMON (doc 10 §2.1) |
rarity_u.RARE | [ number [0..1] ] (2..2) | ★ | chỉ số RARE (doc 10 §2.1) |
rarity_u.EPIC | [ number [0..1] ] (2..2) | ★ | chỉ số EPIC (doc 10 §2.1) |
rarity_u.CURSED | [ number [0..1] ] (2..2) | ★ | chỉ số CURSED (doc 10 §2.1) |
group_weights | object | ★ | trọng số nhóm affix 1 |
group_weights.OFF | number [0..] | ★ | chỉ số OFF (doc 10 §2.1) |
group_weights.DEF | number [0..] | ★ | chỉ số DEF (doc 10 §2.1) |
group_weights.UTIL | number [0..] | ★ | chỉ số UTIL (doc 10 §2.1) |
4.7 mechanics.json — mechanics.schema.json (luật: doc 12 §9–§10)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa | ||
|---|---|---|---|---|---|
triggers | [ object ] (46..46) | ★ | 46 trigger doc 12 §9.2 | ||
triggers[].id | passive · attack · combo_end · heavy · charge_mark · dash · dash_end · dash_through · dash_attack · perfect_dodge · answer · `a… | ★ | ID duy nhất (mẫu ở §2) | ||||
triggers[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} | ||
primitives | [ object ] (186..) | ★ | công cụ pixelfx | ||
primitives[].id | string ^[a-z][a-z_]*$ | ★ | ID duy nhất (mẫu ở §2) | ||
primitives[].family | string ^F(0[1-9]|1[0-6])$ | ★ | họ F01–F16 | ||
primitives[].class | MECH · PARAM · RES · STS · SHARED · FRAME | ★ | hạng nội dung | ||
primitives[].owner | string ^H\d{2}$ | SHARED · ALL | ★ | chủ của hàng (Hxx | SHARED | owner AV) |
primitives[].exclusive | any | ★ | độc quyền | ||
primitives[].dmg_kind | MELEE · PROJ · AREA · ZONE · DOT · PURE | any | ★ | MELEE/PROJ/AREA/ZONE/DOT/PURE | ||
primitives[].params | [ string ^[a-z][a-z0-9_]*$ ] | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây | ||
primitives[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} | ||
territory | [ object ] (12..12) | ★ | lãnh thổ 12 hero | ||
territory[].hero | string ^H\d{2}$ | ★ | hero chủ | ||
territory[].owns | [ string ^[a-z][a-z_]*$ ] (10..) | ★ | primitive độc quyền | ||
territory[].sts_affinity | [ Than Hồng STS_EMBER · Sương Giá STS_FROST · Điện Giật STS_SHOCK · Mục Rữa STS_ROT · Trói STS_BIND · Khiếp STS_DREAD ] (2..2) | ★ | 2 trạng thái ái lực | ||
territory[].control_vi | string | ★ | khống chế canon | ||
territory[].dmg_kind_main | [ MELEE · PROJ · AREA · ZONE · DOT · PURE ] (1..2) | ★ | loại sát thương chính | ||
overlaps | [ object ] | ★ | vùng chồng O1–O10 | ||
overlaps[].id | string ^O\d{1,2}$ | ★ | ID duy nhất (mẫu ở §2) | ||
overlaps[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} | ||
overlaps[].heroes | [ string ] | hero liên quan | |||
limits | object | ★ | trần lớp | ||
limits.param_per_hero_max | integer [0..40] | ★ | PARAM ≤ 8 | ||
limits.frame_per_hero_max | integer [0..40] | ★ | FRAME ≤ 6 | ||
limits.sts_per_hero_max | integer [0..40] | ★ | STS ≤ 4 | ||
limits.mech_primitive_heroes_max | integer [1..12] | ★ | 1 primitive MECH ≤ n hero | ||
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.8 tags.json — tags.schema.json (luật: doc 13 §5.7)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
tags | [ object ] (21..21) | ★ | tag (21 tag HOA, sub-tag ANSWER:X, RES:X) |
tags[].id | COMBO · DASH · ANSWER · COUNTER · SKILL · ULT · RES · CRIT · VITAL · AREA · PROJ · ZONE … (21) | ★ | ID duy nhất (mẫu ở §2) |
tags[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
tags[].group | verb · effect · status | ★ | cỡ nhóm [min,max] |
tags[].demo_map | string | ánh xạ demo | |
tags[].glyph | string | ★ | sprite glyph HUD |
tags[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} |
sub_tags | [ object ] | ★ | sub-tag |
sub_tags[].id | string `^(COMBO|DASH|ANSWER|COUNTER|SKILL|ULT|RES|CRIT|VITAL|AREA|PROJ|ZONE|SUMMON|CHAIN|MOVE|STS_(EMBER|FROST|SHOCK|ROT|BIND|DRE… | ★ | ID duy nhất (mẫu ở §2) | ||
sub_tags[].parent | ANSWER · RES | ★ | tag cha |
sub_tags[].hero | string ^H\d{2}$ | ★ | hero chủ |
sub_tags[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.9 statuses.json — statuses.schema.json (luật: doc 10 §5)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
statuses | [ object ] (12..12) | ★ | 12 trạng thái doc 10 §5 |
statuses[].id | string ^STS_[A-Z]+$ | ★ | ID duy nhất (mẫu ở §2) |
statuses[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
statuses[].group | BUILD · CONTROL | ★ | cỡ nhóm [min,max] |
statuses[].effect_vi | string | ★ | hiệu ứng |
statuses[].stacking | none_refresh · stacks · longest · strongest | ★ | cộng dồn |
statuses[].max_stacks | integer [1..3] | ★ | lớp tối đa |
statuses[].duration_s | number [0..] | ★ | thời lượng (s) |
statuses[].tick_s | number [0..] | chu kỳ tick ≥ 0.5 | |
statuses[].by_mass | object | ★ | kết quả theo S/M/L/XL |
statuses[].by_mass.S | string | ★ | trục Số trạng thái / hạng S |
statuses[].by_mass.M | string | ★ | override khớp |
statuses[].by_mass.L | string | ★ | hạng L |
statuses[].by_mass.XL | string | ★ | chỉ số XL (doc 10 §2.1) |
statuses[].on_hero | any | ★ | gây lên hero được |
statuses[].cleanse_vi | string | giải trừ | |
statuses[].glyph | string | ★ | sprite glyph HUD |
statuses[].params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây |
statuses[].is_tag | any | ★ | là tag build |
statuses[].vfx | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] | danh sách VFX id phát cùng hàng | |
statuses[].sfx | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] | danh sách SFX id phát cùng hàng | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.10 enemies/<Bn>.json — enemies.schema.json (luật: doc 14 §2, §12 · 11 §1 · 15 §2.1 · 17 §5)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
biome | string ^B[1-6]$ | ★ | biome B1–B6/HUB |
av_owner | string ^(H\d{2}|EN_B[1-6]|ENV_(B[1-6]|HUB)|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE|SHARED|UI)$ | ★ | owner file AV |
enemies | [ object ] (1..) | ★ | quái thường + Tinh Anh của biome |
enemies[].id | string ^EN_B[1-6]_\d{2}$ | string ^EL_B[1-6]_\d{2}$ | ★ | ID duy nhất (mẫu ở §2) |
enemies[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
enemies[].name_en | string | tên làm việc ASCII (không hiển thị) | |
enemies[].class | normal · elite | ★ | hạng nội dung |
enemies[].tier | S · M | ★ | hạng khối S/M/L/XL |
enemies[].demo_id | string | id demo cũ (ánh xạ Bible §2.4) | |
enemies[].role_vi | string | ★ | vai Bible §7.2 |
enemies[].role_key | swarm · lunge · ranged · shield · self_destruct · bomber · dive_bomb · lead_shot · ambush · turret · flyer_slow · nest … (23) | ★ | khoá vai cho Đạo Diễn Tro |
enemies[].rig | biped · quadruped · flyer · serpent · construct_driver · swarm | ★ | rig Bible §7.7 |
enemies[].ai | swarm_melee · lunger · ranged_kiter · ranged_lead · shield_bearer · bomber_self · ambusher · stationary · flyer_swarm · `spawner_mo… | ★ | archetype AI doc 14 §2.2 | ||
enemies[].home_act | integer [1..6] | ★ | Hồi gốc (số soạn ở Hồi này, doc 17 §5.1) |
enemies[].stats | map enum → number [0..] | ★ | chỉ số gốc hero_stats (doc 10 §2.1) |
enemies[].ai_params | → params (§4.0) | tham số archetype | |
enemies[].attacks | [ → attack (§4.0) ] (1..) | ★ | đòn <enemyId>_Ann |
enemies[].adaptive | object | ★ | khối thích nghi |
enemies[].adaptive.source | BASE · ASH · MIXED | ★ | nguồn |
enemies[].adaptive.base_reactions_vi | [ string ] | phản ứng BASE | |
enemies[].adaptive.counters | [ → counter_variant (§4.0) ] (0..2) | ★ | thế đáp CV (doc 14 §12) |
enemies[].spawn | object | ★ | tham số Director |
enemies[].spawn.weight | number [0..] | ★ | trọng số cuộn |
enemies[].spawn.group | [ integer [1..] ] (2..2) | ★ | cỡ nhóm [min,max] |
enemies[].spawn.budget_cost | number [0..] | ASH 1 / BASE 0 | |
enemies[].spawn.tp | number [0..60] | ★ | điểm đe doạ doc 15 §2.1 |
enemies[].spawn.cap_group | SWARM · LUNGE · RANGED · SHIELD · BOMB · AMBUSH · STATIC · FLOCK · NEST · SUPPORT · ROLL · CHARGE … (21) | ★ | nhóm trần sống |
enemies[].spawn.cap_alive | integer [1..250] | any | ★ | trần sống/phòng; null = không |
enemies[].spawn.pair | any | cặp trạng thái | |
enemies[].spawn.script_only | any | chỉ kịch bản sinh | |
enemies[].spawn.min_act | integer [1..6] | Hồi sớm nhất | |
enemies[].spawn.nodes | [ CMB · ELT · CHL · EVT · SHP · RST · SEC · RSC · MBS · BOS · DOCK ] | ★ | nút xuất hiện |
enemies[].spawn.first_room_ok | any | được ở R1 | |
enemies[].spawn.spawn_style | ash_mark · emerge · drop · vortex | kiểu xuất hiện | |
enemies[].drops | object | ★ | rơi |
enemies[].drops.xp | number [0..] | ★ | XP |
enemies[].drops.soul_ash | number [0..] | ★ | Tro Hồn |
enemies[].drops.paper_gold | number [0..] | Vàng Mã | |
enemies[].drops.heal_orb_pct | number [0..1] | tỉ lệ cầu máu | |
enemies[].drops.echo_shard | integer [0..] | Mảnh Vọng | |
enemies[].drops.relic_choice | integer [0..3] | lựa Relic | |
enemies[].flags | [ shield_front · explode_on_death · destructible · flying · airborne_immune · priority_target · aura · nest · ambush · `reflect_bac… | | cờ | ||
enemies[].elite_modifier_slots | integer [0..1] | ô Ấn | |
enemies[].visual | object | ★ | khối hình ảnh doc 12 §8.2 |
enemies[].visual.height_px | integer [16..64] | ★ | cao px |
enemies[].visual.palette | [ string ^#[0-9a-fA-F]{6}$ ] (1..8) | ★ | ≤ 8–12 hex |
enemies[].visual.accent_hex | string ^#[0-9a-fA-F]{6}$ | màu nhấn | |
enemies[].visual.alt_accent | any | có mask ALT | |
enemies[].visual.code | string | ★ | mã pixelfx/asset ASCII thường |
enemies[].codex | string ^CDX_[a-z0-9_]+$ | ★ | trang Sổ Tang CDX_* |
enemies[].lore_vi | string | lore ngắn | |
enemies[].vfx | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | danh sách VFX id phát cùng hàng |
enemies[].sfx | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | danh sách SFX id phát cùng hàng |
enemies[].assumed | any | true = có số [ASSUMED] lượt đầu, playtest chỉnh | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.11 bosses/<BossId>.json — boss.schema.json (luật: doc 14 §6, §8.3, §9 · 11 · 17 §5.3)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
id | string ^(BS_B[1-4]|BS_FINAL|BS_TRUE|MB_B[1-6]_\d)$ | ★ | ID duy nhất (mẫu ở §2) |
name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
name_en | string | tên làm việc ASCII (không hiển thị) | |
class | miniboss · boss · final · true_final | ★ | hạng nội dung |
tier | L · XL | ★ | hạng khối S/M/L/XL |
biome | string ^B[1-6]$ | ★ | biome B1–B6/HUB |
act | act_key (I · II · III · IV · V · VI) | ★ | Hồi I..VI (V = Kết B5, VI = Bí mật B6) |
node | MBS · BOS | ★ | MBS/BOS |
rig | biped · quadruped · flyer · serpent · construct_driver · swarm | ★ | rig Bible §7.7 |
duration_target_s | number [30..300] | ★ | thời lượng mục tiêu |
drivers_vi | string | động lực thiết kế | |
tp_reserve | number [0..60] | TP giữ chỗ | |
arena | object | ★ | sân |
arena.shape | circle · rect · ring · lane | ★ | hình hitbox doc 10 §1.4 |
arena.size_px | [ number [0..] ] (1..2) | ★ | cỡ px |
arena.room | string ^RM_(B[1-6]|HUB)_[a-z0-9_]+$ | id phòng | |
arena.gate_lock | any | ★ | khoá cổng |
arena.hazards | [ string ^HZ_B[1-6]_[a-z0-9_]+$ ] | hazard (INV-18) | |
arena.adds_trickle | object | ★ | sân rỉ ≥ 6 S/20 s |
arena.adds_trickle.count | integer [6..] | ★ | số |
arena.adds_trickle.interval_s | number [1..20] | ★ | chu kỳ (s) |
arena.adds_trickle.pool | [ string ^EN_B[1-6]_\d{2}$ ] (1..) | ★ | danh sách id |
arena.notes_vi | string | ghi chú thiết kế | |
stats | map enum → number [0..] | ★ | chỉ số gốc hero_stats (doc 10 §2.1) |
parts | [ object ] (0..4) | phần tách (L/XL) | |
parts[].part_id | string ^[a-z_]+$ | ★ | id phần |
parts[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
parts[].radius | number [0..] | ★ | bán kính px |
parts[].part_mult | number [0.5..2.0] | ★ | nhân sát thương phần |
parts[].sort_offset | integer [-16..16] | lệch sort px | |
parts[].breakable | any | phá được | |
phases | [ object ] (1..3) | ★ | pha |
phases[].phase | integer [1..3] | ★ | số pha |
phases[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
phases[].hp_enter_pct | number [0..100] | ★ | % HP vào pha |
phases[].invuln_s | number [0..] | ★ | bất tử chuyển pha |
phases[].push_r | number [0..] | đẩy hero r | |
phases[].rest_s | number [0.3..] | ★ | nghỉ ≥ 0.3 |
phases[].attacks | [ string ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)_A\d{2}$ ] (1..) | ★ | đòn <enemyId>_Ann |
phases[].form_vi | string | ★ | dạng pha |
phases[].music_stinger | string | stinger pha | |
phases[].arena_change_vi | string | đổi sân | |
phases[].params | → params (§4.0) | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây | |
attacks | [ → attack (§4.0) ] (2..) | ★ | đòn <enemyId>_Ann |
combos | [ object ] | chuỗi tay | |
combos[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
combos[].sequence | [ string ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)_A\d{2}$ ] (2..4) | ★ | đòn theo thứ tự |
combos[].phase_mask | [ integer [1..3] ] (1..3) | ★ | pha được dùng |
combos[].note_vi | string | ghi chú thiết kế | |
adaptation | object | ★ | Tro Nhớ boss |
adaptation.counters | [ → counter_variant (§4.0) ] (0..2) | ★ | thế đáp CV (doc 14 §12) |
adaptation.special_choice | object | lựa đặc biệt boss | |
adaptation.special_choice.kind | weapon_pick · shadow_order · chain_stop · mirror_hero | ★ | loại (enum) |
adaptation.special_choice.options | [ string ] (1..) | ★ | lựa chọn |
adaptation.special_choice.reads_vi | string | đọc gì | |
adaptation.special_choice.default_order | [ string ] (1..) | ★ | thứ tự mặc định |
memory | object | ★ | MACRO/Sẹo |
memory.macro | any | ★ | đọc Sổ Thù |
memory.scar_ok | any | ★ | cho Sẹo |
memory.opener_card_vi | string | thẻ mở màn | |
memory.loose_hand_vi | string | tay lỏng | |
stagger | object | ★ | Vỡ Thế |
stagger.chain_answer_attacks | [ string ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)_A\d{2}$ ] | ★ | đòn chuỗi ĐÁP |
stagger.broken_bonus_vi | string | thưởng Vỡ Thế | |
stagger.notes_vi | string | ghi chú thiết kế | |
rewards | object | ★ | thưởng |
rewards.xp | number [0..] | ★ | XP |
rewards.soul_ash | number [0..] | ★ | Tro Hồn |
rewards.echo_shard | integer [0..] | ★ | Mảnh Vọng |
rewards.relic_choice | integer [0..3] | ★ | lựa Relic |
rewards.heal_to_pct | number [0..100] | ★ | hồi tới % |
rewards.first_kill_vi | string | thưởng lần đầu | |
dialogue | object | ★ | thoại |
dialogue.intro | [ string ^DLG_[A-Z0-9_]+_\d{3}$ ] | ★ | thoại mở |
dialogue.phase | [ string ^DLG_[A-Z0-9_]+_\d{3}$ ] | số pha | |
dialogue.defeat | [ string ^DLG_[A-Z0-9_]+_\d{3}$ ] | thoại thua | |
dialogue.hero_lines | map ^H\d{2}$ → string ^DLG_[A-Z0-9_]+_\d{3}$ | Hxx → DLG | |
music | string ^MUS_[a-z0-9_]+$ | ★ | cue nhạc |
codex | string ^CDX_[a-z0-9_]+$ | ★ | trang Sổ Tang CDX_* |
lore_vi | string | lore ngắn | |
av_owner | string ^(H\d{2}|EN_B[1-6]|ENV_(B[1-6]|HUB)|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE|SHARED|UI)$ | ★ | owner file AV |
visual | object | ★ | khối hình ảnh doc 12 §8.2 |
visual.height_px | integer [48..96] | ★ | cao px |
visual.palette | [ string ^#[0-9a-fA-F]{6}$ ] (1..10) | ★ | ≤ 8–12 hex |
visual.code | string | ★ | mã pixelfx/asset ASCII thường |
visual.phase_forms_vi | [ string ] | mô tả dạng pha | |
vfx | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | danh sách VFX id phát cùng hàng |
sfx | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | danh sách SFX id phát cùng hàng |
assumed | any | true = có số [ASSUMED] lượt đầu, playtest chỉnh | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.12 elite_modifiers.json — elite_modifiers.schema.json (luật: doc 15 §7.2 · Bible §7.3)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
modifiers | [ object ] (1..16) | ★ | 16 Ấn Tinh Anh |
modifiers[].id | string ^EM\d{2}$ | ★ | ID duy nhất (mẫu ở §2) |
modifiers[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
modifiers[].effect_vi | string | ★ | hiệu ứng |
modifiers[].params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây |
modifiers[].adaptive_source | BASE · ASH | ★ | BASE/ASH (Bible §11) |
modifiers[].mrn05_safe | any | ★ | an toàn MRN05 |
modifiers[].uses_purple_token | any | ★ | ăn token tím |
modifiers[].speed_buff | number [0..1] | buff tốc (kẹp INV-17) | |
modifiers[].glyph | string ^glyph_em\d{2}$ | ★ | sprite glyph HUD |
modifiers[].counter_hint_vi | string | gợi ý khắc chế | |
modifiers[].cut_line | any | cắt được | |
modifiers[].vfx | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] | danh sách VFX id phát cùng hàng | |
modifiers[].sfx | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] | danh sách SFX id phát cùng hàng | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.13 av/<OwnerId>[__<part>].json — av.schema.json (luật: doc 30 §5.1, §6.4 · 31 §9 · 32 §4.2, §9)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa | ||
|---|---|---|---|---|---|
owner | string ^(H\d{2}|EN_B[1-6]|ENV_(B[1-6]|HUB)|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE|SHARED|UI)$ | ★ | chủ của hàng (Hxx | SHARED | owner AV) |
part | string ^[a-z0-9_]+$ | phần file AV | |||
actors | [ object ] | actor spec doc 30 §5.1 | |||
actors[].id | string | ★ | ID duy nhất (mẫu ở §2) | ||
actors[].code | string ^[a-z0-9_]+$ | ★ | mã pixelfx/asset ASCII thường | ||
actors[].tier | hero · S · M · L · XL · npc · summon | ★ | hạng khối S/M/L/XL | ||
actors[].biome | string ^(B[1-6]|HUB|-)$ | ★ | biome B1–B6/HUB | ||
actors[].rig | biped · quadruped · flyer · serpent · construct_driver · swarm | ★ | rig Bible §7.7 | ||
actors[].silhouette | object | ★ | cao/rộng/3 khối/dấu đám đông | ||
actors[].silhouette.height_px | integer [16..96] | ★ | cao px | ||
actors[].silhouette.width_px | integer [8..128] | ★ | rộng px | ||
actors[].silhouette.masses_vi | [ string ] (3..3) | ★ | 3 khối lớn | ||
actors[].silhouette.crowd_mark_vi | string | ★ | dấu nhận trong bầy | ||
actors[].skeleton | object | ★ | override M/bulk | ||
actors[].skeleton.M | map key → number [0..] | ★ | override khớp | ||
actors[].skeleton.bulk | map key → number [0..] | ★ | độ dày | ||
actors[].skeleton.extra_keys | [ string ] | phím phụ | |||
actors[].weapon | object | ★ | vũ khí stock hoặc mới | ||
actors[].weapon.stock | sword · greatsword · dagger · spear · hammer · scythe · claw · bow · pistol · launcher · handle · none | vũ khí stock pixelfx | |||
actors[].weapon.weapon_id | string ^[a-z0-9_]+$ | WEAPONS.<id> | |||
actors[].weapon.off_weapon | string | vũ khí tay phụ | |||
actors[].weapon.desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} | ||
actors[].ramps | object | ★ | ≤ 4 họ × 4 tông + nhấn + ink | ||
actors[].ramps.families | [ object ] (1..4) | ★ | họ ramp | ||
actors[].ramps.families[].name | string | ★ | tên riêng hiển thị (hero) | ||
actors[].ramps.families[].hexes | [ string ^#[0-9a-fA-F]{6}$ ] (4..4) | ★ | 4 tông sáng → tối | ||
actors[].ramps.families[].source | string | ★ | nguồn | ||
actors[].ramps.accent_hex | string ^#[0-9a-fA-F]{6}$ | màu nhấn | |||
actors[].ramps.ink_hex | string ^#[0-9a-fA-F]{6}$ | ★ | màu viền | ||
actors[].ramps.glow_mask_vi | string | mask phát sáng | |||
actors[].facing | se · sw · s | ★ | hướng mặc định | ||
actors[].clips | [ object ] (1..) | ★ | bộ clip anim | ||
actors[].clips[].clip | string ^[a-z0-9_]+$ | ★ | tên clip | ||
actors[].clips[].frames | integer [1..160] | ★ | số frame @30 | ||
actors[].clips[].fps | integer [8..30] | ★ | fps | ||
actors[].clips[].loop | any | ★ | lặp | ||
actors[].clips[].t0_vi | string | ★ | nghĩa t = 0 | ||
actors[].clips[].hits | [ integer [0..] ] | ★ | frame trúng | ||
actors[].clips[].steps | 12 · 24 · 30 | ★ | 12/24/30 | ||
actors[].clips[].note_vi | string | ghi chú thiết kế | |||
actors[].sockets | object | ★ | socket px từ pivot | ||
actors[].sockets.foot | [ number ] (2..2) | ★ | chân | ||
actors[].sockets.chest | [ number ] (2..2) | ★ | ngực | ||
actors[].sockets.head | [ number ] (2..2) | ★ | đầu | ||
actors[].sockets.overhead | [ number ] (2..2) | ★ | trên đầu | ||
actors[].sockets.hand_main | [ number ] (2..2) | ★ | tay chính | ||
actors[].sockets.hand_off | [ number ] (2..2) | tay phụ | |||
actors[].sockets.back | [ number ] (2..2) | lưng | |||
actors[].sockets.tip_at_hit | map key → [ number ] (2..2) | mũi vũ khí theo clip | |||
actors[].reactions | object | ★ | phản ứng | ||
actors[].reactions.skin | char · ice · shock · holy · shadow · poison | ★ | skin act | ||
actors[].reactions.flash_s | number [0..0.2] | ★ | chớp | ||
actors[].reactions.mass_class | S · M · L · XL · hero · npc | ★ | hạng khối | ||
actors[].reactions.broken_clip | string | clip Vỡ Thế | |||
actors[].phases | [ object ] | pha | |||
actors[].phases[].phase | integer [1..3] | ★ | số pha | ||
actors[].phases[].method | lut_row · part_toggle · sheet_swap | ★ | LUT/part/sheet | ||
actors[].phases[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} | ||
actors[].parts | [ object ] | phần tách (L/XL) | |||
actors[].parts[].name | string | ★ | tên riêng hiển thị (hero) | ||
actors[].parts[].pivot | [ number ] (2..2) | ★ | neo | ||
actors[].parts[].sort_offset | integer [-16..16] | ★ | lệch sort px | ||
actors[].parts[].hitbox_r | number [0..] | ★ | hitbox phần | ||
actors[].portraits | [ object ] | chân dung | |||
actors[].portraits[].name | string ^por_[a-z0-9_]+$ | ★ | tên riêng hiển thị (hero) | ||
actors[].portraits[].size | [ integer [16..256] ] (2..2) | ★ | cỡ | ||
actors[].portraits[].expressions | [ string ] | biểu cảm | |||
actors[].vfx_owned | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] | ★ | VFX thuộc actor | ||
actors[].budget | object | ★ | ngân sách atlas | ||
actors[].budget.atlas_pages | number [0..8] | ★ | trang 2048² | ||
actors[].budget.frames_per_dir_max | integer [1..1400] | ★ | frame/hướng tối đa | ||
actors[].bans_vi | [ string ] | điều cấm | |||
actors[].export | object | ★ | lệnh xuất | ||
actors[].export.commands | [ string ] (1..) | ★ | lệnh | ||
actors[].export.atlas_group | string | nhóm atlas | |||
actors[].review | object | ★ | duyệt (inv01_check, check.mjs, art-style-reviewer, ngày) | ||
actors[].review.inv01_check | string | kết quả inv01_check | |||
actors[].review.check_mjs | string | kết quả check.mjs | |||
actors[].review.art_style_reviewer | pending · pass · fail | ★ | pending/pass/fail | ||
actors[].review.date | string | ngày duyệt | |||
env_assets | [ object ] | tile/prop doc 30 §6.4 | |||
env_assets[].id | string ^ENV_(B[1-6]|HUB)_[a-z0-9_]+$ | ★ | ID duy nhất (mẫu ở §2) | ||
env_assets[].kind | FLOOR · FLOOR_DETAIL · EDGE · WALL_N · WALL_S · LIQUID · PROP · PROP_ANIM · DECAL · LIGHT | ★ | loại (enum) | ||
env_assets[].size | object | ★ | cỡ | ||
env_assets[].size.frame_px | [ integer [1..] ] (2..2) | ★ | khung px | ||
env_assets[].size.footprint_px | [ number [0..] ] (2..2) | footprint sàn | |||
env_assets[].size.height_px | number [0..] | cao px | |||
env_assets[].pivot | [ number ] (2..2) | ★ | neo | ||
env_assets[].palette | [ string ^#[0-9a-fA-F]{6}$ ] (1..12) | ★ | ≤ 8–12 hex | ||
env_assets[].variants | object | ★ | biến thể | ||
env_assets[].variants.count | integer [1..] | ★ | số | ||
env_assets[].variants.weights | [ number [0..] ] | trọng số theo pha 1..3 | |||
env_assets[].variants.seed | integer [0..] | seed pixelfx | |||
env_assets[].anim | object | clip anim | |||
env_assets[].anim.frames | integer [1..] | ★ | số frame @30 | ||
env_assets[].anim.fps | integer [1..30] | ★ | fps | ||
env_assets[].anim.loop | any | ★ | lặp | ||
env_assets[].collision | none · rect · ellipse | ★ | va chạm | ||
env_assets[].occlusion | any | ★ | mờ khi che (> 24 px) | ||
env_assets[].light | object | ánh sáng | |||
env_assets[].light.r | number [0..] | ★ | bán kính | ||
env_assets[].light.alpha | number [0..1] | ★ | độ mờ | ||
env_assets[].light.hex | string ^#[0-9a-fA-F]{6}$ | ★ | màu | ||
env_assets[].source | string | ★ | nguồn | ||
env_assets[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} | ||
env_assets[].review | object | ★ | duyệt (inv01_check, check.mjs, art-style-reviewer, ngày) | ||
env_assets[].review.inv01_check | string | kết quả inv01_check | |||
env_assets[].review.art_style_reviewer | pending · pass · fail | ★ | pending/pass/fail | ||
vfx | [ object ] | ★ | danh sách VFX id phát cùng hàng | ||
vfx[].id | string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | ★ | ID duy nhất (mẫu ở §2) | ||
vfx[].owner_class | HERO · ENEMY · TELL · ENV · SHARED | ★ | HERO/ENEMY/TELL/ENV/SHARED (doc 31 §3) | ||
vfx[].tint | EXPORT · HERO_LUT · BIOME · BIOME_ALT · FIXED | ★ | cách tô | ||
vfx[].trigger | string | ★ | trigger thẻ doc 13 §5.9 (PASSIVE, ON_HIT…) | ||
vfx[].layer | floor_decal · shadow · floor_tell · body_back · body_front · overhead · prioritize · screen | ★ | MICRO/MESO | ||
vfx[].size_class | S · M · L · XL | ★ | hạng cỡ VFX | ||
vfx[].canvas | object | ★ | khung vẽ hướng e (w,h,origin) | ||
vfx[].canvas.w | integer [1..480] | ★ | rộng | ||
vfx[].canvas.h | integer [1..270] | ★ | cao | ||
vfx[].canvas.origin | [ number ] (2..2) | ★ | gốc [x,y] | ||
vfx[].pivot | string ^(feet|impact|muzzle|floor|socket:[a-z_]+)$ | ★ | neo | ||
vfx[].dirs | integer [1..8] | ★ | hướng / số hướng | ||
vfx[].tilt | number [0.6..1.1] | tilt 0.6–1.1 | |||
vfx[].frames | object | ★ | số frame @30 | ||
vfx[].frames.count | integer [1..150] | ★ | số | ||
vfx[].frames.fps | integer [8..30] | ★ | fps | ||
vfx[].frames.loop | any | ★ | lặp | ||
vfx[].frames.duration_s | number [0..] | ★ | thời lượng (s) | ||
vfx[].phases | object | ★ | pha | ||
vfx[].phases.antic | [ number ] (2..2) | ★ | [a,b] s | ||
vfx[].phases.impact | [ number ] (2..2) | ★ | [c,d] s | ||
vfx[].phases.dissipate | [ number ] (2..2) | ★ | [e,f] s | ||
vfx[].keyframes | [ object ] (2..) | ★ | t → mô tả | ||
vfx[].keyframes[].t | number | ★ | thời điểm s | ||
vfx[].keyframes[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} | ||
vfx[].primitives | [ string ] (1..) | ★ | công cụ pixelfx | ||
vfx[].palette | [ string ^#[0-9a-fA-F]{6}$ ] (1..8) | ★ | ≤ 8–12 hex | ||
vfx[].particles | [ object ] | hạt | |||
vfx[].particles[].kind | string | ★ | loại (enum) | ||
vfx[].particles[].count | integer [0..] | ★ | số | ||
vfx[].particles[].speed | number [0..] | tốc px/s | |||
vfx[].particles[].life_s | number [0..] | đời s | |||
vfx[].particles[].hex | string ^#[0-9a-fA-F]{6}$ | màu | |||
vfx[].particles[].gravity | number | trọng lực | |||
vfx[].particles[].shadow | any | bóng | |||
vfx[].light | object | ánh sáng | |||
vfx[].light.k | number [0.2..0.5] | ★ | cường độ 0.2–0.5 | ||
vfx[].light.radius_px | number [0..] | ★ | bán kính px | ||
vfx[].light.life_s | number [0..] | ★ | đời s | ||
vfx[].light.floor_pool | any | ★ | vũng sàn | ||
vfx[].easing | object | ★ | gia tốc + freeze | ||
vfx[].easing.curve | outQuart · outExpo · inOutQuad · linear | ★ | đường cong | ||
vfx[].easing.freeze_s | number [0..] | đóng băng s | |||
vfx[].hitbox | object | hình + khớp (doc 31 §7) | |||
vfx[].hitbox.shape | string ^(circle r\d+|ring r\d+ w\d+|sector r\d+ a\d+|line L\d+ W\d+|rect L\d+ W\d+|proj r\d+|none)$ | ★ | hình hitbox doc 10 §1.4 | ||
vfx[].hitbox.match | string | phủ %/lệch px | |||
vfx[].hitbox.wave | reach · procedural · none | reach/procedural | |||
vfx[].rank | object | nâng hạng I/II/III | |||
vfx[].rank.I | → params (§4.0) | ★ | Hồi I | ||
vfx[].rank.II | → params (§4.0) | ★ | chỉ số II (doc 10 §2.1) | ||
vfx[].rank.III | → params (§4.0) | ★ | chỉ số III (doc 10 §2.1) | ||
vfx[].rank.scale_steps | [ number [1..2.2] ] | ★ | thang s | ||
vfx[].variants | object | biến thể | |||
vfx[].variants.seed | integer [0..65535] | ★ | seed pixelfx | ||
vfx[].variants.aspect_palettes | any | ★ | palette theo Dạng Rèn | ||
vfx[].variants.alt | any | ★ | biến thể ALT | ||
vfx[].variants.colorblind_vi | string | ★ | mù màu | ||
vfx[].perf | object | ★ | ngân sách hiệu năng | ||
vfx[].perf.max_cell_px | [ integer [1..] ] (2..2) | ★ | ô lớn nhất | ||
vfx[].perf.frames_per_dir | integer [1..] | ★ | frame/hướng | ||
vfx[].perf.atlas_pages | number [0..] | trang 2048² | |||
vfx[].perf.instance_cap | integer [1..] | ★ | trần instance | ||
vfx[].perf.lights | integer [0..] | số Lights | |||
vfx[].lod | never · L1 · L2 · L3 | ★ | never/L1/L2/L3 | ||
vfx[].sfx | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | danh sách SFX id phát cùng hàng | |||
vfx[].source | string ^(reuse|recolor|new|shader) .+ | ★ | nguồn | ||
vfx[].export | string | ★ | lệnh xuất | ||
vfx[].review | object | ★ | duyệt (inv01_check, check.mjs, art-style-reviewer, ngày) | ||
vfx[].review.check_mjs | string | kết quả check.mjs | |||
vfx[].review.inv01_check | string | kết quả inv01_check | |||
vfx[].review.hitbox_overlay | string | ảnh overlay hitbox | |||
vfx[].review.art_style_reviewer | pending · pass · fail | ★ | pending/pass/fail | ||
vfx[].review.date | string | ngày duyệt | |||
vfx[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} | ||
sfx | [ object ] | ★ | danh sách SFX id phát cùng hàng | ||
sfx[].id | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | ★ | ID duy nhất (mẫu ở §2) | ||
sfx[].owner | string | ★ | chủ của hàng (Hxx | SHARED | owner AV) |
sfx[].hook | string | ★ | EventName phát / hook nâng cấp | ||
sfx[].frame | string | ★ | khung nút / frame | ||
sfx[].kind | swing · hit · cast · shot · impact · explode · tell_y · tell_p · answer · move · vocal · loop … (17) | ★ | loại (enum) | ||
sfx[].layers | [ object ] (1..3) | ★ | lớp trúng | ||
sfx[].layers[].role | transient · body · tail | ★ | vai | ||
sfx[].layers[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} | ||
sfx[].length_ms | integer [10..120000] | ★ | dài ms | ||
sfx[].variants | integer [1..12] | ★ | biến thể | ||
sfx[].pitch_rand_pct | number [0..12] | ★ | ±% cao độ | ||
sfx[].vol_rand_db | number [0..3] | ★ | ±dB | ||
sfx[].priority | integer [0..255] | ★ | ưu tiên 0–255 (0 cao) | ||
sfx[].max_voices | integer [1..24] | ★ | trần voice | ||
sfx[].cooldown_ms | integer [0..] | ★ | khoảng tối thiểu | ||
sfx[].steal | oldest · quietest · none | ★ | cướp voice | ||
sfx[].spatial | center · screen_pan · screen_pan_full | ★ | pan | ||
sfx[].clock | World · Hero · UI | ★ | đồng hồ | ||
sfx[].bus | Master · Music · SFX · Tell · HeroAttack · HeroDefense · Hero · Enemy · EnemyHorde · Boss · World · Ambience … (15) | ★ | bus mixer doc 32 §5.1 | ||
sfx[].ducks | [ string ] | snapshot/send gây duck | |||
sfx[].ducked_by | [ string ] | bị duck bởi | |||
sfx[].lufs_mmax | number [-40..-6] | ★ | momentary-max LUFS | ||
sfx[].loop | any | ★ | lặp | ||
sfx[].loop_start | integer [0..] | mẫu đầu loop | |||
sfx[].loop_end | integer [0..] | mẫu cuối loop | |||
sfx[].tell_class | Y · P · N · none | ★ | Y/P/N/none | ||
sfx[].asset_ref | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | âm chung dùng lại | |||
sfx[].source | reuse · freesound · synth · foley · outsource | ★ | nguồn | ||
sfx[].brief_vi | string | ★ | brief + 'KHÔNG được nghe như…' | ||
sfx[].freesound_query | string | query + lọc | |||
sfx[].synth_recipe | string | recipe create-sfx | |||
sfx[].credit | string | credit CC BY | |||
sfx[].status | brief · sourced · mastered · wired · final | ★ | STS_X:giây hoặc null | ||
sfx[].verdict | pending · ok · redo | ★ | pending/ok/redo | ||
barks | [ object ] | bark chữ ≤ 1 dòng | |||
barks[].id | string ^BARK_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | ★ | ID duy nhất (mẫu ở §2) | ||
barks[].speaker | string | ★ | người nói | ||
barks[].trigger | string | ★ | trigger thẻ doc 13 §5.9 (PASSIVE, ON_HIT…) | ||
barks[].text_vi | string ≤ 64 ký tự | ★ | chữ | ||
barks[].voice_sfx | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | giọng không lời | |||
barks[].priority | boss · ash_callout · npc · hero | ★ | ưu tiên 0–255 (0 cao) | ||
barks[].cooldown_s | number [0..] | hồi chiêu (s) | |||
barks[].once | any | 1 lần | |||
doc | string | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.14 biomes/<Bn>.json · biomes/HUB.json — biome.schema.json (luật: doc 15 §9 · 20 §4 · 30 §3.3, §6)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
id | string ^B[1-6]$ | = "HUB" | ★ | ID duy nhất (mẫu ở §2) |
name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
act | act_key (I · II · III · IV · V · VI) | = "HUB" | ★ | Hồi I..VI (V = Kết B5, VI = Bí mật B6); HUB chỉ cho biomes/HUB.json |
theme_vi | string | ★ | chủ đề |
palette | object | ★ | ≤ 8–12 hex |
palette.family_vi | string | ★ | họ màu |
palette.floor_hex | string ^#[0-9a-fA-F]{6}$ | ★ | màu sàn |
palette.enemy_hexes | [ string ^#[0-9a-fA-F]{6}$ ] (0..8) | ramp thân địch | |
palette.tokens | map key → string ^#[0-9a-fA-F]{6}$ | ★ | token màu hệ thống |
palette.light_hex | string ^#[0-9a-fA-F]{6}$ | màu Đèn | |
tiles | [ string ^ENV_(B[1-6]|HUB)_[a-z0-9_]+$ ] | ★ | ENV tile id |
props | [ string ^ENV_(B[1-6]|HUB)_[a-z0-9_]+$ ] | ★ | ENV prop id |
hazards | [ object ] | ★ | hazard (INV-18) |
hazards[].id | string ^HZ_B[1-6]_[a-z0-9_]+$ | ★ | ID duy nhất (mẫu ở §2) |
hazards[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
hazards[].tell | Y · P · N · NONE | ★ | Y vàng / P tím / N vùng / NONE (INV-02) |
hazards[].period_s | number [1.0..] | ★ | chu kỳ ≥ 1.0 |
hazards[].windup_s | number [0..] | windup (sàn doc 11 §1.2) | |
hazards[].dmg | number [0..] | sát thương ở Hồi gốc | |
hazards[].hits_enemies | = true | ★ | trúng cả quái |
hazards[].shape | → hitbox (§4.0) | ★ | hình hitbox doc 10 §1.4 |
hazards[].statuses | [ → status_apply (§4.0) ] | 12 trạng thái doc 10 §5 | |
hazards[].trigger_vi | string | ★ | kích khi |
hazards[].params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây |
hazards[].uses_purple_token | any | ★ | ăn token tím |
hazards[].vfx | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | danh sách VFX id phát cùng hàng |
hazards[].sfx | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] (1..) | ★ | danh sách SFX id phát cùng hàng |
rooms | [ object ] (1..) | ★ | mẫu phòng |
rooms[].id | string ^RM_(B[1-6]|HUB)_[a-z0-9_]+$ | ★ | ID duy nhất (mẫu ở §2) |
rooms[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
rooms[].shape | circle · rect · corridor · arena · hub | ★ | hình hitbox doc 10 §1.4 |
rooms[].size_px | [ number [0..] ] (2..2) | ★ | cỡ px |
rooms[].safe_center_r | number [0..] | bán kính an toàn | |
rooms[].spawn_edges | [ N · S · E · W · ANY ] (1..) | ★ | cạnh spawn |
rooms[].hazard_slots | [ string ^HZ_B[1-6]_[a-z0-9_]+$ ] | ổ hazard | |
rooms[].props | [ string ^ENV_(B[1-6]|HUB)_[a-z0-9_]+$ ] | ENV prop id | |
rooms[].landmark | string ^LMK_(B[1-6]|HUB)_[a-z0-9_]+$ | landmark | |
rooms[].objectives | [ PURGE · VIGIL · BELLS · TIDE · NEST · GAUNTLET · CHASE · DUEL · HUNT · RESCUE · BOSS · MINIBOSS … (13) ] (1..) | ★ | mục tiêu |
rooms[].node_types | [ CMB · ELT · CHL · EVT · SHP · RST · SEC · RSC · MBS · BOS · DOCK ] (1..) | ★ | loại nút |
rooms[].notes_vi | string | ghi chú thiết kế | |
encounters | [ string ^ENC_(B[1-6]|HUB)_[a-z0-9_]+$ ] | encounter id | |
events | [ string ^EVT_B[1-6]_\d{2}$ ] | sự kiện | |
ambience | object | ★ | bed + spot |
ambience.bed | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | ★ | loop nền |
ambience.spots | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] | spot ngẫu nhiên | |
ambience.banned_vi | string | điều cấm | |
music | object | ★ | cue nhạc |
music.main | string ^MUS_[a-z0-9_]+$ | ★ | cue chính |
music.h12 | string ^MUS_[a-z0-9_]+$ | bộ stem H12 | |
music.boss | string ^MUS_[a-z0-9_]+$ | boss | |
music.mini | string ^MUS_[a-z0-9_]+$ | mini-boss | |
landmarks | [ object ] | ★ | landmark |
landmarks[].id | string ^LMK_(B[1-6]|HUB)_[a-z0-9_]+$ | ★ | ID duy nhất (mẫu ở §2) |
landmarks[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
landmarks[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} |
landmarks[].room | string ^RM_(B[1-6]|HUB)_[a-z0-9_]+$ | id phòng | |
enemy_set | string ^EN_B[1-6]$ | owner AV quái | |
minibosses | [ string ^MB_B[1-6]_\d$ ] (0..2) | mini-boss | |
boss | string ^(BS_B[1-4]|BS_FINAL|BS_TRUE|MB_B[1-6]_\d)$ | boss | |
env_av | string ^ENV_(B[1-6]|HUB)$ | ★ | owner AV môi trường |
stations | [ string ^ST_[A-Z_]+$ ] | trạm | |
lore_vi | string | lore ngắn | |
codex | string ^CDX_[a-z0-9_]+$ | trang Sổ Tang CDX_* | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
encounter_scripts | [ string ^WS_(B[1-6])_(PURGE|VIGIL|BELLS|TIDE|NEST|GAUNTLET|CHASE|DUEL|HUNT|RESCUE|BOSS|MINIBOSS|TRIAL)_\d{2}$ ] | WS id dùng | |
director | → params (§4.0) | ghi đè hồ sơ Director | |
objective_props | [ object ] | đạo cụ mục tiêu OBJ_* | |
objective_props[].id | string ^OBJ_[A-Z0-9_]+$ | ★ | ID duy nhất (mẫu ở §2) |
objective_props[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
objective_props[].hp | number [0..] | HP | |
objective_props[].env | string ^ENV_(B[1-6]|HUB)_[a-z0-9_]+$ | ENV sprite |
4.15 encounters.json — encounters.schema.json (luật: doc 15 §2–§13)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
objectives | [ object ] (10..13) | ★ | mục tiêu |
objectives[].id | PURGE · VIGIL · BELLS · TIDE · NEST · GAUNTLET · CHASE · DUEL · HUNT · RESCUE · BOSS · MINIBOSS … (13) | ★ | ID duy nhất (mẫu ở §2) |
objectives[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
objectives[].nodes | [ CMB · ELT · CHL · EVT · SHP · RST · SEC · RSC · MBS · BOS · DOCK ] (1..) | ★ | nút xuất hiện |
objectives[].t_target_s | object | ★ | thời điểm trung vị đạt mục tiêu |
objectives[].t_target_s.I | number [0..] | ★ | Hồi I |
objectives[].t_target_s.II_IV | number [0..] | ★ | chỉ số II_IV (doc 10 §2.1) |
objectives[].obj_mult | number/array | ★ | nhân ngân sách mục tiêu |
objectives[].curve | STD · FLAT · TIDE · RUN · GATE | ★ | đường cong |
objectives[].win_vi | string | ★ | điều kiện thắng |
objectives[].fail_vi | string/null | ★ | thua mục tiêu |
objectives[].meso | any | ★ | cho MESO |
objectives[].time_cap_s | number/null | ★ | trần thời gian; null = không |
objectives[].props | [ string ^OBJ_[A-Z0-9_]+$ ] | ENV prop id | |
patterns | [ object ] (14..14) | ★ | 14 mẫu spawn |
patterns[].id | EDGE · PACK · RING · ARC · như ARC nhưng tâm cung sau lưng hero; beat dồn ARC_BACK · FLANK · BURST · TRICKLE · SWARM · AMBUSH · GATE · FAR … (14) | ★ | ID duy nhất (mẫu ở §2) |
patterns[].shape_vi | string | ★ | hình |
patterns[].p1_vi | string | nghĩa p1 | |
patterns[].p2_vi | string | nghĩa p2 | |
patterns[].p1_default | number/string/null | p1 mặc định | |
patterns[].p2_default | number/string/null | p2 mặc định | |
patterns[].in_view | no · yes · partial · depends | ★ | trong khung? |
patterns[].min | → params (§4.0) | biên dưới | |
directors | [ object ] (4..6) | ★ | hồ sơ Director biome (doc 15 §9) |
directors[].biome | string ^B[1-6]$ | ★ | biome B1–B6/HUB |
directors[].B_room | number [0..] | ★ | ngân sách phòng TP |
directors[].BPS_act | number [0..] | ★ | TP/giây |
directors[].mix | map ^(EN|EL)_B[1-6]_\d{2}$ → number [0..100] | ★ | lufs_i_full/true_peak/ducked_by |
directors[].intro_rows | object | ★ | giới thiệu theo hàng R1/R2/R3+ |
directors[].intro_rows.R1 | [ string ^EN_B[1-6]_\d{2}$ ] | ★ | hàng R1 |
directors[].intro_rows.R2 | [ string ^EN_B[1-6]_\d{2}$ ] | hàng R2 | |
directors[].intro_rows.R3 | [ string ^EN_B[1-6]_\d{2}$ ] | hàng R3+ | |
directors[].signature_patterns_vi | string | ★ | mẫu đặc trưng |
directors[].objective_props | map enum → string ^OBJ_[A-Z0-9_]+$ | ★ | đạo cụ mục tiêu OBJ_* |
directors[].carrier_vi | string | người mang báu CHASE | |
directors[].boss_trickle | string ^EN_B[1-6]_\d{2}$ | ★ | quái sân rỉ |
directors[].priority_kill | string ^EN_B[1-6]_\d{2}$ | any | ★ | vai ưu tiên diệt |
directors[].trial | object | ải Kết/Bí mật | |
directors[].trial.id | FINALE_TRIAL · SHORE_TRIAL | ★ | ID duy nhất (mẫu ở §2) |
directors[].trial.duration_s | number [0..] | ★ | thời lượng (s) |
directors[].trial.rules_vi | string | ★ | luật |
wave_scripts | [ object ] (1..) | ★ | kịch bản sóng (wave_scripts.csv) |
wave_scripts[].script_id | string ^WS_(B[1-6])_(PURGE|VIGIL|BELLS|TIDE|NEST|GAUNTLET|CHASE|DUEL|HUNT|RESCUE|BOSS|MINIBOSS|TRIAL)_\d{2}$ | ★ | WS_<biome>_<OBJ>_<nn> |
wave_scripts[].biome | string ^B[1-6]$ | ★ | biome B1–B6/HUB |
wave_scripts[].objective | PURGE · VIGIL · BELLS · TIDE · NEST · GAUNTLET · CHASE · DUEL · HUNT · RESCUE · BOSS · MINIBOSS … (13) | ★ | mục tiêu |
wave_scripts[].nodes | [ CMB · ELT · CHL · EVT · SHP · RST · SEC · RSC · MBS · BOS · DOCK ] (1..) | ★ | nút xuất hiện |
wave_scripts[].home_act | I · II · III · IV · V · VI | ★ | Hồi gốc (số soạn ở Hồi này, doc 17 §5.1) |
wave_scripts[].t_target_s | number [20..180] | ★ | thời điểm trung vị đạt mục tiêu |
wave_scripts[].corridor_px | number [0..] | dài hành lang | |
wave_scripts[].rows | [ object ] (2..) | ★ | dòng kịch bản |
wave_scripts[].rows[].row | integer [1..999] | ★ | thứ tự dòng |
wave_scripts[].rows[].trigger | T · PCT · PH · EV | ★ | trigger thẻ doc 13 §5.9 (PASSIVE, ON_HIT…) |
wave_scripts[].rows[].at | number/string | ★ | giá trị trigger |
wave_scripts[].rows[].until | number/string/null | hết hiệu lực | |
wave_scripts[].rows[].action | BUDGET · MIX · BEAT · ELITE · MINI · BOSS · OBJ · HAZ · CALL · REST · CAP · WIN … (14) | ★ | hành động doc 13 §5.9 |
wave_scripts[].rows[].target | string/null | đích Edge doc 13 §5.4 | |
wave_scripts[].rows[].n | number/null | số theo action | |
wave_scripts[].rows[].every | number/null | chu kỳ lặp s | |
wave_scripts[].rows[].pattern | string ^(EDGE|PACK|RING|ARC|ARC_BACK|FLANK|BURST|TRICKLE|SWARM|AMBUSH|GATE|FAR|NEST|LINE)(@OBJ)?$ | any | mẫu spawn §3 (+@OBJ) | |
wave_scripts[].rows[].p1 | number/string/null | tham số 1 | |
wave_scripts[].rows[].p2 | number/string/null | tham số 2 | |
wave_scripts[].rows[].flags | [ string ^(NO_MESO|ARROW|NO_ELITE|CHILD|OBJ_ATTACK(:\d+)?)$ ] | cờ | |
wave_scripts[].rows[].note | string | ghi chú (không loc) | |
wave_scripts[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} |
wave_scripts[].assumed | any | true = có số [ASSUMED] lượt đầu, playtest chỉnh | |
tp_table | [ object ] | bảng TP & trần | |
tp_table[].enemy | string ^(EN_B[1-6]_\d{2}|EL_B[1-6]_\d{2}|MB_B[1-6]_\d|BS_B[1-4]|BS_FINAL|BS_TRUE)$ | ELITE · MINI · BOSS | ★ | id quái |
tp_table[].tp | number [0..] | ★ | điểm đe doạ doc 15 §2.1 |
tp_table[].cap_group | string | ★ | nhóm trần sống |
tp_table[].cap_alive | integer/null | ★ | trần sống/phòng; null = không |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.16 run_map.json — run_map.schema.json (luật: doc 16 §2–§6, §12)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
acts | [ object ] (6..6) | ★ | 6 Hồi |
acts[].act | I · II · III · IV · V · VI | ★ | Hồi I..VI |
acts[].biome | string ^B[1-6]$ | ★ | biome B1–B6/HUB |
acts[].rows | integer [1..8] | ★ | dòng kịch bản |
acts[].median_s | number [0..] | ★ | trung vị giây |
acts[].transition_s | number [0..] | chuyển Hồi | |
acts[].boss | string ^(BS_B[1-4]|BS_FINAL|BS_TRUE|MB_B[1-6]_\d)$ | ★ | boss |
acts[].minibosses | [ string ^MB_B[1-6]_\d$ ] (0..2) | mini-boss | |
acts[].mutator_from | any | Hồi có mutator | |
grid | object | ★ | lưới bản đồ |
grid.lanes | integer [2..6] | số làn | |
grid.rows | integer [1..8] | dòng kịch bản | |
grid.cross_max | integer [0..] | giao làn tối đa | |
node_types | [ object ] (11..11) | ★ | loại nút |
node_types[].id | CMB · ELT · CHL · EVT · SHP · RST · SEC · RSC · MBS · BOS · DOCK | ★ | ID duy nhất (mẫu ở §2) |
node_types[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
node_types[].frame | C · G · U · R6 · DOCK | ★ | khung nút / frame |
node_types[].t_s | object | ★ | thời lượng I–IV |
node_types[].t_s.I | number [0..] | ★ | Hồi I |
node_types[].t_s.II | number [0..] | ★ | chỉ số II (doc 10 §2.1) |
node_types[].t_s.III | number [0..] | ★ | chỉ số III (doc 10 §2.1) |
node_types[].t_s.IV | number [0..] | ★ | chỉ số IV (doc 10 §2.1) |
node_types[].icon | string ^icon_[a-z0-9_]+$ | ★ | tên sprite icon icon_<slug> |
node_types[].reward_rule_vi | string | ★ | luật thưởng |
node_types[].objectives | [ PURGE · VIGIL · BELLS · TIDE · NEST · GAUNTLET · CHASE · DUEL · HUNT · RESCUE · BOSS · MINIBOSS … (13) ] | mục tiêu | |
lane_templates | [ object ] (1..) | ★ | khuôn làn r1..r5 C/G/U |
lane_templates[].id | string ^LN_[A-Z0-9_]+$ | ★ | ID duy nhất (mẫu ở §2) |
lane_templates[].r1 | C · G · U | ★ | hàng 1 |
lane_templates[].r2 | C · G · U | ★ | hàng 2 |
lane_templates[].r3 | C · G · U | ★ | hàng 3 |
lane_templates[].r4 | C · G · U | ★ | hàng 4 |
lane_templates[].r5 | C · G · U | ★ | hàng 5 |
lane_templates[].weight | number [0..] | ★ | trọng số cuộn |
child_weights | map enum → map enum → number [0..] | ★ | tần suất loại con theo khung |
map_fallback | [ object ] | ★ | 3 bản đồ tay/Hồi |
map_fallback[].id | string ^MAP_FB_(I|II|III|IV|V|VI)_\d$ | ★ | ID duy nhất (mẫu ở §2) |
map_fallback[].act | I · II · III · IV · V · VI | ★ | Hồi I..VI |
map_fallback[].rows | [ [ CMB · ELT · CHL · EVT · SHP · RST · SEC · RSC · MBS · BOS · DOCK ] (1..4) ] (5..6) | ★ | dòng kịch bản |
reward_tables | [ object ] (1..) | ★ | icon thưởng nút |
reward_tables[].icon | EDGE+ · SKILL · RELIC · GOLD · HEAL · META · ECHO | ★ | tên sprite icon icon_<slug> |
reward_tables[].weight_CMB | number [0..] | ★ | trọng số ở CMB |
reward_tables[].weight_CHL | number [0..] | ★ | trọng số ở CHL |
reward_tables[].amount | object | ★ | lượng |
reward_tables[].amount.I | number [0..] | Hồi I | |
reward_tables[].amount.II | number [0..] | chỉ số II (doc 10 §2.1) | |
reward_tables[].amount.III | number [0..] | chỉ số III (doc 10 §2.1) | |
reward_tables[].amount.IV | number [0..] | chỉ số IV (doc 10 §2.1) | |
shop_prices | [ object ] (1..) | ★ | giá Sạp Rong |
shop_prices[].slot | EDGE · RELIC · SKILL_CARD · POTION · Nén Hương LV01 · Bát Gạo LV02 · Nến Đôi LV04 · Áo Giấy LV05 · REROLL · BANISH | ★ | slot kit doc 12 §2.1 |
shop_prices[].rarity | COMMON · RARE · EPIC · ANY | ★ | COMMON/RARE/EPIC/LEGENDARY/CURSED (doc 13 §5.1) |
shop_prices[].price | integer [0..] | ★ | giá Vàng Mã |
heal_budget | [ object ] | ngân sách HP %/Hồi | |
heal_budget[].act | I · II · III · IV · V · VI | ★ | Hồi I..VI |
heal_budget[].pct | number [0..500] | ★ | phần trăm |
settings | → params (§4.0) | núm run_structure.csv | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.17 events.json — events.schema.json (luật: doc 16 §3 · Bible §2)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
events | [ object ] (1..40) | ★ | sự kiện |
events[].id | string ^EVT_B[1-6]_\d{2}$ | ★ | ID duy nhất (mẫu ở §2) |
events[].biome | string ^B[1-6]$ | ★ | biome B1–B6/HUB |
events[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
events[].text_vi | string | ★ | chữ |
events[].speaker | string | người nói | |
events[].choices | [ object ] (2..4) | ★ | 2–4 lựa chọn |
events[].choices[].text_vi | string | ★ | chữ |
events[].choices[].cost | → cost (§4.0) | giá: {CUR_*: số} | |
events[].choices[].hp_cost_pct | number [0..100] | giá HP % | |
events[].choices[].outcome | object | ★ | kết quả |
events[].choices[].outcome.kind | string | ★ | loại (enum) |
events[].choices[].outcome.params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây |
events[].choices[].outcome.refs | [ string ] | đường dẫn tham chiếu | |
events[].choices[].outcome_vi | string | ★ | kết quả chữ |
events[].choices[].condition | → condition (§4.0) | điều kiện có cấu trúc {kind, ref, op, value} | |
events[].weight | number [0..] | ★ | trọng số cuộn |
events[].conditions | [ → condition (§4.0) ] | điều kiện | |
events[].once_per_run | any | ★ | 1 lần/run |
events[].codex | string ^CDX_[a-z0-9_]+$ | trang Sổ Tang CDX_* | |
events[].art_vi | string | art | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.18 mourning_bands.json — mourning_bands.schema.json (luật: doc 17 §7.1 · Bible §4)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
bands | [ object ] (15..15) | ★ | 15 Khăn Tang |
bands[].id | string ^MRN\d{2}$ | ★ | ID duy nhất (mẫu ở §2) |
bands[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
bands[].effect_vi | string | ★ | hiệu ứng |
bands[].max_rank | integer [1..3] | ★ | hạng tối đa theo rarity |
bands[].points_per_rank | integer [1..3] | ★ | điểm Độ Tang/bậc |
bands[].per_rank | [ → params (§4.0) ] (1..3) | ★ | params mỗi bậc |
bands[].unlock | Hồi Chuông END_BELL_TOLL · MRN11–MRN15 vào Chuông Thử (Độ Tang tối đa 43); Relic tối đa 4/run. GD3 | ★ | điều kiện + giá mở |
bands[].guards | [ string ^INV-\d{2}$ ] | ★ | INV được bảo vệ |
bands[].uses_purple_token | any | ★ | ăn token tím |
bands[].glyph | string ^glyph_mrn\d{2}$ | ★ | sprite glyph HUD |
bands[].cut_line | any | cắt được | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
meta | object | ★ | meta Khăn Tang |
meta.name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
meta.score_name_vi | string | ★ | tên điểm |
meta.max_total | integer [0..] | ★ | tổng tối đa |
meta.base_set_max | integer [0..] | ★ | bộ gốc tối đa |
meta.station | string ^ST_[A-Z_]+$ | ★ | trạm |
meta.npc | string ^NPC_[A-Z]+$ | ★ | NPC |
meta.milestone_rewards | [ object ] | thưởng mốc | |
meta.milestone_rewards[].score | integer [0..] | ★ | điểm |
meta.milestone_rewards[].echo_shard | integer [0..] | ★ | Mảnh Vọng |
4.19 mutators.json — mutators.schema.json (luật: doc 17 §7.2)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
mutators | [ object ] (12..12) | ★ | 12 Act Mutator |
mutators[].id | string ^MUT\d{2}$ | ★ | ID duy nhất (mẫu ở §2) |
mutators[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
mutators[].effect_vi | string | ★ | hiệu ứng |
mutators[].params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây |
mutators[].from_act | integer [2..5] | ★ | Hồi sớm nhất |
mutators[].chl_safe | any | ★ | an toàn CHL |
mutators[].uses_purple_token | any | ★ | ăn token tím |
mutators[].speed_buff | number [0..1] | buff tốc (kẹp INV-17) | |
mutators[].glyph | string ^glyph_mut\d{2}$ | ★ | sprite glyph HUD |
mutators[].vfx | [ string ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] | danh sách VFX id phát cùng hàng | |
mutators[].sfx | [ string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ ] | danh sách SFX id phát cùng hàng | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.20 modes.json — modes.schema.json (luật: doc 16 §10 · Bible §4.1)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
modes | [ object ] (5..5) | ★ | 5 mode |
modes[].id | STANDARD · DAILY · ENDLESS · Đêm Hồi Chuông BOSS_RUSH · CUSTOM | ★ | ID duy nhất (mẫu ở §2) |
modes[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
modes[].unlock_vi | string | ★ | mở |
modes[].unlock | → condition (§4.0) | ★ | điều kiện + giá mở |
modes[].rules_vi | [ string ] (1..) | ★ | luật |
modes[].currency_mult | map ^CUR_[A-Z_]+$ → number/string | ★ | nhân tiền tệ |
modes[].mastery_mult | number [0..1] | ★ | nhân Thông Thạo |
modes[].ash_layers | ALL · SEED · MICRO · CUSTOM_0_3 | ★ | tầng Tro Nhớ |
modes[].mourning | optional · fixed · off · custom | ★ | Khăn Tang |
modes[].leaderboard | any | ★ | bảng xếp hạng |
modes[].seeded | any | ★ | seed cố định |
modes[].score_formula | string | công thức điểm | |
modes[].params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây |
modes[].music | string ^MUS_[a-z0-9_]+$ | cue nhạc | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.21 currencies.json — currencies.schema.json (luật: doc 17 §8, §10)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
currencies | [ object ] (4..4) | ★ | 4 tiền tệ |
currencies[].id | string ^CUR_[A-Z_]+$ | ★ | ID duy nhất (mẫu ở §2) |
currencies[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
currencies[].scope | meta · run | ★ | meta/run |
currencies[].color_hex | string ^#[0-9a-fA-F]{6}$ | ★ | màu |
currencies[].icon | string | tên sprite icon icon_<slug> | |
currencies[].sources | [ object ] (1..) | ★ | nguồn |
currencies[].sources[].key | string ^[a-z][a-z0-9_]*$ | ★ | giọng |
currencies[].sources[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} |
currencies[].sources[].amount | number/string | ★ | lượng |
currencies[].sources[].unit_vi | string | chữ tiếng Việt | |
currencies[].sources[].doc | string | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) | |
currencies[].sinks | [ object ] (1..) | ★ | đích |
currencies[].sinks[].key | string ^[a-z][a-z0-9_]*$ | ★ | giọng |
currencies[].sinks[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} |
currencies[].sinks[].amount | number/string | ★ | lượng |
currencies[].sinks[].unit_vi | string | chữ tiếng Việt | |
currencies[].sinks[].doc | string | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) | |
currencies[].income_target_vi | string | ★ | mục tiêu thu nhập |
currencies[].mode_mult | map enum → number/string | ★ | nhân theo mode |
currencies[].cap | number [0..] | trần | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.22 meta.json — meta.schema.json (luật: doc Bible §3 · 12 §2.7–2.8 · 17 §10)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
hub | object | ★ | HUB_BELL_TOWER |
hub.id | = "HUB_BELL_TOWER" | ★ | ID duy nhất (mẫu ở §2) |
hub.name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
hub.desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} |
stations | [ object ] (8..8) | ★ | trạm |
stations[].id | string ^ST_[A-Z_]+$ | ★ | ID duy nhất (mẫu ở §2) |
stations[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
stations[].npc | string ^NPC_[A-Z]+$ | any | ★ | NPC |
stations[].func_vi | string | ★ | chức năng |
stations[].unlock | → condition (§4.0) | điều kiện + giá mở | |
stations[].env_prop | string ^ENV_(B[1-6]|HUB)_[a-z0-9_]+$ | prop trạm | |
restoration | [ object ] (5..5) | ★ | Phục Dựng GD1–GD5 |
restoration[].id | string ^GD[1-5]$ | ★ | ID duy nhất (mẫu ở §2) |
restoration[].cost | number [0..] | ★ | giá: {CUR_*: số} |
restoration[].unlocks_vi | string | ★ | mở gì |
restoration[].flags | [ string ] | cờ | |
restoration[].scene_vi | string | cảnh truyện | |
station_upgrades | [ object ] (30..30) | ★ | 30 nâng trạm UP_* |
station_upgrades[].name_vi | string | tên hiển thị tiếng Việt có dấu | |
station_upgrades[].cost | number [0..] | ★ | giá: {CUR_*: số} |
station_upgrades[].effect_vi | string | ★ | hiệu ứng |
station_upgrades[].params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây |
station_upgrades[].id | string ^UP_[A-Z_]+_\d$ | ★ | ID duy nhất (mẫu ở §2) |
station_upgrades[].station | string ^ST_[A-Z_]+$ | ★ | trạm |
station_upgrades[].n | integer [1..5] | ★ | số theo action |
offerings | [ object ] (6..6) | ★ | Lễ Vật LV01–LV06 |
offerings[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
offerings[].cost | number [0..] | ★ | giá: {CUR_*: số} |
offerings[].effect_vi | string | ★ | hiệu ứng |
offerings[].params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây |
offerings[].id | string ^LV\d{2}$ | ID duy nhất (mẫu ở §2) | |
unlock_nodes | [ object ] (1..) | ★ | nút mở khoá |
unlock_nodes[].id | string ^UNL_[A-Z0-9_]+$ | ★ | ID duy nhất (mẫu ở §2) |
unlock_nodes[].target | string | ★ | đích Edge doc 13 §5.4 |
unlock_nodes[].track | HERO · MODE · ASPECT · ULT · POOL · MOURNING · STATION | ★ | nhánh |
unlock_nodes[].condition_vi | string | ★ | điều kiện chữ |
unlock_nodes[].condition | → condition (§4.0) | ★ | điều kiện có cấu trúc {kind, ref, op, value} |
unlock_nodes[].cost | → cost (§4.0) | ★ | giá: {CUR_*: số} |
mastery | object | ★ | Thông Thạo |
mastery.xp_formula | string | ★ | công thức điểm Thông Thạo |
mastery.rank_cost | object | ★ | XP(MRn→n+1) = base + per_rank × n |
mastery.rank_cost.base | number [0..] | ★ | gốc |
mastery.rank_cost.per_rank | number [0..] | ★ | params mỗi bậc |
mastery.mode_mult | map enum → number [0..1] | ★ | nhân theo mode |
mastery.ranks | [ object ] (20..20) | ★ | 3 hạng I/II/III {params, text_template_vi} |
mastery.ranks[].id | string ^MR\d{2}$ | ★ | ID duy nhất (mẫu ở §2) |
mastery.ranks[].grants_vi | string | ★ | thưởng bậc |
mastery.ranks[].unlock_ids | [ string ] | id được mở | |
mastery.challenge_templates | [ object ] (5..5) | ★ | TT1–TT5 |
mastery.challenge_templates[].id | string ^TT[1-5]$ | ★ | ID duy nhất (mẫu ở §2) |
mastery.challenge_templates[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} |
mastery.challenge_templates[].params | → params (§4.0) | ★ | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây |
pools | object | ★ | pool chung |
pools.shared_edges_start | integer [0..72] | ★ | Edge chung sẵn |
pools.relics_start | integer [0..60] | ★ | Relic sẵn |
pools.unlock_cost_total | number [0..] | ★ | tổng giá mở |
flags | [ object ] | ★ | cờ |
flags[].id | string ^FLAG_[A-Z_]+$ | ★ | ID duy nhất (mẫu ở §2) |
flags[].condition_vi | string | ★ | điều kiện chữ |
flags[].effect_vi | string | ★ | hiệu ứng |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
economy | object | kinh tế meta doc 17 §10 | |
economy.meta_fixed_sinks | map ^CUR_[A-Z_]+$ → number [0..] | ★ | tổng đích cố định/tiền tệ |
economy.income_by_outcome | [ object ] | thu nhập theo kết quả run | |
economy.income_by_outcome[].outcome | string ^(D[1-5]|W|W6)$ | ★ | kết quả |
economy.income_by_outcome[].soul_ash | number [0..] | ★ | Tro Hồn |
economy.income_by_outcome[].echo_shard | number [0..] | ★ | Mảnh Vọng |
economy.income_by_outcome[].mastery | number [0..] | ★ | Thông Thạo |
economy.income_by_outcome[].minutes | number [0..] | ★ | phút |
economy.anti_grind_vi | [ string ] | luật chống cày | |
cosmetics | [ object ] | mỹ phẩm Nến Canh | |
cosmetics[].id | string ^(SKN_H\d{2}_\d|STATUE_[A-Z0-9_]+|MBOX_[a-z0-9_]+|ART_[a-z0-9_]+)$ | ★ | ID duy nhất (mẫu ở §2) |
cosmetics[].kind | SKIN · STATUE · MUSIC_BOX · PAINTING | ★ | loại (enum) |
cosmetics[].cost | → cost (§4.0) | ★ | giá: {CUR_*: số} |
cosmetics[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
4.23 npcs.json — npcs.schema.json (luật: doc 20 §8)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
npcs | [ object ] (7..7) | ★ | 7 NPC |
npcs[].id | string ^NPC_[A-Z]+$ | ★ | ID duy nhất (mẫu ở §2) |
npcs[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
npcs[].station | string ^ST_[A-Z_]+$ | any | ★ | trạm |
npcs[].role_vi | string | ★ | vai Bible §7.2 |
npcs[].arc_vi | string | chữ tiếng Việt | |
npcs[].arc | [ object ] (0..8) | ★ | beat arc / độ cung |
npcs[].arc[].beat | integer [1..8] | ★ | beat |
npcs[].arc[].trigger | → condition (§4.0) | ★ | trigger thẻ doc 13 §5.9 (PASSIVE, ON_HIT…) |
npcs[].arc[].dialogue | [ string ^DLG_[A-Z0-9_]+_\d{3}$ ] (1..) | ★ | thoại |
npcs[].payoff_vi | string | ★ | kết arc |
npcs[].murmur_sfx | string ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$ | lầm rầm không lời | |
npcs[].av_owner | = "ENV_HUB" | owner file AV | |
npcs[].codex | string ^CDX_[a-z0-9_]+$ | trang Sổ Tang CDX_* | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.24 dialogue.json — dialogue.schema.json (luật: doc 20 · 32 §9)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
lines | [ object ] (1..) | ★ | dòng thoại |
lines[].id | string ^DLG_[A-Z0-9_]+_\d{3}$ | ★ | ID duy nhất (mẫu ở §2) |
lines[].speaker | string | ★ | người nói |
lines[].listener | string | người nghe | |
lines[].context | HUB_BEAT · BOSS_INTRO · BOSS_PHASE · BOSS_DEFEAT · HERO_BOSS · DOCK · DEATH · EVT · ENDING · ASH_CARD · TUTORIAL · SHOP | ★ | ngữ cảnh |
lines[].trigger | → condition (§4.0) | ★ | trigger thẻ doc 13 §5.9 (PASSIVE, ON_HIT…) |
lines[].priority | integer [0..100] | ★ | ưu tiên 0–255 (0 cao) |
lines[].text_vi | string | ★ | chữ |
lines[].once | any | ★ | 1 lần |
lines[].next | string ^DLG_[A-Z0-9_]+_\d{3}$ | dòng kế | |
lines[].params | → params (§4.0) | số của hàng; khoá snake_case, giá trị số/chuỗi; mọi {param} trong chữ _vi phải có ở đây | |
lines[].max_chars | integer [1..400] | trần ký tự | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.25 endings.json — endings.schema.json (luật: doc Bible §7.6 · 16 §8.3)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
endings | [ object ] (3..3) | ★ | 3 kết |
endings[].id | string ^END_[A-Z_]+$ | ★ | ID duy nhất (mẫu ở §2) |
endings[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
endings[].condition_vi | string | ★ | điều kiện chữ |
endings[].conditions | [ → condition (§4.0) ] (1..) | ★ | điều kiện |
endings[].effects_vi | string | ★ | hậu quả |
endings[].unlocks | [ string ] | ★ | mở |
endings[].sets_flags | [ string ^FLAG_[A-Z_]+$ ] | cờ đặt | |
endings[].music | string ^MUS_[a-z0-9_]+$ | ★ | cue nhạc |
endings[].cards | [ object ] | thẻ theo hero | |
endings[].cards[].hero | string ^H\d{2}$ | ★ | hero chủ |
endings[].cards[].text_vi | string | ★ | chữ |
endings[].achievement | string ^ACH_[a-z0-9_]+$ | thành tựu | |
endings[].repeatable | any | ★ | lặp được |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.26 codex.json — codex.schema.json (luật: doc 20 §9)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
pages | [ object ] (1..) | ★ | trang codex |
pages[].id | string ^CDX_[a-z0-9_]+$ | ★ | ID duy nhất (mẫu ở §2) |
pages[].category | HERO · ENEMY · ELITE · BOSS · NPC · PLACE · LORE · RELIC · ADAPTIVE · LEDGER | ★ | loại |
pages[].subject | string | ★ | chủ thể |
pages[].title_vi | string | ★ | danh hiệu |
pages[].body_vi | string | ★ | nội dung |
pages[].unlock | → condition (§4.0) | ★ | điều kiện + giá mở |
pages[].ledger_page | any | ★ | trang Sổ Tang |
pages[].frame_data | any | hiện frame data | |
pages[].painting | any | có tranh | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.27 music.json — music.schema.json (luật: doc 32 §3.6–3.7)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa | ||
|---|---|---|---|---|---|
cues | [ object ] (1..) | ★ | cue nhạc (doc 32 §3.6) | ||
cues[].id | string ^MUS_[a-z0-9_]+$ | ★ | ID duy nhất (mẫu ở §2) | ||
cues[].context | string | ★ | ngữ cảnh | ||
cues[].state | TITLE · HUB · DOCK · EXPLORE · COMBAT · BOSS · GATE_MINI · FINALE · SECRET · DEATH · ENDING · DRAFT | ★ | state MusicDirector | ||
cues[].bpm | number/null | ★ | tempo | ||
cues[].meter | string | ★ | nhịp 4/4 | ||
cues[].key | string | ★ | giọng | ||
cues[].chords | string ^[A-Za-z0-9_]+\.chords\.json$|^-$ | file hợp âm | |||
cues[].intro_bars | integer [0..] | ★ | ô intro | ||
cues[].loop_bars | integer [0..] | ★ | ô loop | ||
cues[].loop_samples | integer [0..] | ★ | = round(loop_bars × phách/ô × 60/bpm × 44100) | ||
cues[].stems | [ string ^S[0-4]([a-z0-9]+)?$ ] (1..) | ★ | S0..S4 + biến thể | ||
cues[].adaptive | map key → any | ★ | khối thích nghi | ||
cues[].stingers | [ object ] | ★ | stinger | ||
cues[].stingers[].slug | string ^[a-z0-9_]+$ | ★ | slug | ||
cues[].stingers[].bars | number [0..] | ★ | ô | ||
cues[].stingers[].entry | next_bar · next_beat · immediate | ★ | điểm vào | ||
cues[].stingers[].cuts | [ string ^S[0-4]([a-z0-9]+)?$ ] | stem bị cắt | |||
cues[].transitions | object | ★ | quantize/fade/exit_to | ||
cues[].transitions.quantize | bar · beat · none | ★ | bar/beat | ||
cues[].transitions.fade_in_bars | number [0..] | ô fade vào | |||
cues[].transitions.fade_out_bars | number [0..] | ô fade ra | |||
cues[].transitions.exit_to | string | cue kế | |||
cues[].leitmotifs | [ string ^LM_[A-Z0-9_]+$ ] | ★ | LM_* | ||
cues[].mix | object | ★ | lufs_i_full/true_peak/ducked_by | ||
cues[].mix.lufs_i_full | number [-40..-10] | ★ | LUFS-I khi đủ stem | ||
cues[].mix.true_peak | number [-6..0] | ★ | dBTP | ||
cues[].mix.ducked_by | [ string ] | bị duck bởi | |||
cues[].files | [ string ] (1..) | ★ | đường dẫn file | ||
cues[].status | brief · demo · final · approved | ★ | STS_X:giây hoặc null | ||
cues[].h12_of | string ^MUS_[a-z0-9_]+$ | cue gốc của bộ H12 | |||
cues[].banned | [ string ] | timbre cấm riêng cue | |||
leitmotifs | [ object ] | ★ | LM_* | ||
leitmotifs[].id | string ^LM_[A-Z0-9_]+$ | ★ | ID duy nhất (mẫu ở §2) | ||
leitmotifs[].notes | string | ★ | nốt | ||
leitmotifs[].instrument_vi | string | ★ | nhạc cụ | ||
leitmotifs[].owner | string | chủ của hàng (Hxx | SHARED | owner AV) | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.28 achievements.json — achievements.schema.json (luật: doc Bible §11)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
achievements | [ object ] (1..60) | ★ | 60 thành tựu |
achievements[].id | string ^ACH_[a-z0-9_]+$ | ★ | ID duy nhất (mẫu ở §2) |
achievements[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
achievements[].desc_vi | string | ★ | chữ thẻ/tooltip, mẫu câu có {param} |
achievements[].condition | → condition (§4.0) | ★ | điều kiện có cấu trúc {kind, ref, op, value} |
achievements[].hidden | any | ★ | ẩn |
achievements[].steam_api_name | string ^[A-Z0-9_]+$ | ★ | tên API Steam |
achievements[].mercy_blocked | any | ★ | khoá khi Thương Xót |
achievements[].mourning_related | any | liên quan Độ Tang | |
achievements[].icon | string | tên sprite icon icon_<slug> | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.29 curves.json — curves.schema.json (luật: doc 17 §1–§9)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
curves | [ object ] (8..) | ★ | đường cong CRV_ |
curves[].id | XP lên cấp kế CRV_xp_level · Hệ số XP nhận theo Hồi CRV_xp_act_mult · Chỉ số sức mạnh build theo phút CRV_power_index · Nhân HP địch theo Hồi lệch gốc CRV_enemy_hp_act · Nhân sát thương địch theo Hồi lệch gốc CRV_enemy_dmg_act · Trọng số rarity draft theo may mắn CRV_rarity_luck · Vàng Mã icon GOLD theo Hồi CRV_gold_room · `CRV_master… | ★ | ID duy nhất (mẫu ở §2) | ||
curves[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
curves[].kind | FORMULA · TABLE | ★ | loại (enum) |
curves[].formula | string | công thức | |
curves[].x | string | ★ | trục x |
curves[].y | string | ★ | trục y |
curves[].x_unit | string | đơn vị x | |
curves[].y_unit | string | đơn vị y | |
curves[].interp | LINEAR · STEP · NONE | ★ | nội suy |
curves[].points | [ object ] | điểm {x,y} | |
curves[].points[].x | number/string | ★ | trục x |
curves[].points[].y | number/object | ★ | trục y |
curves[].checks | [ object ] | ví dụ VD- kiểm | |
curves[].checks[].x | number/string | ★ | trục x |
curves[].checks[].y | number | ★ | trục y |
curves[].checks[].vd | string ^VD-[A-Z0-9]+$ | id ví dụ doc 17 | |
curves[].assumed | any | true = có số [ASSUMED] lượt đầu, playtest chỉnh | |
curves[].doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.30 tuning.json — tuning.schema.json (luật: doc 13 §0 · 14 §16 · 15 §14 · 17 §11.2)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
sections | map enum → map ^[a-z][a-z0-9_.]*$ → object | ★ | section → khoá → núm |
ai_archetypes | [ object ] | ai_archetypes.csv | |
ai_archetypes[].ai | swarm_melee · lunger · ranged_kiter · ranged_lead · shield_bearer · bomber_self · ambusher · stationary · flyer_swarm · `spawner_mo… | ★ | archetype AI doc 14 §2.2 | ||
ai_archetypes[].engage_range | [ number [0..] ] (1..2) | ★ | tầm giao chiến |
ai_archetypes[].slot_ring | inner · outer · none | vòng vây | |
ai_archetypes[].keep_min | number [0..] | giữ cự ly min | |
ai_archetypes[].keep_max | number [0..] | giữ cự ly max | |
ai_archetypes[].flee_dist | number [0..] | chạy xa | |
ai_archetypes[].flee_time | number [0..] | chạy giây | |
ai_archetypes[].token_kind | [ MELEE · PROJ · P_FLOOR · HEAVY · SIGNATURE · NONE ] (1..) | ★ | token |
ai_archetypes[].approach_mode | string | cách tiếp cận | |
ai_archetypes[].special_vi | string | ★ | đặc biệt |
ash_spawn_shift | [ object ] | vai khắc chế theo trục | |
ash_spawn_shift[].axis | string | ★ | trục |
ash_spawn_shift[].dir | HIGH · LOW · LEFT · RIGHT · SIDE | ★ | HIGH/LOW/LEFT/RIGHT/SIDE |
ash_spawn_shift[].counter_roles | [ swarm · lunge · ranged · shield · self_destruct · bomber · dive_bomb · lead_shot · ambush · turret · flyer_slow · nest … (2… | ★ | vai khắc chế |
ash_spawn_shift[].note_vi | string | ghi chú thiết kế | |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
4.31 psp_axes.json — psp_axes.schema.json (luật: doc 14 §7)
| Field | Kiểu / giá trị cho phép | ★ | Nghĩa |
|---|---|---|---|
axes | [ object ] (12..12) | ★ | 12 trục PSP |
axes[].id | string ^A\d{2}$ | ★ | ID duy nhất (mẫu ở §2) |
axes[].key | string ^[A-Z_]+$ | ★ | giọng |
axes[].name_vi | string | ★ | tên hiển thị tiếng Việt có dấu |
axes[].measure_vi | string | ★ | đo gì |
axes[].range | [ number ] (2..2) | ★ | tầm px |
axes[].windows | [ W10 · W20 · MESO · MACRO ] (1..) | ★ | cửa sổ đo |
axes[].dirs | [ HIGH · LOW · LEFT · RIGHT · SIDE ] (1..) | ★ | hướng / số hướng |
axes[].sub_keys | [ string ] | khoá con | |
axes[].visible_base | any | ★ | BASE đọc được |
axes[].habit_vi | string | ★ | thói quen bị đọc |
doc | string | ★ | doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8) |
75. Tham chiếu chéo (luật; validate.py --all kiểm)
| Field tham chiếu | Phải trỏ tới | Ghi chú |
|---|---|---|
mọi chuỗi khớp mẫu VFX_/SFX_/BARK_ (trừ field id) | id trong av/<owner>*.json của đúng chủ (§2.2) | owner file chưa có → WARN "chưa kiểm được", không ERROR |
vfx_id, sfx_id trên đòn hero, kỹ năng, ult, ĐÁP, verb giữ, Lướt; vfx, sfx trên đòn địch, quái, boss, hazard | ≥ 1 id mỗi loại (schema bắt buộc) | file chủ chỉ được tham chiếu media của chính chủ + SHARED/UI |
move_ids[], defense.*.move_id, av.echo_move.move_id | moves[].move_id cùng file hero | |
params.target (Edge, Relic) | Hxx_MV_<X>: moves[].alias = X hoặc move_id = Hxx_X trong heroes/<owner>.json; Hxx_* phải cùng owner; Edge chung/Relic cấm Hxx_* | doc 13 §5.4 |
params.offer_requires | EDGE:/SKILL:/UL:/AS:/RS1:/RS2:/LV: + id tồn tại | 1 điều kiện, không chuỗi (doc 13 §5.2) |
params.tpl | templates[].id của hero_upgrades/<Hxx>.json hoặc shared_edges.json | action = CUSTOM_HOOK |
mechanic, mechanic_key | cặp trigger × primitive trong mechanics.json; primitive phải hợp lớp + chủ (doc 12 §10.3, §10.6) | kỹ năng/ult/Dạng Rèn: MECH/RES của owner · Edge/RS/EVO hero: owner hoặc FRAME/PARAM/STS ái lực · SE/SRS/RL/AF: owner SHARED |
status, statuses[].status, tag STS_* | statuses.json | |
tag trong tags[], verb_tags[] | tags.json (+ sub-tag) | |
EN_/EL_/MB_/BS_ | enemies/*, bosses/* (seed từ _bible.json) | wave_scripts BEAT/MIX chỉ id của roster biome đó |
<enemyId>_Ann trong links, targets, variant_attack, phases[].attacks, combos, chain_answer_attacks | attacks[].id cùng chủ | |
CUR_* · NPC_* · ST_* · FLAG_* · END_* · EM/MRN/MUT | currencies · npcs · meta.stations · meta.flags · endings · danh mục tương ứng (seed _bible.json) | |
MUS_* · ACH_* · CDX_* · DLG_* · WS_* · OBJ_* · RM_/HZ_/LMK_/ENV_ | music · achievements · codex · dialogue · encounters.wave_scripts · biomes[].objective_props · biomes/av/ENV_* |
- Thiếu file nguồn của 1 loại → validator in WARN "N tham chiếu loại X chưa kiểm được: thiếu file nguồn …" (không chặn), để agent điền dần theo thứ tự bất kỳ.
- Không file nào chép số canon từ
_bible.jsonkhác giá trị: validator so tên/HP/tốc/cửa sổ ĐÁP/màu slot/verb_tags hero, tên quái/hạng khối/adaptive_source, tên MRN/MUT/EM/NPC/tiền tệ, giáUP_*.
86. tools/validate.py
py -3 GDD/Full/tools/validate.py --file GDD/Full/data/heroes/H03.json # 1+ file: schema + kiểm nội file
py -3 GDD/Full/tools/validate.py --all # mọi file + chéo + coverage + đếm
--data <dir> thư mục data (mặc định ../data) --strict WARN = ERROR --quiet chỉ in ERROR
- Lỗi in dạng
ERROR <file> <json path>: <thông điệp>(vdERROR enemies/B1.json $.enemies[0].attacks[0].windup_s: windup 0.20 s < sàn 0.30 s …); exit 1 khi có ERROR, 0 khi chỉ WARN. --allin COVERAGE (file cần / có / thiếu theo nhóm, gồm 39 chủ AV) và COUNTS (số id đã định nghĩa theo loại so với đích 1.0: hero 12, kỹ năng 96, ult 36, Dạng Rèn 36, Edge hero 480, RS 72, EVO 48, SE 72, SRS 11, Relic 60, affix 24, STS 12, EM 16, MRN 15, MUT 12, sự kiện 40, ACH 60, kết 3, NPC 7, quái 52, nhạc 22). File thiếu = WARN, không sập.- Kiểm nội file (ngoài schema):
| Nhóm | Kiểm |
|---|---|
| chung | id trùng (theo khối), mã màu #RRGGBB, {param} giải được, ngoặc cân, tiền tố id khớp chủ, media chỉ của chủ/SHARED/UI |
| màu (INV-01) | #ffd84a/#b14cff chỉ trong VFX tell; hue 32–62°/260–290° S ≥ 45% cấm ở hero/địch/env; thân địch cấm đỏ thẫm (hue 340–10°, S > 30%); env S ≤ 40% |
| hero | id = file; canon _bible.json (tên, danh hiệu, độ khó, mốc, verb_tags đúng thứ tự, HP/tốc/cửa sổ ĐÁP, slot_hex; H02 vô sắc); độ khó = bậc Σ trục; res_id = RES:<X>; res_min ≤ res_start ≤ res_max, mốc tăng dần; slot bắt buộc COMBO_A (3–6 cú, đúng 1 finisher HEAVY + shieldbreak), HEAVY, DASH_ATTACK, COUNTER; invuln_ticks trong clip; SK01–08 đúng vai + MR mở; ≥ 1 kỹ năng shieldbreak; ≥ 2 kỹ năng res_cost 0; 8 primitive kỹ năng khác nhau; cancel_into theo §4.0a (token đóng, không trùng ACTION, tick ≤ tổng tick đòn, COMBO_B cần slot, token cũ = ERROR, ô trùng mặc định = WARN); UL1–3 vai/thời lượng/giá; AS1 gốc, AS2/3 giá 8/15 + key passive.*; music_stem chỉ H12; 41 VFX / 28 SFX (WARN) |
| hero_upgrades | E01–E40 thứ tự; owner/hook đúng hero; E37–E40 Then Chốt LEGENDARY MR10 2 tag; 16 C / 13 R / 7 E; tag chính theo khối verb_tags (H01 E01–E18 miễn); max_rank theo rarity; mảng hạng dài = max_rank; STAT cần stat; CUSTOM_HOOK cần tpl; ≤ 8 offer_requires; ≤ 4 nhóm offer_excl 2–3 Edge; PARAM ≤ 8, FRAME ≤ 6, STS ≤ 4, tag phụ ULT ≤ 3; RS*n* = tag n, bậc 3/5; EVO1–3: 2 nguồn khác tag chính, không Then Chốt, ≥ 1 C/R, 3 kind khác nhau, MR01; EVO4: BS_B3, MR12 |
| pool chung | SE khối tag theo §5.5 doc 13, không tag verb, 40 pool_start; SRS01–08 rule_change_vi; Relic 22/16/10/12, Lời Nguyền chỉ SEC, cái giá bắt buộc RARE/EPIC/CURSED, 1 MK/Relic; affix OFF 10/DEF 6/UTIL 8, max − min bội step |
| quái/boss | id theo biome/file; tier theo class; MASS theo hạng; tốc gốc ≤ 118 (INV-05); windup ≥ sàn doc 11 §1.2 theo tell × hạng; Y×n chỉ tell Y, khe ≥ 0.35; link/variant/phase trỏ đòn có; ASH cần ash_default_vi; đạn P ≤ 140 px/s, proj_cat khớp tell; N ≤ 4/tick; đòn gây sát thương phải có tell; P sàn quái S ăn P_FLOOR; M/L/XL mỗi pha ≥ 50% nhịp Y có trọng số (INV-15); CV: số lượng theo hạng, thr_off = thr_on − 0.15, feint ≤ 0.35, ASH ↔ budget 1, BASE chỉ trục A04/A09, Sẹo chỉ BS_B1–B4; canon _bible.json; boss: pha 1..n, sân rỉ ≥ 6/20 s, boss Hồi hồi ≥ 60%, mini 1 Mảnh Vọng |
| AV | owner = file, id theo §2.2; actor: L/XL construct cần parts, XL cần phases, hero/NPC/L/XL cần portraits; VFX TELL tint FIXED + lod never, HERO tint EXPORT/HERO_LUT, canvas ≤ trần hạng, dirs 1/8, fps 30 (12/15 chỉ loop), pha tăng dần; SFX tell Y/P chỉ asset chung hoặc lớp phụ, âm lặp ≥ 3 biến thể, loop cần điểm loop, one-shot ≤ 1.5/4.0 s, nguồn freesound/synth cần query/recipe; bark 1 dòng |
| biome · encounters · run_map · music · danh mục | id con theo biome; hazard P ăn token tím; WS: id khớp biome+mục tiêu, row duy nhất, ≥ 1 WIN, MIX tổng 100, không beat < 2 s, beat cách ≥ 8 s, RING p1 ≥ 140/p2 ≥ 45, HAZ ≥ 1.0 s, quái thuộc roster; MIX Director tổng 100; 6 Hồi I..VI, 11 nút canon; loop_samples đúng công thức; STS đủ 12; tag đúng thứ tự canon; MRN/MUT/EM/A liên tục + tên canon; UP_* giá canon; mechanics: 1 primitive ≤ 1 chủ, owner khớp territory |
- Kiểm chéo (
--all): §5 + keymechanicngoài từ vựngmechanics.json. - Thêm luật mới vào validator: sửa
tools/validate.py+ bảng trên cùng lượt.
97. Ví dụ gọn (1/thực thể; … = field bắt buộc khác lược bỏ; số = minh hoạ hình dạng, số thật ở file dữ liệu)
| Thực thể | JSON |
|---|---|
| hero (khung) | {"id":"H01","identity":{"id":"H01","name":"Varek","title_vi":"Kẻ Gặt Tro","role_group":"MELEE_FAST","difficulty":2,"difficulty_axes":{"T":1,"R":1,"V":0,"S":0,"D":0},"unlock":{"condition_id":"NONE","condition_params":{},"echo_shard_cost":0},"milestone":"MS02","verb_tags":["COMBO","DASH","ANSWER:DEFLECT","ANSWER:GUARD","RES:FLOW","SKILL"],…},"stats":{"HP_MAX":120,"MOVE_SPEED":135,"ANSWER_WINDOW":0.16,"POISE_MAX":100,"dash_px":84},…,"doc":"12-Hero-Framework §8"} |
| tài nguyên | {"res_id":"FLOW","res_name_vi":"Dòng Chảy","res_kind":"GAUGE","res_min":0,"res_max":100,"res_start":0,"gain":[{"event":"attack","amount":4}],"spend":[],"decay":{"delay_s":4,"rate_per_s":6,"floor":0},"on_hit_taken":-25,"thresholds":[{"value":50,"state_id":"FLOW_SURGE","state_name_vi":"Cuồng Lưu","effect_vi":"+{spd}% tốc chạy","params":{"spd":10}}],"full_event":"res_full",…} |
| đòn hero | {"move_id":"H01_COMBO_A_3","alias":"A3","slot":"COMBO_A","anim":"attack_3","startup_t":6,"active_t":4,"recovery_t":10,"coef":1.6,"dmg_kind":"MELEE","hit_class":"HEAVY","shape":{"shape":"ARC","r":48,"arc":160},"max_targets":48,"poise_dmg":30,"hitstop_s":0.05,"trauma":0.2,"armor_tier":"NONE","flags":["finisher","shieldbreak"],"vfx_id":"VFX_H01_a3_slash","sfx_id":"SFX_H01_a3_swing"} |
| kỹ năng | {"id":"H01_SK01","name_vi":"Lưỡi Liềm Đỏ","role":"CLEAR","unlock_mr":"MR01","cast_mode":"TAP","cooldown_s":7,"res_cost":0,"move_ids":["H01_SK01_HIT"],"ranks":[{"params":{"coef":2.0},"text_template_vi":"Bắn sóng gây {coef}× Lực."},…×3],"rank3_behavior_vi":"sóng để lại vệt","tags":["SKILL"],"mechanic_key":"skill.crescent_wave","icon":"icon_h01_sk01","shieldbreak":false,"vfx_id":"VFX_H01_SK01_wave","sfx_id":"SFX_H01_SK01_cast"} |
| ult | {"id":"H01_UL1","role":"AREA","unlock":{"mr":"MR01"},"invuln_ticks":[0,120],"duration_s":2.0,"move_ids":["H01_UL1_BURST"],"world_slow":0.5,"mechanic_key":"ult.blink_strike","text_template_vi":"Nổ r{r}.","params":{"r":128},…} |
| Dạng Rèn | {"id":"H01_AS2","weapon_layer":"sickle_hook","combo_params":{"tempo_mult":0.9,"arc_add":20,"range_add":0},"res_rule_override":{"field":"decay","value":{"delay_s":3}},"new_clip":null,"hue_shift":2,"unlock":{"echo_shard":8},"difficulty_axis_delta":null,"mechanic_key":"passive.dash_refund","text_template_vi":"…"} |
| Edge hero | {"id":"H01_E01","owner":"H01","name_vi":"Cung Rộng","tags":["COMBO"],"rarity":"COMMON","max_rank":3,"trigger":"PASSIVE","action":"MODIFY_MOVE","stat_mode":"INC","params":{"target":"VERB:COMBO","radius_inc":[20,35,50],"arc_add":[25,44,63]},"desc_vi":"Combo: bán kính +{radius_inc}%, cung +{arc_add}°.","hook":"H01.wide_arc","linchpin":false,"unlock_rank":"MR01","mechanic":"passive.arc_widen","demo_id":"E01"} |
| Then Chốt | {"id":"H01_E37","rarity":"LEGENDARY","max_rank":1,"tags":["ANSWER:DEFLECT","DASH"],"trigger":"ON_ANSWER","action":"CUSTOM_HOOK","stat_mode":"NONE","params":{"tpl":"TPL_H01_lp37","n":1},"linchpin":true,"unlock_rank":"MR10","mechanic":["answer.dash_refund","dash.answer_refresh"],…} |
| Cộng Hưởng | {"id":"H01_RS5","owner":"H01","tag":"RES:FLOW","tier1":{"at":3,"desc_vi":"Dòng Chảy nhận +{v}%","params":{"v":15}},"tier2":{"at":5,"desc_vi":"…","params":{},"rule_change_vi":"Cuồng Lưu không giảm khi trúng đòn"},"mechanic":"res_full.res_floor"} |
| Tiến Hoá | {"id":"H01_EVO4","awakening":true,"requires_edges":[],"requires_resonance2":[],"condition":{"kind":"BOSS_KILLED","value":"BS_B3"},"unlock_rank":"MR12","mechanic":"passive.weapon_awaken","vfx_id":"VFX_H01_EVO4_awaken","sfx_id":"SFX_UI_evo_fuse",…} |
| Edge chung | {"id":"SE001","owner":"SHARED","tags":["CRIT"],"rarity":"COMMON","max_rank":3,"trigger":"PASSIVE","action":"STAT","stat":"CRIT_CHANCE","stat_mode":"FLAT","params":{"value":[10,18,25]},"desc_vi":"Tỉ lệ chí mạng +{value}%.","hook":"SHARED.crit_flat","mechanic":"passive.stat_boost","pool_start":true,"unlock_cost":{},"demo_id":"E20"} |
| SRS | {"id":"SRS09","tags":["STS_EMBER","STS_FROST"],"pair":true,"tier1":{"at":2,…},"tier2":{"at":3,…},"reaction_vi":"Nứt Nhiệt","mechanic":"status.status_consume"} |
| Relic | {"id":"RL001","rarity":"RARE","cursed":false,"system":"ANSWER_HOLD","rule":{"trigger":"PASSIVE","action":"STAT","stat":"ANSWER_WINDOW","stat_mode":"FLAT","params":{"value":0.05},"hook":"SHARED.wide_answer"},"desc_vi":"Cửa sổ ĐÁP +{value} s.","drawback_vi":"— Tốc đánh −20%.","affix_slots":2,"pool_start":true,"unlock_cost":{},"source_nodes":["ELT","MBS","SHP","DOCK"],"demo_id":"R01","mechanic":"answer.stat_boost",…} |
| affix | {"id":"AF01","group":"OFF","stat":"ATK_SPEED","stat_mode":"INC","unit":"%","min":6,"max":14,"step":1,"hero_filter":"NONE","desc_vi":"Tốc đánh +{value}%","demo_id":"X01"} |
| primitive · lãnh thổ | {"id":"crescent_wave","family":"F01","class":"MECH","owner":"H01","exclusive":true,"dmg_kind":"PROJ","params":["len","w","speed","coef"],"desc_vi":"sóng lưỡi bay thẳng xuyên"} · {"hero":"H01","owns":["crescent_wave",…11],"sts_affinity":["STS_DREAD","STS_SHOCK"],"control_vi":"STS_STUN (ĐÁP chung)","dmg_kind_main":["MELEE"]} |
| quái + đòn | {"id":"EN_B1_01","name_vi":"Thây Tro","class":"normal","tier":"S","rig":"biped","ai":"swarm_melee","home_act":1,"stats":{"HP":14,"MOVE_SPEED":52,"RADIUS":6,"MASS":1,"ARMOR":0},"attacks":[{"id":"EN_B1_01_A01","tell":"Y","windup_s":0.40,"dmg":6,"token":"MELEE","adaptive_source":"BASE","vfx":["VFX_EN_B1_01_A01_claw"],"sfx":["SFX_EN_B1_01_a01_claw"],…}],"spawn":{"weight":70,"group":[6,12],"tp":0.5,"cap_group":"SWARM","cap_alive":null,"nodes":["CMB"]},…} |
| thế đáp CV | {"cv_id":"EL_B1_01_CV1","layer":"MESO","adaptive_source":"ASH","axis":"A01.DEFLECT","dir":"HIGH","thr_on":0.6,"thr_off":0.45,"min_rooms":2,"effect_type":"WEIGHT_MULT","targets":["EL_B1_01_A02"],"mult":{"EL_B1_01_A02":1.8},"phase_mask":[1],"answers":["DASH","DEFLECT"],"recover_add_s":0.25,"feint":0,"budget_cost":1,"scar_ok":0,…} |
| pha boss | {"phase":2,"name_vi":"Chuông Nứt","hp_enter_pct":60,"invuln_s":1.0,"rest_s":0.6,"attacks":["BS_B1_A03","BS_B1_A04"],"form_vi":"chuông nứt đôi"} |
| Ấn Tinh Anh | {"id":"EM01","name_vi":"Giáp Đồng","effect_vi":"Thế +{poise_pct}%","params":{"poise_pct":50},"adaptive_source":"BASE","mrn05_safe":true,"uses_purple_token":false,"glyph":"glyph_em01"} |
| actor | {"id":"EN_B1_01","code":"en_b1_01","tier":"S","biome":"B1","rig":"biped","silhouette":{…},"skeleton":{"M":{},"bulk":{}},"weapon":{"stock":"claw","desc_vi":"móng xương"},"ramps":{…},"facing":"sw","clips":[…],"sockets":{…},"reactions":{"skin":"char","flash_s":0.06,"mass_class":"S"},"vfx_owned":[…],"budget":{…},"export":{"commands":["node tools/hero.mjs en_b1_01"]},"review":{"art_style_reviewer":"pending"}} |
| VFX | {"id":"VFX_H01_a1_slash","owner_class":"HERO","tint":"EXPORT","trigger":"attack1 hit t=0","layer":"body_front","size_class":"M","canvas":{"w":96,"h":64,"origin":[48,40]},"pivot":"feet","dirs":8,"frames":{"count":8,"fps":30,"loop":false,"duration_s":0.27},"phases":{"antic":[0,0.03],"impact":[0.03,0.1],"dissipate":[0.1,0.27]},"keyframes":[…],"primitives":["swing r48"],"palette":["#3a0a10","#e0283a","#fff6f0"],"easing":{"curve":"outQuart"},"hitbox":{"shape":"sector r48 a160","match":"phủ 96%"},"perf":{…},"lod":"L2","source":"reuse heroes/varek-attack1","export":"node tools/render.mjs …","review":{"art_style_reviewer":"pending"},"desc_vi":"…"} |
| SFX | {"id":"SFX_H01_a1_swing","owner":"H01","hook":"HeroAttackCut move=A1","frame":"cut","kind":"swing","layers":[{"role":"transient","desc_vi":"cạo thép"},…],"length_ms":220,"variants":4,"pitch_rand_pct":6,"vol_rand_db":1.5,"priority":40,"max_voices":2,"cooldown_ms":60,"steal":"oldest","spatial":"center","clock":"World","bus":"HeroAttack","lufs_mmax":-19,"loop":false,"tell_class":"none","source":"freesound","brief_vi":"…; KHÔNG nghe như dao phay","freesound_query":"sword whoosh","status":"brief","verdict":"pending"} |
| bark | {"id":"BARK_BS_B1_intro","speaker":"BS_B1","trigger":"boss_intro","text_vi":"Chuông chưa gióng cho ngươi.","priority":"boss","cooldown_s":4} |
| hazard · phòng | {"id":"HZ_B1_collapse","tell":"P","period_s":12,"windup_s":0.45,"hits_enemies":true,"shape":{"shape":"CIRCLE","r":40},"uses_purple_token":true,…} · {"id":"RM_B1_crypt_yard","shape":"arena","size_px":[960,1080],"spawn_edges":["ANY"],"objectives":["PURGE","VIGIL"],"node_types":["CMB","CHL"]} |
| wave script | {"script_id":"WS_B1_PURGE_01","biome":"B1","objective":"PURGE","nodes":["CMB","CHL"],"home_act":"I","t_target_s":50,"rows":[{"row":1,"trigger":"T","at":0,"action":"BUDGET","n":1.0},{"row":2,"trigger":"T","at":0,"action":"MIX","target":"EN_B1_01","n":100},{"row":3,"trigger":"T","at":12,"action":"BEAT","target":"EN_B1_01","n":8,"pattern":"RING","p1":160,"p2":60},{"row":4,"trigger":"EV","at":"kills>=150","action":"WIN"}],"desc_vi":"…"} |
| nút · khuôn làn | {"id":"CMB","name_vi":"Giao Tranh","frame":"C","t_s":{"I":55,"II":60,"III":60,"IV":60},"icon":"icon_node_cmb","reward_rule_vi":"icon thưởng §4.2"} · {"id":"LN_STD_A","r1":"C","r2":"G","r3":"U","r4":"C","r5":"C","weight":3} |
| sự kiện | {"id":"EVT_B2_04","biome":"B2","name_vi":"…","text_vi":"…","choices":[{"text_vi":"…","cost":{"CUR_PAPER_GOLD":50},"outcome":{"kind":"GAIN_RELIC","params":{"rarity":"RARE"}},"outcome_vi":"…"},…],"weight":1,"once_per_run":true} |
| Khăn Tang · mutator · mode | {"id":"MRN01","name_vi":"Tro Dày","effect_vi":"HP địch +{hp_pct}%/bậc","max_rank":3,"points_per_rank":1,"per_rank":[{"hp_pct":12},{"hp_pct":24},{"hp_pct":36}],"unlock":"END_BELL_TOLL","guards":["INV-03"],"uses_purple_token":false,"glyph":"glyph_mrn01"} · {"id":"MUT01","name_vi":"Trăng Tro",…} · {"id":"DAILY","mastery_mult":0.5,"seeded":true,…} |
| tiền tệ | {"id":"CUR_SOUL_ASH","name_vi":"Tro Hồn","scope":"meta","color_hex":"#c9c2b4","sources":[{"key":"room_clear","desc_vi":"xong phòng chiến","amount":"30/35/40/45"}],"sinks":[{"key":"restoration","desc_vi":"Phục Dựng","amount":"500–6000"}],"income_target_vi":"…","mode_mult":{"DAILY":0.5,"CUSTOM":0}} |
| meta | {"id":"UP_FORGE_1","station":"ST_FORGE","n":1,"name_vi":"Lửa Rèn I","cost":150,"effect_vi":"+3% sát thương","params":{"dmg_inc":3}} |
| NPC · thoại · kết · codex | {"id":"NPC_ULLA","station":"ST_HEARTH","arc":[{"beat":1,"trigger":{"kind":"RUNS","op":">=","value":1},"dialogue":["DLG_ULLA_HUB_001"]}],…} · {"id":"DLG_ULLA_HUB_001","speaker":"NPC_ULLA","context":"HUB_BEAT","trigger":{"kind":"RUNS","op":">=","value":1},"priority":50,"text_vi":"…","once":true} · {"id":"END_BELL_TOLL",…} · {"id":"CDX_en_b1_01","category":"ENEMY","subject":"EN_B1_01",…} |
| nhạc | {"id":"MUS_b1_grave_hill","context":"COMBAT/EXPLORE Hồi I","state":"COMBAT","bpm":132,"meter":"4/4","key":"D Phrygian","chords":"MUS_b1_grave_hill.chords.json","intro_bars":2,"loop_bars":32,"loop_samples":2565818,"stems":["S0","S1","S2","S3","S4"],"adaptive":{},"stingers":[{"slug":"elite_in","bars":2,"entry":"next_bar"}],"transitions":{"quantize":"bar","fade_in_bars":1,"fade_out_bars":2,"exit_to":"MUS_boss_b1_bell_warden"},"leitmotifs":["LM_BELL"],"banned":["lead sóng vuông"],"mix":{"lufs_i_full":-16,"true_peak":-1},"files":["Assets/_Project/Audio/Music/MUS_b1_grave_hill/MUS_b1_grave_hill__S0.ogg"],"status":"brief"} |
| thành tựu · đường cong · núm | {"id":"ACH_ash_crown","hidden":true,"steam_api_name":"ACH_ASH_CROWN","mercy_blocked":false,…} · {"id":"CRV_xp_level","kind":"FORMULA","formula":"8 + 6*L + 1.2*L^2","x":"L","y":"XP lên cấp kế","interp":"NONE","checks":[{"x":12,"y":252.8}],"doc":"17 §2.1"} · "draft":{"luck_per_rarity":{"value":1.0,"unit":"x","assumed":true,"doc":"13 §3.2"}} |
| trục PSP | {"id":"A01","key":"DEF_MIX","name_vi":"Pha phòng thủ","measure_vi":"…","range":[0,1],"windows":["W20","MESO"],"dirs":["HIGH","LOW"],"visible_base":false,"habit_vi":"bạn Gạt {pct}%"} |
108. Render & ánh xạ CSV cho Unity (build đọc JSON, không ngược lại)
| Bản render | Nguồn JSON | Khoá |
|---|---|---|
hero_moves_<Hxx>.csv (doc 12 §8.6) | heroes/<Hxx>.json moves[] (cột = field §4.0 hero_move; shape trải thành shape,r,r_in,arc,…; mảng → a|b) | move_id |
hero_kit_<Hxx>.json (doc 12 §8) | heroes/<Hxx>.json trừ moves | id |
hero_edges_<Hxx>.csv | hero_upgrades/<Hxx>.json (Edge/RS/EVO, params → JSON 1 ô) | id |
enemy_attacks.csv (doc 11, 14 §1.3) | enemies/*.json + bosses/*.json attacks[] (links → to:p:gap_min:gap_max) | <enemyId>_Ann |
ash_counters.csv (doc 14 §12) | adaptive.counters[] + adaptation.counters[] | cv_id |
ai_archetypes.csv · ash_spawn_shift.csv · ai_tuning.csv · ash_tuning.csv | tuning.json (ai_archetypes, ash_spawn_shift, section ai/ash) | ai · axis+dir · key |
wave_scripts.csv (doc 15 §11) | encounters.json wave_scripts[].rows[] (+ cột script_id) | script_id+row |
run_structure.csv · lane_templates.csv · node_types.csv · reward_tables.csv · shop_prices.csv · map_fallback.json (doc 16 §12) | run_map.json | như doc 16 |
audio_sfx.csv (doc 32 §4.2) · audio_music.json (doc 32 §3.6) | av/*.json sfx[] · music.json cues[] | id |
Design/ArtSpecs/actors/, env/, vfx/ <ID>.md (doc 30/31) | av/*.json actors[] · env_assets[] · vfx[] | id |
PlatformTuning.csv (doc 01 §5.1) | tuning.json section platform | key |
config/ea_roadmap.json (doc 40 EaProgress, doc 43 §4) — file runtime {ms, month, items_vi[]} | lộ trình EA ở doc 43 §4 | ms |
Assets/_Project/Data/credits.json (doc 40 §5.7.1) — {sections[{title_key, lines[]}]}, sinh lúc build | danh sách credit doc 40 §5.7.1 | title_key |
11Quy tắc cho dev/AI
- Chỉ sửa JSON trong
GDD/Full/data/; CSV/MD/HTML là bản render. Mỗi lần sửa:py -3 GDD/Full/tools/validate.py --file <file>→ 0 ERROR trước khi giao; trước merge:--all0 ERROR. - Tên field = đúng schema (sai 1 ký tự = schema ERROR do
additionalProperties: false). Field mới chỉ qua sửatools/schema+ §4 doc này + dòng Quyết định. - ID theo §2; không đổi ID sau khi ship; id con mang tiền tố chủ (Cào EN_B1_01_A01,
VFX_H03_…). Không tạo id ngoài dải canon (Edge 41+, SE073+, RL061+) khi chưa có DEC ở Bible. - Mọi đòn hero/kỹ năng/ult/ĐÁP/verb giữ/Lướt có
vfx_id+sfx_id; mọi đòn địch/quái/boss/hazard cóvfx+sfx; id đó phải được định nghĩa trongav/<chủ>.json(hoặcSHARED/UI) trước khi--allsạch. - Chữ thẻ là mẫu câu
{param}; số gameplay đặt trongparams, không viết cứng trong chữ. Không khoảng số trong dữ liệu: 1 giá trị, kèmassumed: truenếu là lượt đầu. - Mảng theo hạng
[I, II, III]dài đúngmax_rank; giá trị không theo hạng là vô hướng. mechanic/mechanic_keylấy từmechanics.json(từ vựng đóng); không chế key mới — thêm primitive = sửa doc 12 §9/§10 +mechanics.jsoncùng lượt.- Số canon (
_bible.json) chép đúng giá trị; lệch → validator ERROR; muốn đổi → DEC ở Bible §12, không sửa dữ liệu trước. - Màu: chỉ VFX
owner_class: TELLdùng#ffd84a/#b14cff; mọi palette khác tránh dải tell (INV-01); validator chặn. - File lớn được tách (
av/H01__skills.json), không tách thực thể khác; mỗi file ≤ 1 owner. - Không ghi tên game/studio/thương hiệu/nhân vật có thật vào bất kỳ chuỗi nào.
12Quyết định đã chốt
| Q | Quyết định | Lý do |
|---|---|---|
| Nguồn sự thật dữ liệu? | JSON GDD/Full/data/ + schema tools/schema/ (draft 2020-12, strict); CSV/MD/HTML là render | 1 nguồn, máy kiểm được, agent điền song song |
| 2026-11-07 — File bản đồ run? | thêm run_map.json (schema run_map) chứa bảng doc 16 §12 | doc 16 cần 6 bảng dữ liệu, danh sách file gốc chưa có chỗ |
2026-11-07 — Doc 32 ghi audio_music.json/audio_sfx.csv? | nguồn = music.json + av/*.json sfx[]; 2 tên doc 32 là bản render (§8) | 1 nguồn; SFX đi cùng chủ của nó |
2026-11-07 — Doc 12 §8 ghi hero_kit_<Hxx>.json + CSV đòn/Edge? | nguồn = heroes/<Hxx>.json (khối identity/visual/stats/resource/passive/input_override/defense/moves/skills/ultimates/aspects/mastery/av) + hero_upgrades/<Hxx>.json; 3 tên doc 12 là render | gom theo thực thể, giữ nguyên tên field doc 12 bên trong khối |
2026-11-07 — Field chữ doc 12 không có _vi? | đổi tên thêm _vi: text_template_vi, rank3_behavior_vi, melee_result_vi, proj_result_vi, special_reward_vi, p_result_vi, cost_vi, art_lock_vi, weapon_class_vi, state_name_vi | quy ước loc: mọi chữ hiển thị kết thúc _vi |
2026-11-07 — mechanic (doc 13, MK_…) vs mechanic_key (doc 12, trigger.primitive)? | cả 2 field nhận cả 2 cách viết; dạng lưu khuyến nghị trigger.primitive; validator chuẩn hoá trước khi so (MK_A__B ≡ a.b); mechanic ở hàng nâng cấp/Relic, mechanic_key ở kỹ năng/ult/Dạng Rèn/passive | doc 12 §10 xác nhận 2 cách viết là 1 key |
2026-11-07 — Đích Hxx_MV_<X> (doc 13) vs move_id Hxx_<SLOT>_<n> (doc 12)? | X = alias của đòn (vd A3, DASH_STRIKE, RIPOSTE) hoặc đuôi move_id; validator kiểm cả 2 | giữ id demo trong Edge H01 mà không đổi mẫu move_id |
| 2026-11-07 — Khoá Hồi trong dữ liệu? | act ∈ act_key = I II III IV V VI (V = Kết B5, VI = Bí mật B6); biome thêm HUB; áp cho boss §4.11, biome §4.14, wave script | 1 kiểu cho mọi bảng theo Hồi |
| 2026-11-07 — Kịch bản sóng ở đâu? | encounters.json.wave_scripts[] (+ objectives, patterns, directors, tp_table); biome chỉ trỏ encounter_scripts | doc 15 sở hữu luật; biome chỉ chọn |
2026-11-07 — Id mỹ phẩm MR lệch giữa hero (LUT_HEARTH_Hxx, TITLE_MR20_Hxx, TITLE_SUB_Hxx…)? | chốt 5 mẫu §2: FRAME_PORTRAIT_SILVER_Hxx, FRAME_CARD_Hxx, HEARTH_FLAME_LUT_Hxx, SUBTITLE_Hxx, TITLE_Hxx_MR20; mẫu gốc ở meta.json mastery.ranks | 1 mẫu cho 12 hero, Unity tra id theo mẫu |
2026-11-07 — ACH_ash_crown ví dụ §7 lệch dữ liệu? | theo dữ liệu + doc 43: hidden: true, mercy_blocked: false | dữ liệu là nguồn sự thật |
| 2026-11-07 — Skin hero? | visual.skins đúng 4 = 3 Nến Canh + skin ngà MR20 | doc 12 §8.2 + §2.7 |
| Validator khi thiếu file? | file thiếu = WARN coverage; tham chiếu tới loại chưa có file nguồn = WARN "chưa kiểm được"; chỉ lỗi thật = ERROR (exit 1) | agent điền dần, CI vẫn chặn lỗi thật |
| Chuẩn lỗi validator? | <file> <json path>: <thông điệp tiếng Việt kèm luật/doc> | sửa được ngay không cần đọc code |
| 2026-11-07 — Điều kiện nhiều vế (doc 21 §2.3)? | condition.and[] (1–6 điều kiện, lồng được) = AND với điều kiện chính; note_vi chỉ là ghi chú, không chứa điều kiện máy đọc | StoryDirector đọc điều kiện có cấu trúc, không phân tích chữ |
2026-11-07 — Token ACTION của cancel_into lệch giữa hero (COMBO, COMBO_A, ATTACK, STANCE, CHARGE), nhiều đòn để trống? | từ vựng đóng §4.0a: DASH ANSWER HOLD SKILL ULT COMBO_A COMBO_B HEAVY DASH_ATTACK COUNTER MOVE; COMBO/ATTACK → COMBO_A, STANCE/CHARGE → HEAVY; thiếu/rỗng = ma trận mặc định doc 12 §3.2; schema common.schema.json + validate.py theo §4.0a | engine đọc + kiểm được ma trận huỷ; token = cột ma trận doc 12 §3.2 |
| 2026-11-07 — Validator chéo bỏ qua gì? | giá trị của kind, at và phần tử flags[] là token, không phải id; stinger <cueId>__stg_<slug> hợp lệ khi cue có stinger slug; defense.hold.mechanic là enum verb giữ, không đối chiếu mechanics.json | hết báo lỗi giả, giữ quy ước id doc 32 §3.4 |