🔔 Bladewake GDD
📄 Doc 51 · Kỹ thuật & dữ liệu

51 — Data Schema (mô hình dữ liệu)

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.

Cập nhật: 2026-11-07
11
mục ##
34
mục ###
50
bảng
27 305
từ

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/).

Độ dài từng mục (nghìn ký tự)Độ dài từng mục (nghìn ký tự)0. Nguyên tắc0. Nguyên tắc: 0.9k0.9k1. Bản đồ file1. Bản đồ file: 3.2k3.2k2. Quy ước ID (canon Bible §11; ID ASC…2. Quy ước ID (canon Bible §11; ID ASCII, bất biến sau ship, duy nhất toàn cục): 3.9k3.9k3. Quy ước chữ3. Quy ước chữ: 1k1k4. Bảng field (sinh từ tools/schema/.s…4. Bảng field (sinh từ tools/schema/.schema.json; ★ = bắt buộc): 106.5k106.5k5. Tham chiếu chéo (luật; validate.py …5. Tham chiếu chéo (luật; validate.py --all kiểm): 2.1k2.1k6. tools/validate.py6. tools/validate.py: 4.1k4.1k7. Ví dụ gọn (1/thực thể; … = field bắ…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): 21.1k21.1k8. Render & ánh xạ CSV cho Unity (buil…8. Render & ánh xạ CSV cho Unity (build đọc JSON, không ngược lại): 1.5k1.5kQuy tắc cho dev/AIQuy tắc cho dev/AI: 1.5k1.5kQuyết định đã chốtQuyết định đã chốt: 3.7k3.7k
Bấm tên mục để nhảy tới mục đó.
Mục lục chi tiết (## và ###)
  1. 0. Nguyên tắc
  2. 1. Bản đồ file
  3. 2. Quy ước ID (canon Bible §11; ID ASCII, bất biến sau ship, duy nhất toàn cục)
  4. 2.1 Bảng mẫu
  5. 2.2 Chủ AV (av/<OwnerId>.json) và tiền tố id media hợp lệ trong file
  6. 3. Quy ước chữ
  7. 4. Bảng field (sinh từ tools/schema/.schema.json; ★ = bắt buộc)
  8. 4.0 Khối dùng chung (common.schema.json#/$defs + def trong schema)
  9. 4.1 heroes/<Hxx>.json — hero.schema.json (luật: doc 12 §2, §8, §10.6 · 10 §2.1 · 11 §3)
  10. 4.2 hero_upgrades/<Hxx>.json — hero_upgrades.schema.json (luật: doc 13 §1.1, §5, §8, §9 · 12 §10)
  11. 4.3 shared_edges.json — shared_edges.schema.json (luật: doc 13 §5)
  12. 4.4 shared_resonances.json — shared_resonances.schema.json (luật: doc 13 §8)
  13. 4.5 relics.json — relics.schema.json (luật: doc 13 §10)
  14. 4.6 affixes.json — affixes.schema.json (luật: doc 13 §11)
  15. 4.7 mechanics.json — mechanics.schema.json (luật: doc 12 §9–§10)
  16. 4.8 tags.json — tags.schema.json (luật: doc 13 §5.7)
  17. 4.9 statuses.json — statuses.schema.json (luật: doc 10 §5)
  18. 4.10 enemies/<Bn>.json — enemies.schema.json (luật: doc 14 §2, §12 · 11 §1 · 15 §2.1 · 17 §5)
  19. 4.11 bosses/<BossId>.json — boss.schema.json (luật: doc 14 §6, §8.3, §9 · 11 · 17 §5.3)
  20. 4.12 elite_modifiers.json — elite_modifiers.schema.json (luật: doc 15 §7.2 · Bible §7.3)
  21. 4.13 av/<OwnerId>[__<part>].json — av.schema.json (luật: doc 30 §5.1, §6.4 · 31 §9 · 32 §4.2, §9)
  22. 4.14 biomes/<Bn>.json · biomes/HUB.json — biome.schema.json (luật: doc 15 §9 · 20 §4 · 30 §3.3, §6)
  23. 4.15 encounters.json — encounters.schema.json (luật: doc 15 §2–§13)
  24. 4.16 run_map.json — run_map.schema.json (luật: doc 16 §2–§6, §12)
  25. 4.17 events.json — events.schema.json (luật: doc 16 §3 · Bible §2)
  26. 4.18 mourning_bands.json — mourning_bands.schema.json (luật: doc 17 §7.1 · Bible §4)
  27. 4.19 mutators.json — mutators.schema.json (luật: doc 17 §7.2)
  28. 4.20 modes.json — modes.schema.json (luật: doc 16 §10 · Bible §4.1)
  29. 4.21 currencies.json — currencies.schema.json (luật: doc 17 §8, §10)
  30. 4.22 meta.json — meta.schema.json (luật: doc Bible §3 · 12 §2.7–2.8 · 17 §10)
  31. 4.23 npcs.json — npcs.schema.json (luật: doc 20 §8)
  32. 4.24 dialogue.json — dialogue.schema.json (luật: doc 20 · 32 §9)
  33. 4.25 endings.json — endings.schema.json (luật: doc Bible §7.6 · 16 §8.3)
  34. 4.26 codex.json — codex.schema.json (luật: doc 20 §9)
  35. 4.27 music.json — music.schema.json (luật: doc 32 §3.6–3.7)
  36. 4.28 achievements.json — achievements.schema.json (luật: doc Bible §11)
  37. 4.29 curves.json — curves.schema.json (luật: doc 17 §1–§9)
  38. 4.30 tuning.json — tuning.schema.json (luật: doc 13 §0 · 14 §16 · 15 §14 · 17 §11.2)
  39. 4.31 psp_axes.json — psp_axes.schema.json (luật: doc 14 §7)
  40. 5. Tham chiếu chéo (luật; validate.py --all kiểm)
  41. 6. tools/validate.py
  42. 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)
  43. 8. Render & ánh xạ CSV cho Unity (build đọc JSON, không ngược lại)
  44. Quy tắc cho dev/AI
  45. 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] → field assumed: true trên hàng (hoặc assumed_note_vi); núm chỉnh để ở tuning.json.

31. Bản đồ file

FileSchemaNội dungSố lượng 1.0Doc luật
_bible.json— (canon, chỉ đọc)ID + tên + số canon100
tuning.jsontuningnú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_shift113 §0, 14 §16, 15 §14, 17 §11.2
curves.jsoncurvesXP 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)≥ 817
statuses.json · tags.json · psp_axes.jsoncùng tên12 STS_ · 21 tag + sub-tag · 12 trục A01–A1212 · 21 · 1210 §5 · 13 §5.7 · 14 §7
currencies.jsoncurrencies4 tiền tệ: nguồn, đích, mục tiêu, nhân mode417 §8, §10
mechanics.jsonmechanics46 trigger, 186 primitive (lớp, chủ, dmg_kind, params), lãnh thổ 12 hero, vùng chồng O1–O10, trần lớp112 §9–§10
heroes/<Hxx>.jsonherođị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 hero1212 §8
hero_upgrades/<Hxx>.jsonhero_upgrades40 Edge (E37–E40 Then Chốt), 6 Cộng Hưởng, 4 Tiến Hoá, mẫu câu TPL_1213
shared_edges.json · shared_resonances.jsoncùng tênSE001–SE072 (+ nhóm XG_SHARED_*) · SRS01–SRS1172 · 1113 §5, §8
relics.json · affixes.jsoncùng tênRL001–RL060 (RL049–060 Lời Nguyền) · AF01–AF24 + dải u + trọng số nhóm60 · 2413 §10–§11
elite_modifiers.jsonelite_modifiersEM01–EM1616Bible §7.3, 15 §7.2
enemies/<Bn>.jsonenemiesquái thường EN_ + Tinh Anh EL_ của biome (B1–B4, B6)5 file, 39 con14, 11, 15 §2.1, 17 §5
bosses/<BossId>.jsonboss7 mini MB_, 4 boss Hồi, Vua Dravos, Mũ Chuông BS_FINAL, Cái Lặng BS_TRUE1314 §6–§9, 17 §5.3
av/<OwnerId>[__<part>].jsonavactor spec, env asset, vfx[], sfx[], barks[] của 1 chủ39 chủ (§2.2)30, 31, 32
biomes/<Bn>.json · biomes/HUB.jsonbiomemôi trường, palette, tile, prop, hazard, phòng, landmark, đạo cụ OBJ_, WS dùng, ambience, nhạc715 §9, 20, 30 §3.3/§6
encounters.jsonencounters10–13 mục tiêu, 14 mẫu spawn, hồ sơ Director/biome, bảng TP, wave_scripts[]115
run_map.jsonrun_map6 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 HP116
events.jsoneventsEVT_<Bn>_nn4016 §3, Bible §2
mourning_bands.json · mutators.json · modes.jsoncùng tênMRN01–15 (+ meta) · MUT01–12 · 5 mode15 · 12 · 517 §7, Bible §4
meta.jsonmetahub, 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ẩm1Bible §3, 12 §2.7–2.8, 17 §10
npcs.json · dialogue.json · endings.json · codex.jsoncùng tên7 NPC + arc · dòng thoại DLG_ · 3 kết · trang CDX_7 · — · 3 · ~12020, 32 §9
music.jsonmusiccue MUS_ (18 + 4 bộ stem H12) + leitmotif LM_2232 §3
achievements.jsonachievementsACH_60Bible §11
  • File con: tên file = ID chủ (heroes/H03.json, bosses/BS_B2.json, enemies/B4.json); validator so id/hero/biome/owner vớ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ạiRegex schemaVí dụ
Hero · kỹ năng · ult · Dạng Rèn · passiveH\d{2} · H\d{2}_SK0[1-8] · H\d{2}_UL[1-3] · H\d{2}_AS[1-3] · H\d{2}_PASSIVEHà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 · SELFH01_MV_A3 (alias), H01_MV_COMBO_A_3
Edge hero · Edge chungH\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 · tagRL\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âuXG_(Hxx|SHARED)_[A-Z0-9_]+ · TPL_(Hxx|SHARED)_[a-z0-9_]+XG_H01_FINISHER_ZONE
Quái · Tinh Anh · mini · bossEN_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ệnEM\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òngWS_<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ậtCUR_* · 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ụcMR\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 · barkVFX_<ownerId>_<slug> · SFX_<ownerId>_<slug> · BARK_<ownerId>_<slug>; slug snake thường ≤ 24H01_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ếtMUS_[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_HxxCon 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 fileTiền tố VFX_/SFX_/BARK_ được định nghĩaGhi chú
Varek H01…Ambrin H12<Hxx> (gồm <Hxx>_SKnn_…, <Hxx>_ULn_…, <Hxx>_EVOn_…)hero + actor hero
EN_B1…EN_B4, EN_B6EN_<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
SHAREDSHARED, STS_, EM, MUT, MRNthư viện chung (doc 31 §11 74 VFX, doc 32 §8 57 SFX)
UIUIâ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á trong params/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_key củ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

FieldKiểu / giá trị cho phép★Nghĩa
move_idstring ^H\d{2}_[A-Z][A-Z0-9_]*$★<Hxx>_<SLOT>_<n>
aliasstring ^[A-Z0-9_]+$tên ngắn để Edge nhắm Hxx_MV_<alias> (A3, DASH_STRIKE)
slotCOMBO_A · COMBO_B · HEAVY · DASH · DASH_ATTACK · ANSWER · HOLD · COUNTER · SKILL · ULT · ASPECT · ECHO_MOVE … (14)★slot kit doc 12 §2.1
owner_refstringkỹ năng/ult chứa đòn
name_vistringtên hiển thị tiếng Việt có dấu
animstring ^[a-z][a-z0-9_]*$★clip anim
startup_tinteger [0..600]★tick khởi động
active_tinteger [0..600]★tick hiệu lực
recovery_tinteger [0..600]★tick hồi
post_ratenumber [0..3]tốc follow-through
coefnumber [0..]★sát thương = coef × POWER (doc 10 §3.2)
dmg_kindMELEE · PROJ · AREA · ZONE · DOT · PURE★MELEE/PROJ/AREA/ZONE/DOT/PURE
hit_classLIGHT · 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
layersALL · GROUND · AIRlớp trúng
max_targetsinteger [1..128]★trần mục tiêu (48; ult 128)
rehit_ticksinteger [0..600]tick giữa 2 lần trúng cùng mục tiêu
hits_maxinteger [1..60]số nhịp tối đa
stepnumber [0..]bước tiến px
step_maxnumber [0..]bước tối đa px
lunge_pxnumber [0..320]lao tới px
kb_pxnumber [0..]đẩy lùi px
launch_snumber [0..2]hất tung giây
pullnumber [0..240]kéo px/s (≤ 240)
poise_dmginteger [0..]★Thế gây
hitstop_snumber [0..0.12]★khựng khung (≤ 0.12)
traumanumber [0..1]★rung màn 0–1
statusstring ^STS_[A-Z]+:\d+(\.\d+)?$ | anySTS_X:giây hoặc null
execute_pctnumber [0..1]ngưỡng kết liễu
pierceinteger [0..]xuyên
pierce_falloffnumber [0..1]giảm/lần xuyên
proj_speednumber [0..]tốc đạn px/s
proj_rangenumber [0..]tầm đạn px
armor_tierNONE · 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_deltanumberthay đổ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_idstring ^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_idstring ^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_vistringghi chú thiết kế
assumedanytrue = 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)

ACTIONHuỷ sangCột doc 12 §3.2Ghi chú
DASHLướtLướtmặ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ĐÁPmặc định đã "có" (INV-11) → như DASH
HOLDverb giữ của heroverb giữ
SKILLkỹ năng (mọi ô)Kỹ năngnới "sau 60%" sớm hơn
ULTultUlt
COMBO_Acú kế / cú 1 chuỗi COMBO_AĐánh (cú kế)thay mọi token cũ COMBO, ATTACK
COMBO_Bcú 1 chuỗi COMBO_BĐánh (cú kế)chỉ hero có slot COMBO_B
HEAVYbắ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"
COUNTERPhảnĐánh (cú kế)ngoài cửa sổ Phản mặc định
MOVEđiĐinới move_cancel_frac
  • Ngữ nghĩa: ACTION@t = từ tick t củ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_into hoặ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; t vượt tổng tick đòn → ERROR; COMBO_B khi hero không có slot COMBO_B → ERROR; ô trùng mặc định (vd DASH/ANSWER không đổi tick, SKILL@t với t ≥ mốc 60% recovery) → WARN "thừa".

hero_shape

FieldKiểu / giá trị cho phép★Nghĩa
shapeCIRCLE · ARC · RECT · LINE · RING · ELLIPSE · NONE · POINT★hình hitbox doc 10 §1.4
rnumber [0..]bán kính
r_innumber [0..]bán kính trong
arcnumber [0..360]beat arc / độ cung
off_fwdnumberlệch trước px
off_sidenumberlệch ngang px
lennumber [0..]dài px
wnumber [0..]rộng
p0[ number ] (2..2)điểm neo 0 [x,y]
p1[ number ] (2..2)tham số 1
bandnumber [0..]dày vòng px
rxnumber [0..]bán trục x
rznumber [0..]bán trục z

hitbox

FieldKiểu / giá trị cho phép★Nghĩa
shapeCIRCLE · ARC · RECT · LINE · RING · ELLIPSE · NONE★hình hitbox doc 10 §1.4
rnumber [0..]bán kính
r_innumber [0..]bán kính trong
arcnumber [0..360]beat arc / độ cung
lennumber [0..]dài px
wnumber [0..]rộng
off_fwdnumberlệch trước px
off_sidenumberlệch ngang px
off_backnumber [0..]lệch sau px
rxnumber [0..]bán trục x
rznumber [0..]bán trục z
bandnumber [0..]dày vòng px
r_startnumber [0..]bán kính đầu
r_speednumber [0..]tốc lan px/s
gap_degnumber [0..360]độ khe
gap_countinteger [0..]số khe
layersALL · GROUND · AIRBORNE · FLYINGlớp trúng

attack

FieldKiểu / giá trị cho phép★Nghĩa
idstring ^(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_vistring★tên hiển thị tiếng Việt có dấu
kindmelee · lunge · projectile · aoe_self · aoe_front · ring · leap · summon · beam · cone · zone · line … (15)★loại (enum)
tellY · P · N · NONE★Y vàng / P tím / N vùng / NONE (INV-02)
beatsinteger [1..8]số nhịp Y×n
beat_gap_snumber [0.35..]khe nhịp ≥ 0.35
windup_snumber [0..]★windup (sàn doc 11 §1.2)
active_snumber [0..]★hiệu lực (s)
recovery_snumber [0..]★hồi sau đòn (s)
dmgnumber [0..]★sát thương ở Hồi gốc
dmg_kindMELEE · PROJ · AREA · ZONE · DOT · PURE★MELEE/PROJ/AREA/ZONE/DOT/PURE
shape→ hitbox (§4.0)★hình hitbox doc 10 §1.4
r_minnumber [0..]★cự ly dùng nhỏ nhất
r_maxnumber [0..]★cự ly dùng lớn nhất
angle_maxnumber [0..180]góc lệch tối đa
cooldown_snumber [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}
signatureanyđòn chữ ký
variant_ofstring ^(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_sourceBASE · ASH★BASE/ASH (Bible §11)
ash_default_vistringmặc định trung tính khi Tro Nhớ tắt
tokenMELEE · PROJ · P_FLOOR · HEAVY · SIGNATURE · NONE★loại token tấn công INV-08
projobjectkhối đạn
proj.proj_catY_REFLECT · Y_HEAVY · P★Y_REFLECT/Y_HEAVY/P (doc 11 §1.3)
proj.speednumber [0..]★tốc px/s
proj.radiusnumber [0..]★bán kính px
proj.countinteger [1..]★số
proj.spread_degnumber [0..360]toả độ
proj.rangenumber [0..]tầm px
proj.destructibleanyphá được 1 cú
proj.height_pxnumber [0..]cao px
zoneobjectvùng N
zone.tick_snumber [0.5..]★chu kỳ tick ≥ 0.5
zone.dmg_per_ticknumber [0..4]★≤ 4/tick
zone.duration_snumber [0..]★thời lượng (s)
zone.slownumber [0..1]chậm 0–1
summonobjectgọi quái
summon.enemystring ^(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.countinteger [1..]★số
summon.capinteger [1..]★trần
summon.vortex_snumber [1.0..]★xoáy báo ≥ 1.0 s
lunge_pxnumber [0..]lao tới px
hero_kb_pxnumber [0..96]đẩy hero ≤ 96
hits_enemiesanytrúng cả quái
hyperanysiêu giáp
chain_answerstring ^(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
animstring ^[a-z0-9_]+$★clip anim
pose_vistringtư thế windup
desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
counter_hint_vistringgợ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
assumedanytrue = có số [ASSUMED] lượt đầu, playtest chỉnh
demo_idstringid demo cũ (ánh xạ Bible §2.4)

counter_variant

FieldKiểu / giá trị cho phép★Nghĩa
cv_idstring ^(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
layerMICRO · MESO★MICRO/MESO
adaptive_sourceBASE · ASH★BASE/ASH (Bible §11)
axisstring ^A(01\.(DEFLECT|HOLD|DASH)|0[2-9]|1[0-2])$★trục
dirHIGH · LOW · LEFT · RIGHT · SIDE★HIGH/LOW/LEFT/RIGHT/SIDE
thr_onnumber [0.3..0.85]★ngưỡng bật
thr_offnumber [0.15..0.7]★= thr_on − 0.15
min_roomsinteger [0..3]★phòng tối thiểu
effect_typeWEIGHT_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
multmap ^(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_attackstring ^(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_fnumber [0.1..1.0]tỉ lệ lấy
paramaim_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
lonumber/stringbiên dưới
hinumber/stringbiên trên
defaultnumber/stringmặ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_snumber [0.15..0.5]★hồi thêm 0.15–0.50
feintinteger [0..1]★1 = nhịp lừa (≤ 0.35 s)
habit_vistring★thói quen bị đọc
hint_vistring★gợi ý
bark_vistring ≤ 64 ký tự★bark ≤ 64 ký tự
budget_costinteger [0..1]★ASH 1 / BASE 0
scar_okinteger [0..1]★cho Sẹo
codexstring ^CDX_[a-z0-9_]+$★trang Sổ Tang CDX_*
variant_clipanycần clip mới

status_apply

FieldKiểu / giá trị cho phép★Nghĩa
statusstring ^STS_[A-Z]+$★STS_X:giây hoặc null
duration_snumber [0..]thời lượng (s)
stacksinteger [1..3]lớp
chancenumber [0..1]xác suất 0–1
mass_overridestringghi đè theo hạng

condition

FieldKiểu / giá trị cho phép★Nghĩa
kindstring★loại (enum)
refstringid được trỏ
op>= · <= · == · > · < · !=phép so sánh
valuenumber/string/booleangiá trị
note_vistringghi 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

FieldKiểu / giá trị cho phép★Nghĩa
tostring ^(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ế
pnumber [0..1]★xác suất
gap_minnumber [0.35..]★khe min ≥ 0.35
gap_maxnumber [0.35..]★khe max
condstringđiều kiện chuỗi

edge_params

FieldKiểu / giá trị cho phép★Nghĩa
targetstring `^(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_requiresstring ^(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_exclstring ^XG_(H\d{2}|SHARED)_[A-Z0-9_]+$nhóm loại trừ XG_*
icd_snumber [0..]hồi nội trigger
proc_from_procanykích bởi đòn sinh từ nâng cấp
tplstring ^TPL_(H\d{2}|SHARED)_[a-z0-9_]+$id mẫu câu CUSTOM_HOOK
kill_classS · M+S hoặc M+

shared_edge

FieldKiểu / giá trị cho phép★Nghĩa
name_vistring★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`)
rarityCOMMON · RARE · EPIC · LEGENDARY · CURSED★COMMON/RARE/EPIC/LEGENDARY/CURSED (doc 13 §5.1)
max_rankinteger [1..3]★hạng tối đa theo rarity
triggerPASSIVE · 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…)
actionSTAT · SPAWN_PROJ · SPAWN_ZONE · BLAST · APPLY_STATUS · MODIFY_MOVE · RESOURCE · ULT_GAUGE · HEAL · SHIELD · COOLDOWN · DRAFT…★hành động doc 13 §5.9
statHP_MAX · MOVE_SPEED · ACCEL_TIME · POWER · DMG_INC · ATK_SPEED · CRIT_CHANCE · CRIT_MULT · AREA · PROJ_SPEED · DURATION · CDR…chỉ số hero_stats
stat_modeFLAT · 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_vistring★chữ thẻ/tooltip, mẫu câu có {param}
mechanicstring ^([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_rankstring ^MR\d{2}$bậc mở pool
pool_startany★sẵn trong pool
unlock_cost→ cost (§4.0)★giá mở Chợ Đò
demo_idstring ^E\d{2}$id demo cũ (ánh xạ Bible §2.4)
iconstringtên sprite icon icon_<slug>
vfx_idstring ^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_idstring ^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
assumedanytrue = có số [ASSUMED] lượt đầu, playtest chỉnh
idstring ^SE\d{3}$★ID duy nhất (mẫu ở §2)
owner= "SHARED"★chủ của hàng (HxxSHAREDowner AV)
hookstring ^SHARED\.[a-z][a-z0-9_]*$★EventName phát / hook nâng cấp
statusstring ^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)

FieldKiểu / giá trị cho phép★Nghĩa
idstring ^H\d{2}$★ID duy nhất (mẫu ở §2)
identityobject★khối định danh doc 12 §8.1
identity.idstring ^H\d{2}$★ID duy nhất (mẫu ở §2)
identity.namestring ≤ 12 ký tự★tên riêng hiển thị (hero)
identity.title_vistring★danh hiệu
identity.name_loc_keystring ^hero\.H\d{2}\.name$★khoá loc tên hero.Hxx.name
identity.title_loc_keystring ^hero\.H\d{2}\.title$★khoá loc danh hiệu
identity.weapon_class_vistring★lớp vũ khí, duy nhất roster
identity.role_groupMELEE_FAST · MELEE_HEAVY · REACH · CONTROL · RANGED · ZONE · RHYTHM_SUMMON★nhóm vai doc 12 §5
identity.difficultyinteger [1..5]★độ khó 1–5 = bậc của Σ trục (doc 12 §4)
identity.difficulty_axesobject★5 trục T/R/V/S/D, mỗi trục 0–2
identity.difficulty_axes.Tinteger [0..2]★trục Thời điểm / trigger T
identity.difficulty_axes.Rinteger [0..2]★trục Tài nguyên
identity.difficulty_axes.Vinteger [0..2]★trục Vị trí
identity.difficulty_axes.Sinteger [0..2]★trục Số trạng thái / hạng S
identity.difficulty_axes.Dinteger [0..2]★trục Độ trễ
identity.unlockobject★điều kiện + giá mở
identity.unlock.condition_idstring ^(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_vistringđiều kiện chữ
identity.unlock.echo_shard_costinteger [0..16]★giá Mảnh Vọng (Bible §3.4)
identity.milestonestring ^MS\d{2}b?$★mốc ra mắt MSxx
identity.pitch_vistring ≤ 200 ký tự★1 câu bán (≤ 200 ký tự)
identity.lore_vistring ≤ 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_checkedany★CI quét từ cấm đạt
visualobject★khối hình ảnh doc 12 §8.2
visual.slot_hexstring ^#[0-9a-fA-F]{6}$ | any★màu slot hero (INV-01b); null nếu vô sắc
visual.slot_huenumber [0..359] | any★hue slot (độ)
visual.achromaticany★true chỉ H02
visual.palette_ramps[ object ] (1..4)★≤ 4 vật liệu × 4 tông (pixelfx defineCostume)
visual.palette_ramps[].materialstring ^[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_vistring★điều cấm/bắt buộc art
visual.sprite_height_pxinteger [24..44]★cao sprite ≤ 44
visual.pixelfx_costumestring ^Tools/pixelfx/src/fx/heroes/_[a-z0-9_]+\.js$★file costume pixelfx
visual.codestring ^h\d{2}$|^[a-z0-9_]+$★mã pixelfx/asset ASCII thường
visual.clips[ object ] (20..)★bộ clip anim
visual.clips[].clipstring ^[a-z][a-z0-9_]*$★tên clip
visual.clips[].framesinteger [1..160]★số frame @30
visual.clips[].loopany★lặp
visual.clips[].hit_frames[ integer [0..] ]★frame va chạm
visual.clips[].dirs8 · 5+3 · 1★hướng / số hướng
visual.clips[].reuse_ofstring ^[a-z][a-z0-9_]*$clip gốc dùng lại
visual.portraitobject★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_hexstring ^#[0-9a-fA-F]{6}$viền slot
visual.foot_ringobject★vòng chân (INV-09)
visual.foot_ring.r_pxinteger [4..24]★bán kính px
visual.foot_ring.hexstring ^#[0-9a-fA-F]{6}$★màu
visual.skins[ object ] (4..4)★3 skin Nến Canh + skin ngà MR20
visual.skins[].idstring ^SKN_H\d{2}_\d$★ID duy nhất (mẫu ở §2)
visual.skins[].name_vistring★tên hiển thị tiếng Việt có dấu
visual.skins[].lutstring★LUT palette (0 sheet mới)
visual.skins[].unlockobject★điều kiện + giá mở
visual.skins[].unlock.currencystring ^CUR_[A-Z_]+$tiền tệ
visual.skins[].unlock.costinteger [0..]giá: {CUR_*: số}
visual.skins[].unlock.mrstring ^MR\d{2}$bậc Thông Thạo
statsobject★chỉ số gốc hero_stats (doc 10 §2.1)
stats.HP_MAXnumber★chỉ số HP_MAX (doc 10 §2.1)
stats.MOVE_SPEEDnumber★chỉ số MOVE_SPEED (doc 10 §2.1)
stats.ACCEL_TIMEnumberchỉ số ACCEL_TIME (doc 10 §2.1)
stats.POWERnumberchỉ số POWER (doc 10 §2.1)
stats.DMG_INCnumberchỉ số DMG_INC (doc 10 §2.1)
stats.ATK_SPEEDnumberchỉ số ATK_SPEED (doc 10 §2.1)
stats.CRIT_CHANCEnumberchỉ số CRIT_CHANCE (doc 10 §2.1)
stats.CRIT_MULTnumberchỉ số CRIT_MULT (doc 10 §2.1)
stats.AREAnumberchỉ số AREA (doc 10 §2.1)
stats.PROJ_SPEEDnumberchỉ số PROJ_SPEED (doc 10 §2.1)
stats.DURATIONnumberchỉ số DURATION (doc 10 §2.1)
stats.CDRnumberchỉ số CDR (doc 10 §2.1)
stats.DASH_CHARGESnumberchỉ số DASH_CHARGES (doc 10 §2.1)
stats.DASH_RECHARGEnumberchỉ số DASH_RECHARGE (doc 10 §2.1)
stats.ANSWER_WINDOWnumber★chỉ số ANSWER_WINDOW (doc 10 §2.1)
stats.POISE_MAXnumber★chỉ số POISE_MAX (doc 10 §2.1)
stats.POISE_REGENnumberchỉ số POISE_REGEN (doc 10 §2.1)
stats.DRnumberchỉ số DR (doc 10 §2.1)
stats.ELITE_DMGnumberchỉ số ELITE_DMG (doc 10 §2.1)
stats.STATUS_POWERnumberchỉ số STATUS_POWER (doc 10 §2.1)
stats.HEAL_MULTnumberchỉ số HEAL_MULT (doc 10 §2.1)
stats.PICKUP_Rnumberchỉ số PICKUP_R (doc 10 §2.1)
stats.ULT_GAINnumberchỉ số ULT_GAIN (doc 10 §2.1)
stats.RES_GAINnumberchỉ số RES_GAIN (doc 10 §2.1)
stats.KNOCKBACKnumberchỉ số KNOCKBACK (doc 10 §2.1)
stats.SHIELD_CAPnumberchỉ số SHIELD_CAP (doc 10 §2.1)
stats.dash_pxnumber [72..96]★cự ly Lướt 72–96
resourceobject★tài nguyên riêng doc 12 §2.2
resource.res_idstring ^(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_vistring★tên tài nguyên
resource.res_kindGAUGE · PIPS · ON_ENEMY · OBJECTS · CHAMBERS · CLOCK★GAUGE/PIPS/ON_ENEMY/OBJECTS/CHAMBERS/CLOCK
resource.res_minnumber★giá trị nhỏ nhất
resource.res_maxnumber★giá trị lớn nhất
resource.res_startnumber★đầu run
resource.gain[ object ] (1..)★nguồn nạp {event, amount, cap_per_s}
resource.gain[].eventpassive · attack · combo_end · heavy · charge_mark · dash · dash_end · dash_through · dash_attack · perfect_dodge · answer · `a… | ★ | trigger doc 12 §9.2
resource.gain[].amountnumber★lượng
resource.gain[].cap_per_snumber [0..]trần nạp/giây
resource.gain[].note_vistringghi chú thiết kế
resource.spend[ object ]★cách tiêu {action, cost, partial_ok}
resource.spend[].actionstring★hành động doc 13 §5.9
resource.spend[].costnumber [0..]★giá: {CUR_*: số}
resource.spend[].partial_okany★false: thiếu → bản không thưởng/từ chối
resource.spend[].note_vistringghi chú thiết kế
resource.decayobject | any★giảm theo thời gian; null = không
resource.on_hit_takennumber★mất khi trúng đòn Y/P
resource.thresholds[ object ] (0..3)★≤ 3 mốc trạng thái
resource.thresholds[].valuenumber★giá trị
resource.thresholds[].state_idstring ^[A-Z][A-Z0-9_]*$★id trạng thái mốc HOA
resource.thresholds[].state_name_vistring★tên mốc (Cuồng Lưu…)
resource.thresholds[].enter_fxstring ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$VFX khi vào mốc
resource.thresholds[].effect_vistring★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_eventpassive · 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_gainnumber★thưởng tài nguyên khi ĐÁP
resource.pdodge_gainnumber★thưởng khi Né Hoàn Hảo
resource.ult_linkstring★công thức nạp Dư Âm từ tài nguyên
resource.hudobject★hiển thị HUD
resource.hud.elementBAR · PIPS · ON_ENEMY · OBJECTS · CHAMBERS · CLOCK★loại HUD
resource.hud.anchorstring★neo HUD
resource.hud.world_cuestring/null★cue world-space ≤ 12 px; null = không
passiveobject★passive doc 12 §2.3
passive.idstring ^H\d{2}_PASSIVE$★ID duy nhất (mẫu ở §2)
passive.name_vistring★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_vistring★mẫu chữ thẻ có {param}
passive.ui_iconstring ^icon_[a-z0-9_]+$★icon passive
passive.mechanic_keystring ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$trigger.primitive (doc 12 §9) hoặc dạng MK_TRIGGER__PRIMITIVE
input_overrideobject★override input doc 12 §1.4 (chỉ field liệt kê)
input_override.attack_hold_ticksinteger [9..30]tick giữ ATTACK
input_override.attack_hold_actionAUTO_CHAIN · CHARGE · CHANNEL · STANCE · DIG · NONEhà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_multnumber [0.5..0.8]nhân tốc chạy khi nạp
input_override.place_minnumber [24..260]cự ly đặt nhỏ nhất px
input_override.place_defaultnumber [24..260]cự ly đặt mặc định
input_override.place_maxnumber [24..260]cự ly đặt lớn nhất
input_override.aim_rotate_maxnumber [360..720]tốc xoay ngắm °/s
input_override.skill_cast_modemap ^H\d{2}_SK0[1-8]$ → TAP · HOLDTAP/HOLD theo kỹ năng
input_override.rhythm_clockanymáy nhịp (H12)
defenseobject★phòng thủ doc 12 §8.5 + doc 11 §3
defense.answerobject★verb ĐÁP
defense.answer.verb_name_vistring★tên verb (Gạt…)
defense.answer.window_snumber [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_vistring★kết quả ĐÁP đòn cận chiến
defense.answer.proj_result_vistring★kết quả ĐÁP đạn
defense.answer.poise_dmg_overrideobjectThế gây theo hạng khi ĐÁP
defense.answer.poise_dmg_override.Mnumber [0..]override khớp
defense.answer.poise_dmg_override.Lnumber [0..]hạng L
defense.answer.poise_dmg_override.XLnumber [0..]chỉ số XL (doc 10 §2.1)
defense.answer.res_gainnumber★tài nguyên nhận khi ĐÁP
defense.answer.special_reward_vistring★thưởng riêng
defense.answer.needs_resource= false★luôn false (INV-11)
defense.answer.move_idstring ^H\d{2}_[A-Z][A-Z0-9_]*$★<Hxx>_<SLOT>_<n>
defense.answer.vfx_idstring ^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_idstring ^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.holdobject★verb giữ (doc 11 §2.4)
defense.hold.verb_name_vistring★tên verb (Gạt…)
defense.hold.mechanicBLOCK_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_vistring★giá verb giữ
defense.hold.armor_tierNONE · FIRM · HYPER · INVULN★NONE/FIRM/HYPER/INVULN trong startup+active
defense.hold.move_multnumber [0..1]★nhân tốc chạy khi giữ
defense.hold.max_snumber [0..]★giữ tối đa
defense.hold.cooldown_snumber [0..]★hồi chiêu (s)
defense.hold.p_result_vistring★kết quả với đòn P
defense.hold.move_idstring ^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_idstring ^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_idstring ^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.counterobject★đòn Phản (doc 11 §2.6)
defense.counter.move_idstring ^H\d{2}_[A-Z][A-Z0-9_]*$★<Hxx>_<SLOT>_<n>
defense.counter.name_vistring★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_pxnumber [0..320]★lao tới px
defense.counter.damage_eqnumber [162..198]★sát thương quy đổi 180 ±10%
defense.dashobject★Lướt
defense.dash.dash_pxnumber [72..96]★cự ly Lướt 72–96
defense.dash.animstring ^[a-z][a-z0-9_]*$★clip anim
defense.dash.afterimageany★có dư ảnh
defense.dash.trail_vfxstring ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$★VFX vệt Lướt
defense.dash.sfx_idstring ^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_idstring ^H\d{2}_[A-Z][A-Z0-9_]*$<Hxx>_<SLOT>_<n>
defense.mass_verbobject | 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[].idstring ^H\d{2}_SK0[1-8]$★ID duy nhất (mẫu ở §2)
skills[].name_vistring★tên hiển thị tiếng Việt có dấu
skills[].roleCLEAR · CONTROL · DUEL · TEMPO★vai
skills[].unlock_mrstring ^MR\d{2}$★bậc Thông Thạo mở
skills[].cast_modeTAP · HOLD★TAP/HOLD
skills[].hold_max_snumber [0..1.5]giữ tối đa ≤ 1.5
skills[].cooldown_snumber [0..]★hồi chiêu (s)
skills[].chargesinteger [1..3]lượt
skills[].res_costnumber [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_vistring★mẫu chữ thẻ có {param}
skills[].rank3_behavior_vistring★đổ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_keystring ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$★trigger.primitive (doc 12 §9) hoặc dạng MK_TRIGGER__PRIMITIVE
skills[].iconstring ^icon_[a-z0-9_]+$★tên sprite icon icon_<slug>
skills[].shieldbreakany★cờ phá khiên
skills[].invuln_ticks[ integer [0..600] ] (2..2) | any[từ, tới] tick bất tử
skills[].vfx_idstring ^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_idstring ^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[].assumedanytrue = có số [ASSUMED] lượt đầu, playtest chỉnh
ultimates[ object ] (3..3)★3 ult
ultimates[].idstring ^H\d{2}_UL[1-3]$★ID duy nhất (mẫu ở §2)
ultimates[].name_vistring★tên hiển thị tiếng Việt có dấu
ultimates[].roleAREA · EXECUTE · TRANSFORM★vai
ultimates[].unlockobject★điều kiện + giá mở
ultimates[].unlock.mrstring ^MR\d{2}$bậc Thông Thạo
ultimates[].unlock.echo_shardinteger [0..]Mảnh Vọng
ultimates[].invuln_ticks[ integer [0..600] ] (2..2)★[từ, tới] tick bất tử
ultimates[].duration_snumber [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_overridesmap key → number/string/boolean/object/arrayUL3: field đòn bị thay
ultimates[].world_slownumber [0..1]★nhân tốc thế giới khi kích
ultimates[].mechanic_keystring ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$★trigger.primitive (doc 12 §9) hoặc dạng MK_TRIGGER__PRIMITIVE
ultimates[].text_template_vistring★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[].iconstring ^icon_[a-z0-9_]+$tên sprite icon icon_<slug>
ultimates[].stingerstring ^MUS_[a-z0-9_]+$nhạc stinger
ultimates[].vfx_idstring ^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_idstring ^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[].assumedanytrue = có số [ASSUMED] lượt đầu, playtest chỉnh
aspects[ object ] (3..3)★3 Dạng Rèn
aspects[].idstring ^H\d{2}_AS[1-3]$★ID duy nhất (mẫu ở §2)
aspects[].name_vistring★tên hiển thị tiếng Việt có dấu
aspects[].weapon_layerstring ^[a-z0-9_]+$★lớp vũ khí pixelfx --weapon
aspects[].combo_paramsobject★tempo_mult/arc_add/range_add
aspects[].combo_params.tempo_multnumber [0.5..1.5]★nhân nhịp combo
aspects[].combo_params.arc_addnumber [-90..90]★+độ cung
aspects[].combo_params.range_addnumber [-48..48]★+px tầm
aspects[].res_rule_overrideobject | any★đổi đúng 1 field tài nguyên; AS1 null
aspects[].new_clipstring ^[a-z][a-z0-9_]*$ | any★≤ 1 clip mới
aspects[].hue_shiftnumber [-4..4]★lệch hue ±4°
aspects[].unlockobject★điều kiện + giá mở
aspects[].unlock.echo_shardinteger [0..]★Mảnh Vọng
aspects[].difficulty_axis_deltaobject | any★đổi ≤ 1 điểm 1 trục
aspects[].mechanic_keystring ^([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_vistring★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[].iconstring ^icon_[a-z0-9_]+$tên sprite icon icon_<slug>
aspects[].vfx_idstring ^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..) | anyVFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult
aspects[].sfx_idstring ^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..) | anySFX id (1 hoặc mảng) — bắt buộc trên đòn/kỹ năng/ult
masteryobject★Thông Thạo
mastery.mastery_unlocksmap ^MR\d{2}$ → [ string ]★MRxx → id mở
mastery.tt_paramsobject★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_idstring ^DLG_[A-Z0-9_]+_\d{3}$★thoại MR11
mastery.mr15_beat_idstring ^DLG_[A-Z0-9_]+_\d{3}$★thoại MR15
mastery.tombstone_idstring ^TMB_H\d{2}(_[a-z0-9_]+)?$★bia mộ riêng
mastery.title_mr20_vistring★danh hiệu MR20
avobject★khối AV hero doc 12 §8.10
av.vfx_list[ object ] (1..)★41 sheet {id, kind, template_src}
av.vfx_list[].idstring ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$★ID duy nhất (mẫu ở §2)
av.vfx_list[].kindSIGNATURE · TEMPLATE · LIBRARY★loại (enum)
av.vfx_list[].template_srcstringsheet 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_stemstring ^MUS_[a-z0-9_]+$ | any★chỉ H12
av.echo_moveobject★đòn Vọng BS_TRUE P3
av.echo_move.move_idstring ^H\d{2}_[A-Z][A-Z0-9_]*$★<Hxx>_<SLOT>_<n>
av.echo_move.shader_idstring ^SHD_[a-z0-9_]+$★shader
av.codex_page_ids[ string ^CDX_[a-z0-9_]+$ ] (1..)★trang Sổ Tang
av.test_yardobject★Sân Tập
av.test_yard.dps_dummy_presetstring★preset hình nộm
av.test_yard.tell_drill_ids[ string ] (1..)★bài tập tell
av.checklistmap ^(HF|DU)-0[1-8]$ → boolean/string★HF-01..08, DU-01..08
av.refsobject★đường dẫn tham chiếu
av.refs.pixelfxstringrecord pixelfx
av.refs.docstring★doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8)
av.refs.art_reviewstringảnh duyệt
docstring★doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8)
assumed_note_vistringghi chú số [ASSUMED]

4.2 hero_upgrades/<Hxx>.json — hero_upgrades.schema.json (luật: doc 13 §1.1, §5, §8, §9 · 12 §10)

FieldKiểu / giá trị cho phép★Nghĩa
herostring ^H\d{2}$★hero chủ
edges[ object ] (40..40)★Edge
edges[].name_vistring★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[].rarityCOMMON · RARE · EPIC · LEGENDARY · CURSED★COMMON/RARE/EPIC/LEGENDARY/CURSED (doc 13 §5.1)
edges[].max_rankinteger [1..3]★hạng tối đa theo rarity
edges[].triggerPASSIVE · 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[].actionSTAT · SPAWN_PROJ · SPAWN_ZONE · BLAST · APPLY_STATUS · MODIFY_MOVE · RESOURCE · ULT_GAUGE · HEAL · SHIELD · COOLDOWN · DRAFT…★hành động doc 13 §5.9
edges[].statHP_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_modeFLAT · 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_vistring★chữ thẻ/tooltip, mẫu câu có {param}
edges[].mechanicstring ^([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_rankstring ^MR\d{2}$★bậc mở pool
edges[].pool_startanysẵn trong pool
edges[].unlock_cost→ cost (§4.0)giá mở Chợ Đò
edges[].demo_idstring ^E\d{2}$id demo cũ (ánh xạ Bible §2.4)
edges[].iconstringtên sprite icon icon_<slug>
edges[].vfx_idstring ^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_idstring ^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[].assumedanytrue = có số [ASSUMED] lượt đầu, playtest chỉnh
edges[].idstring ^H\d{2}_E(0[1-9]|[1-3]\d|40)$★ID duy nhất (mẫu ở §2)
edges[].ownerstring ^H\d{2}$★chủ của hàng (HxxSHAREDowner AV)
edges[].linchpinany★Then Chốt (E37–E40)
edges[].hookstring ^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[].idstring ^H\d{2}_RS[1-6]$★ID duy nhất (mẫu ở §2)
resonances[].ownerstring ^H\d{2}$★chủ của hàng (HxxSHAREDowner AV)
resonances[].tagstring `^(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_vistring★tên hiển thị tiếng Việt có dấu
resonances[].tier1object★bậc I (đếm ≥ 3)
resonances[].tier1.atinteger [1..9]★giá trị trigger
resonances[].tier1.desc_vistring★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.actionSTAT · 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.statHP_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_modeFLAT · INC · MORE · NONEFLAT/INC/MORE/NONE
resonances[].tier2object★bậc II (đếm ≥ 5, đổi luật)
resonances[].tier2.atinteger [1..9]★giá trị trigger
resonances[].tier2.desc_vistring★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.actionSTAT · 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.statHP_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_modeFLAT · INC · MORE · NONEFLAT/INC/MORE/NONE
resonances[].tier2.rule_change_vistring★luật mới bậc II
resonances[].mechanicstring ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$★mechanic_key của hàng; Then Chốt = mảng 2 key
resonances[].vfx_idstring ^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_idstring ^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[].idstring ^H\d{2}_EVO[1-4]$★ID duy nhất (mẫu ở §2)
evolutions[].ownerstring ^H\d{2}$★chủ của hàng (HxxSHAREDowner AV)
evolutions[].name_vistring★tên hiển thị tiếng Việt có dấu
evolutions[].awakeningany★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[].conditionobject★điều kiện có cấu trúc {kind, ref, op, value}
evolutions[].condition.kindSKILL_RANK · RESONANCE · RELIC_COUNT · LEVEL · BOSS_KILLED★loại (enum)
evolutions[].condition.refstringid được trỏ
evolutions[].condition.valuenumber/string★giá trị
evolutions[].condition.note_vistringghi chú thiết kế
evolutions[].unlock_rankstring ^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_vistring★chữ thẻ/tooltip, mẫu câu có {param}
evolutions[].mechanicstring ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$★mechanic_key của hàng; Then Chốt = mảng 2 key
evolutions[].iconstringtên sprite icon icon_<slug>
evolutions[].vfx_idstring ^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_idstring ^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[].idstring ^TPL_(H\d{2}|SHARED)_[a-z0-9_]+$★ID duy nhất (mẫu ở §2)
templates[].text_vistring★chữ
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
edges[ → shared_edge (§4.0) ] (72..72)★Edge
docstring★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[].idstring ^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[].idstring ^TPL_(H\d{2}|SHARED)_[a-z0-9_]+$★ID duy nhất (mẫu ở §2)
templates[].text_vistring★chữ

4.4 shared_resonances.json — shared_resonances.schema.json (luật: doc 13 §8)

FieldKiểu / giá trị cho phép★Nghĩa
resonances[ object ] (11..11)★Cộng Hưởng
resonances[].idstring ^SRS\d{2}$★ID duy nhất (mẫu ở §2)
resonances[].name_vistring★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[].pairany★cặp trạng thái
resonances[].tier1object★bậc I (đếm ≥ 3)
resonances[].tier1.atinteger [1..9]★giá trị trigger
resonances[].tier1.desc_vistring★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[].tier2object★bậc II (đếm ≥ 5, đổi luật)
resonances[].tier2.atinteger [1..9]★giá trị trigger
resonances[].tier2.desc_vistring★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_vistringluật mới bậc II
resonances[].reaction_vistringphản ứng cặp
resonances[].mechanicstring ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$★mechanic_key của hàng; Then Chốt = mảng 2 key
resonances[].vfx_idstring ^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_idstring ^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
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
relics[ object ] (60..60)★60 Relic
relics[].idstring ^RL\d{3}$★ID duy nhất (mẫu ở §2)
relics[].name_vistring★tên hiển thị tiếng Việt có dấu
relics[].rarityCOMMON · RARE · EPIC · CURSED★COMMON/RARE/EPIC/LEGENDARY/CURSED (doc 13 §5.1)
relics[].cursedany★Lời Nguyền
relics[].systemANSWER_HOLD · DASH_MOVE · COUNTER · SKILL · ULT · HEAL_SHIELD · STATUS · ECONOMY_DRAFT · RESOURCE★hệ chung mà luật đổi
relics[].ruleobject★luật {trigger, condition, action, stat, stat_mode, params, hook}
relics[].rule.triggerPASSIVE · 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.actionSTAT · 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.statHP_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_modeFLAT · 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.hookstring ^SHARED\.[a-z][a-z0-9_]*$★EventName phát / hook nâng cấp
relics[].desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
relics[].drawback_vistring | any★cái giá (bắt buộc RARE/EPIC/CURSED)
relics[].affix_slots= 2★luôn 2
relics[].pool_startany★sẵn trong pool
relics[].unlock_cost→ cost (§4.0)★giá mở Chợ Đò
relics[].unlock_afterstring ^GD[1-5]$ | anymụ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_idstring ^R\d{2}$id demo cũ (ánh xạ Bible §2.4)
relics[].lore_vistring★lore ngắn
relics[].iconstring ^icon_[a-z0-9_]+$★tên sprite icon icon_<slug>
relics[].mechanicstring ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$★mechanic_key của hàng; Then Chốt = mảng 2 key
relics[].vfx_idstring ^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_idstring ^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[].assumedanytrue = có số [ASSUMED] lượt đầu, playtest chỉnh
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
affixes[ object ] (24..24)★24 affix
affixes[].idstring ^AF\d{2}$★ID duy nhất (mẫu ở §2)
affixes[].groupOFF · DEF · UTIL★cỡ nhóm [min,max]
affixes[].statHP_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_modeFLAT · INC★FLAT/INC/MORE/NONE
affixes[].unit% · pt% · HP · px · x · s · /s · pt★đơn vị hiển thị
affixes[].minnumber★biên dưới
affixes[].maxnumber★biên trên
affixes[].stepnumber [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_vistringđiều kiện chữ
affixes[].hero_filterNONE · HAS_PROJ_MOVE★lọc kit hero
affixes[].excl_groupstring ^[A-Z_]+$cùng nhóm stat ≤ 1/Relic
affixes[].desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
affixes[].demo_idstring ^X\d{2}$id demo cũ (ánh xạ Bible §2.4)
affixes[].mechanicstring ^([a-z_]+\.[a-z_]+|MK_[A-Z_]+__[A-Z_]+)$mechanic_key của hàng; Then Chốt = mảng 2 key
docstring★doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8)
rarity_uobject★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_weightsobject★trọng số nhóm affix 1
group_weights.OFFnumber [0..]★chỉ số OFF (doc 10 §2.1)
group_weights.DEFnumber [0..]★chỉ số DEF (doc 10 §2.1)
group_weights.UTILnumber [0..]★chỉ số UTIL (doc 10 §2.1)

4.7 mechanics.json — mechanics.schema.json (luật: doc 12 §9–§10)

FieldKiểu / giá trị cho phép★Nghĩa
triggers[ object ] (46..46)★46 trigger doc 12 §9.2
triggers[].idpassive · 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_vistring★chữ thẻ/tooltip, mẫu câu có {param}
primitives[ object ] (186..)★công cụ pixelfx
primitives[].idstring ^[a-z][a-z_]*$★ID duy nhất (mẫu ở §2)
primitives[].familystring ^F(0[1-9]|1[0-6])$★họ F01–F16
primitives[].classMECH · PARAM · RES · STS · SHARED · FRAME★hạng nội dung
primitives[].ownerstring ^H\d{2}$ | SHARED · ALL★chủ của hàng (HxxSHAREDowner AV)
primitives[].exclusiveany★độc quyền
primitives[].dmg_kindMELEE · 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_vistring★chữ thẻ/tooltip, mẫu câu có {param}
territory[ object ] (12..12)★lãnh thổ 12 hero
territory[].herostring ^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_vistring★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[].idstring ^O\d{1,2}$★ID duy nhất (mẫu ở §2)
overlaps[].desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
overlaps[].heroes[ string ]hero liên quan
limitsobject★trần lớp
limits.param_per_hero_maxinteger [0..40]★PARAM ≤ 8
limits.frame_per_hero_maxinteger [0..40]★FRAME ≤ 6
limits.sts_per_hero_maxinteger [0..40]★STS ≤ 4
limits.mech_primitive_heroes_maxinteger [1..12]★1 primitive MECH ≤ n hero
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
tags[ object ] (21..21)★tag (21 tag HOA, sub-tag ANSWER:X, RES:X)
tags[].idCOMBO · DASH · ANSWER · COUNTER · SKILL · ULT · RES · CRIT · VITAL · AREA · PROJ · ZONE … (21)★ID duy nhất (mẫu ở §2)
tags[].name_vistring★tên hiển thị tiếng Việt có dấu
tags[].groupverb · effect · status★cỡ nhóm [min,max]
tags[].demo_mapstringánh xạ demo
tags[].glyphstring★sprite glyph HUD
tags[].desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
sub_tags[ object ]★sub-tag
sub_tags[].idstring `^(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[].parentANSWER · RES★tag cha
sub_tags[].herostring ^H\d{2}$★hero chủ
sub_tags[].name_vistring★tên hiển thị tiếng Việt có dấu
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
statuses[ object ] (12..12)★12 trạng thái doc 10 §5
statuses[].idstring ^STS_[A-Z]+$★ID duy nhất (mẫu ở §2)
statuses[].name_vistring★tên hiển thị tiếng Việt có dấu
statuses[].groupBUILD · CONTROL★cỡ nhóm [min,max]
statuses[].effect_vistring★hiệu ứng
statuses[].stackingnone_refresh · stacks · longest · strongest★cộng dồn
statuses[].max_stacksinteger [1..3]★lớp tối đa
statuses[].duration_snumber [0..]★thời lượng (s)
statuses[].tick_snumber [0..]chu kỳ tick ≥ 0.5
statuses[].by_massobject★kết quả theo S/M/L/XL
statuses[].by_mass.Sstring★trục Số trạng thái / hạng S
statuses[].by_mass.Mstring★override khớp
statuses[].by_mass.Lstring★hạng L
statuses[].by_mass.XLstring★chỉ số XL (doc 10 §2.1)
statuses[].on_heroany★gây lên hero được
statuses[].cleanse_vistringgiải trừ
statuses[].glyphstring★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_tagany★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
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
biomestring ^B[1-6]$★biome B1–B6/HUB
av_ownerstring ^(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[].idstring ^EN_B[1-6]_\d{2}$ | string ^EL_B[1-6]_\d{2}$★ID duy nhất (mẫu ở §2)
enemies[].name_vistring★tên hiển thị tiếng Việt có dấu
enemies[].name_enstringtên làm việc ASCII (không hiển thị)
enemies[].classnormal · elite★hạng nội dung
enemies[].tierS · M★hạng khối S/M/L/XL
enemies[].demo_idstringid demo cũ (ánh xạ Bible §2.4)
enemies[].role_vistring★vai Bible §7.2
enemies[].role_keyswarm · lunge · ranged · shield · self_destruct · bomber · dive_bomb · lead_shot · ambush · turret · flyer_slow · nest … (23)★khoá vai cho Đạo Diễn Tro
enemies[].rigbiped · quadruped · flyer · serpent · construct_driver · swarm★rig Bible §7.7
enemies[].aiswarm_melee · lunger · ranged_kiter · ranged_lead · shield_bearer · bomber_self · ambusher · stationary · flyer_swarm · `spawner_mo… | ★ | archetype AI doc 14 §2.2
enemies[].home_actinteger [1..6]★Hồi gốc (số soạn ở Hồi này, doc 17 §5.1)
enemies[].statsmap 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[].adaptiveobject★khối thích nghi
enemies[].adaptive.sourceBASE · 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[].spawnobject★tham số Director
enemies[].spawn.weightnumber [0..]★trọng số cuộn
enemies[].spawn.group[ integer [1..] ] (2..2)★cỡ nhóm [min,max]
enemies[].spawn.budget_costnumber [0..]ASH 1 / BASE 0
enemies[].spawn.tpnumber [0..60]★điểm đe doạ doc 15 §2.1
enemies[].spawn.cap_groupSWARM · LUNGE · RANGED · SHIELD · BOMB · AMBUSH · STATIC · FLOCK · NEST · SUPPORT · ROLL · CHARGE … (21)★nhóm trần sống
enemies[].spawn.cap_aliveinteger [1..250] | any★trần sống/phòng; null = không
enemies[].spawn.pairanycặp trạng thái
enemies[].spawn.script_onlyanychỉ kịch bản sinh
enemies[].spawn.min_actinteger [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_okanyđược ở R1
enemies[].spawn.spawn_styleash_mark · emerge · drop · vortexkiểu xuất hiện
enemies[].dropsobject★rơi
enemies[].drops.xpnumber [0..]★XP
enemies[].drops.soul_ashnumber [0..]★Tro Hồn
enemies[].drops.paper_goldnumber [0..]Vàng Mã
enemies[].drops.heal_orb_pctnumber [0..1]tỉ lệ cầu máu
enemies[].drops.echo_shardinteger [0..]Mảnh Vọng
enemies[].drops.relic_choiceinteger [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_slotsinteger [0..1]ô Ấn
enemies[].visualobject★khối hình ảnh doc 12 §8.2
enemies[].visual.height_pxinteger [16..64]★cao px
enemies[].visual.palette[ string ^#[0-9a-fA-F]{6}$ ] (1..8)★≤ 8–12 hex
enemies[].visual.accent_hexstring ^#[0-9a-fA-F]{6}$màu nhấn
enemies[].visual.alt_accentanycó mask ALT
enemies[].visual.codestring★mã pixelfx/asset ASCII thường
enemies[].codexstring ^CDX_[a-z0-9_]+$★trang Sổ Tang CDX_*
enemies[].lore_vistringlore 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[].assumedanytrue = có số [ASSUMED] lượt đầu, playtest chỉnh
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
idstring ^(BS_B[1-4]|BS_FINAL|BS_TRUE|MB_B[1-6]_\d)$★ID duy nhất (mẫu ở §2)
name_vistring★tên hiển thị tiếng Việt có dấu
name_enstringtên làm việc ASCII (không hiển thị)
classminiboss · boss · final · true_final★hạng nội dung
tierL · XL★hạng khối S/M/L/XL
biomestring ^B[1-6]$★biome B1–B6/HUB
actact_key (I · II · III · IV · V · VI)★Hồi I..VI (V = Kết B5, VI = Bí mật B6)
nodeMBS · BOS★MBS/BOS
rigbiped · quadruped · flyer · serpent · construct_driver · swarm★rig Bible §7.7
duration_target_snumber [30..300]★thời lượng mục tiêu
drivers_vistringđộng lực thiết kế
tp_reservenumber [0..60]TP giữ chỗ
arenaobject★sân
arena.shapecircle · rect · ring · lane★hình hitbox doc 10 §1.4
arena.size_px[ number [0..] ] (1..2)★cỡ px
arena.roomstring ^RM_(B[1-6]|HUB)_[a-z0-9_]+$id phòng
arena.gate_lockany★khoá cổng
arena.hazards[ string ^HZ_B[1-6]_[a-z0-9_]+$ ]hazard (INV-18)
arena.adds_trickleobject★sân rỉ ≥ 6 S/20 s
arena.adds_trickle.countinteger [6..]★số
arena.adds_trickle.interval_snumber [1..20]★chu kỳ (s)
arena.adds_trickle.pool[ string ^EN_B[1-6]_\d{2}$ ] (1..)★danh sách id
arena.notes_vistringghi chú thiết kế
statsmap 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_idstring ^[a-z_]+$★id phần
parts[].name_vistring★tên hiển thị tiếng Việt có dấu
parts[].radiusnumber [0..]★bán kính px
parts[].part_multnumber [0.5..2.0]★nhân sát thương phần
parts[].sort_offsetinteger [-16..16]lệch sort px
parts[].breakableanyphá được
phases[ object ] (1..3)★pha
phases[].phaseinteger [1..3]★số pha
phases[].name_vistring★tên hiển thị tiếng Việt có dấu
phases[].hp_enter_pctnumber [0..100]★% HP vào pha
phases[].invuln_snumber [0..]★bất tử chuyển pha
phases[].push_rnumber [0..]đẩy hero r
phases[].rest_snumber [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_vistring★dạng pha
phases[].music_stingerstringstinger pha
phases[].arena_change_vistringđổ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_vistring★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_vistringghi chú thiết kế
adaptationobject★Tro Nhớ boss
adaptation.counters[ → counter_variant (§4.0) ] (0..2)★thế đáp CV (doc 14 §12)
adaptation.special_choiceobjectlựa đặc biệt boss
adaptation.special_choice.kindweapon_pick · shadow_order · chain_stop · mirror_hero★loại (enum)
adaptation.special_choice.options[ string ] (1..)★lựa chọn
adaptation.special_choice.reads_vistringđọc gì
adaptation.special_choice.default_order[ string ] (1..)★thứ tự mặc định
memoryobject★MACRO/Sẹo
memory.macroany★đọc Sổ Thù
memory.scar_okany★cho Sẹo
memory.opener_card_vistringthẻ mở màn
memory.loose_hand_vistringtay lỏng
staggerobject★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_vistringthưởng Vỡ Thế
stagger.notes_vistringghi chú thiết kế
rewardsobject★thưởng
rewards.xpnumber [0..]★XP
rewards.soul_ashnumber [0..]★Tro Hồn
rewards.echo_shardinteger [0..]★Mảnh Vọng
rewards.relic_choiceinteger [0..3]★lựa Relic
rewards.heal_to_pctnumber [0..100]★hồi tới %
rewards.first_kill_vistringthưởng lần đầu
dialogueobject★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_linesmap ^H\d{2}$ → string ^DLG_[A-Z0-9_]+_\d{3}$Hxx → DLG
musicstring ^MUS_[a-z0-9_]+$★cue nhạc
codexstring ^CDX_[a-z0-9_]+$★trang Sổ Tang CDX_*
lore_vistringlore ngắn
av_ownerstring ^(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
visualobject★khối hình ảnh doc 12 §8.2
visual.height_pxinteger [48..96]★cao px
visual.palette[ string ^#[0-9a-fA-F]{6}$ ] (1..10)★≤ 8–12 hex
visual.codestring★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
assumedanytrue = có số [ASSUMED] lượt đầu, playtest chỉnh
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
modifiers[ object ] (1..16)★16 Ấn Tinh Anh
modifiers[].idstring ^EM\d{2}$★ID duy nhất (mẫu ở §2)
modifiers[].name_vistring★tên hiển thị tiếng Việt có dấu
modifiers[].effect_vistring★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_sourceBASE · ASH★BASE/ASH (Bible §11)
modifiers[].mrn05_safeany★an toàn MRN05
modifiers[].uses_purple_tokenany★ăn token tím
modifiers[].speed_buffnumber [0..1]buff tốc (kẹp INV-17)
modifiers[].glyphstring ^glyph_em\d{2}$★sprite glyph HUD
modifiers[].counter_hint_vistringgợi ý khắc chế
modifiers[].cut_lineanycắ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
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
ownerstring ^(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 (HxxSHAREDowner AV)
partstring ^[a-z0-9_]+$phần file AV
actors[ object ]actor spec doc 30 §5.1
actors[].idstring★ID duy nhất (mẫu ở §2)
actors[].codestring ^[a-z0-9_]+$★mã pixelfx/asset ASCII thường
actors[].tierhero · S · M · L · XL · npc · summon★hạng khối S/M/L/XL
actors[].biomestring ^(B[1-6]|HUB|-)$★biome B1–B6/HUB
actors[].rigbiped · quadruped · flyer · serpent · construct_driver · swarm★rig Bible §7.7
actors[].silhouetteobject★cao/rộng/3 khối/dấu đám đông
actors[].silhouette.height_pxinteger [16..96]★cao px
actors[].silhouette.width_pxinteger [8..128]★rộng px
actors[].silhouette.masses_vi[ string ] (3..3)★3 khối lớn
actors[].silhouette.crowd_mark_vistring★dấu nhận trong bầy
actors[].skeletonobject★override M/bulk
actors[].skeleton.Mmap key → number [0..]★override khớp
actors[].skeleton.bulkmap key → number [0..]★độ dày
actors[].skeleton.extra_keys[ string ]phím phụ
actors[].weaponobject★vũ khí stock hoặc mới
actors[].weapon.stocksword · greatsword · dagger · spear · hammer · scythe · claw · bow · pistol · launcher · handle · nonevũ khí stock pixelfx
actors[].weapon.weapon_idstring ^[a-z0-9_]+$WEAPONS.<id>
actors[].weapon.off_weaponstringvũ khí tay phụ
actors[].weapon.desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
actors[].rampsobject★≤ 4 họ × 4 tông + nhấn + ink
actors[].ramps.families[ object ] (1..4)★họ ramp
actors[].ramps.families[].namestring★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[].sourcestring★nguồn
actors[].ramps.accent_hexstring ^#[0-9a-fA-F]{6}$màu nhấn
actors[].ramps.ink_hexstring ^#[0-9a-fA-F]{6}$★màu viền
actors[].ramps.glow_mask_vistringmask phát sáng
actors[].facingse · sw · s★hướng mặc định
actors[].clips[ object ] (1..)★bộ clip anim
actors[].clips[].clipstring ^[a-z0-9_]+$★tên clip
actors[].clips[].framesinteger [1..160]★số frame @30
actors[].clips[].fpsinteger [8..30]★fps
actors[].clips[].loopany★lặp
actors[].clips[].t0_vistring★nghĩa t = 0
actors[].clips[].hits[ integer [0..] ]★frame trúng
actors[].clips[].steps12 · 24 · 30★12/24/30
actors[].clips[].note_vistringghi chú thiết kế
actors[].socketsobject★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_hitmap key → [ number ] (2..2)mũi vũ khí theo clip
actors[].reactionsobject★phản ứng
actors[].reactions.skinchar · ice · shock · holy · shadow · poison★skin act
actors[].reactions.flash_snumber [0..0.2]★chớp
actors[].reactions.mass_classS · M · L · XL · hero · npc★hạng khối
actors[].reactions.broken_clipstringclip Vỡ Thế
actors[].phases[ object ]pha
actors[].phases[].phaseinteger [1..3]★số pha
actors[].phases[].methodlut_row · part_toggle · sheet_swap★LUT/part/sheet
actors[].phases[].desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
actors[].parts[ object ]phần tách (L/XL)
actors[].parts[].namestring★tên riêng hiển thị (hero)
actors[].parts[].pivot[ number ] (2..2)★neo
actors[].parts[].sort_offsetinteger [-16..16]★lệch sort px
actors[].parts[].hitbox_rnumber [0..]★hitbox phần
actors[].portraits[ object ]chân dung
actors[].portraits[].namestring ^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[].budgetobject★ngân sách atlas
actors[].budget.atlas_pagesnumber [0..8]★trang 2048²
actors[].budget.frames_per_dir_maxinteger [1..1400]★frame/hướng tối đa
actors[].bans_vi[ string ]điều cấm
actors[].exportobject★lệnh xuất
actors[].export.commands[ string ] (1..)★lệnh
actors[].export.atlas_groupstringnhóm atlas
actors[].reviewobject★duyệt (inv01_check, check.mjs, art-style-reviewer, ngày)
actors[].review.inv01_checkstringkết quả inv01_check
actors[].review.check_mjsstringkết quả check.mjs
actors[].review.art_style_reviewerpending · pass · fail★pending/pass/fail
actors[].review.datestringngày duyệt
env_assets[ object ]tile/prop doc 30 §6.4
env_assets[].idstring ^ENV_(B[1-6]|HUB)_[a-z0-9_]+$★ID duy nhất (mẫu ở §2)
env_assets[].kindFLOOR · FLOOR_DETAIL · EDGE · WALL_N · WALL_S · LIQUID · PROP · PROP_ANIM · DECAL · LIGHT★loại (enum)
env_assets[].sizeobject★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_pxnumber [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[].variantsobject★biến thể
env_assets[].variants.countinteger [1..]★số
env_assets[].variants.weights[ number [0..] ]trọng số theo pha 1..3
env_assets[].variants.seedinteger [0..]seed pixelfx
env_assets[].animobjectclip anim
env_assets[].anim.framesinteger [1..]★số frame @30
env_assets[].anim.fpsinteger [1..30]★fps
env_assets[].anim.loopany★lặp
env_assets[].collisionnone · rect · ellipse★va chạm
env_assets[].occlusionany★mờ khi che (> 24 px)
env_assets[].lightobjectánh sáng
env_assets[].light.rnumber [0..]★bán kính
env_assets[].light.alphanumber [0..1]★độ mờ
env_assets[].light.hexstring ^#[0-9a-fA-F]{6}$★màu
env_assets[].sourcestring★nguồn
env_assets[].desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
env_assets[].reviewobject★duyệt (inv01_check, check.mjs, art-style-reviewer, ngày)
env_assets[].review.inv01_checkstringkết quả inv01_check
env_assets[].review.art_style_reviewerpending · pass · fail★pending/pass/fail
vfx[ object ]★danh sách VFX id phát cùng hàng
vfx[].idstring ^VFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$★ID duy nhất (mẫu ở §2)
vfx[].owner_classHERO · ENEMY · TELL · ENV · SHARED★HERO/ENEMY/TELL/ENV/SHARED (doc 31 §3)
vfx[].tintEXPORT · HERO_LUT · BIOME · BIOME_ALT · FIXED★cách tô
vfx[].triggerstring★trigger thẻ doc 13 §5.9 (PASSIVE, ON_HIT…)
vfx[].layerfloor_decal · shadow · floor_tell · body_back · body_front · overhead · prioritize · screen★MICRO/MESO
vfx[].size_classS · M · L · XL★hạng cỡ VFX
vfx[].canvasobject★khung vẽ hướng e (w,h,origin)
vfx[].canvas.winteger [1..480]★rộng
vfx[].canvas.hinteger [1..270]★cao
vfx[].canvas.origin[ number ] (2..2)★gốc [x,y]
vfx[].pivotstring ^(feet|impact|muzzle|floor|socket:[a-z_]+)$★neo
vfx[].dirsinteger [1..8]★hướng / số hướng
vfx[].tiltnumber [0.6..1.1]tilt 0.6–1.1
vfx[].framesobject★số frame @30
vfx[].frames.countinteger [1..150]★số
vfx[].frames.fpsinteger [8..30]★fps
vfx[].frames.loopany★lặp
vfx[].frames.duration_snumber [0..]★thời lượng (s)
vfx[].phasesobject★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[].tnumber★thời điểm s
vfx[].keyframes[].desc_vistring★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[].kindstring★loại (enum)
vfx[].particles[].countinteger [0..]★số
vfx[].particles[].speednumber [0..]tốc px/s
vfx[].particles[].life_snumber [0..]đời s
vfx[].particles[].hexstring ^#[0-9a-fA-F]{6}$màu
vfx[].particles[].gravitynumbertrọng lực
vfx[].particles[].shadowanybóng
vfx[].lightobjectánh sáng
vfx[].light.knumber [0.2..0.5]★cường độ 0.2–0.5
vfx[].light.radius_pxnumber [0..]★bán kính px
vfx[].light.life_snumber [0..]★đời s
vfx[].light.floor_poolany★vũng sàn
vfx[].easingobject★gia tốc + freeze
vfx[].easing.curveoutQuart · outExpo · inOutQuad · linear★đường cong
vfx[].easing.freeze_snumber [0..]đóng băng s
vfx[].hitboxobjecthình + khớp (doc 31 §7)
vfx[].hitbox.shapestring ^(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.matchstringphủ %/lệch px
vfx[].hitbox.wavereach · procedural · nonereach/procedural
vfx[].rankobjectnâ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[].variantsobjectbiến thể
vfx[].variants.seedinteger [0..65535]★seed pixelfx
vfx[].variants.aspect_palettesany★palette theo Dạng Rèn
vfx[].variants.altany★biến thể ALT
vfx[].variants.colorblind_vistring★mù màu
vfx[].perfobject★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_dirinteger [1..]★frame/hướng
vfx[].perf.atlas_pagesnumber [0..]trang 2048²
vfx[].perf.instance_capinteger [1..]★trần instance
vfx[].perf.lightsinteger [0..]số Lights
vfx[].lodnever · L1 · L2 · L3★never/L1/L2/L3
vfx[].sfxstring ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$danh sách SFX id phát cùng hàng
vfx[].sourcestring ^(reuse|recolor|new|shader) .+★nguồn
vfx[].exportstring★lệnh xuất
vfx[].reviewobject★duyệt (inv01_check, check.mjs, art-style-reviewer, ngày)
vfx[].review.check_mjsstringkết quả check.mjs
vfx[].review.inv01_checkstringkết quả inv01_check
vfx[].review.hitbox_overlaystringảnh overlay hitbox
vfx[].review.art_style_reviewerpending · pass · fail★pending/pass/fail
vfx[].review.datestringngày duyệt
vfx[].desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
sfx[ object ]★danh sách SFX id phát cùng hàng
sfx[].idstring ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$★ID duy nhất (mẫu ở §2)
sfx[].ownerstring★chủ của hàng (HxxSHAREDowner AV)
sfx[].hookstring★EventName phát / hook nâng cấp
sfx[].framestring★khung nút / frame
sfx[].kindswing · 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[].roletransient · body · tail★vai
sfx[].layers[].desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
sfx[].length_msinteger [10..120000]★dài ms
sfx[].variantsinteger [1..12]★biến thể
sfx[].pitch_rand_pctnumber [0..12]★±% cao độ
sfx[].vol_rand_dbnumber [0..3]★±dB
sfx[].priorityinteger [0..255]★ưu tiên 0–255 (0 cao)
sfx[].max_voicesinteger [1..24]★trần voice
sfx[].cooldown_msinteger [0..]★khoảng tối thiểu
sfx[].stealoldest · quietest · none★cướp voice
sfx[].spatialcenter · screen_pan · screen_pan_full★pan
sfx[].clockWorld · Hero · UI★đồng hồ
sfx[].busMaster · 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_mmaxnumber [-40..-6]★momentary-max LUFS
sfx[].loopany★lặp
sfx[].loop_startinteger [0..]mẫu đầu loop
sfx[].loop_endinteger [0..]mẫu cuối loop
sfx[].tell_classY · P · N · none★Y/P/N/none
sfx[].asset_refstring ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$âm chung dùng lại
sfx[].sourcereuse · freesound · synth · foley · outsource★nguồn
sfx[].brief_vistring★brief + 'KHÔNG được nghe như…'
sfx[].freesound_querystringquery + lọc
sfx[].synth_recipestringrecipe create-sfx
sfx[].creditstringcredit CC BY
sfx[].statusbrief · sourced · mastered · wired · final★STS_X:giây hoặc null
sfx[].verdictpending · ok · redo★pending/ok/redo
barks[ object ]bark chữ ≤ 1 dòng
barks[].idstring ^BARK_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$★ID duy nhất (mẫu ở §2)
barks[].speakerstring★người nói
barks[].triggerstring★trigger thẻ doc 13 §5.9 (PASSIVE, ON_HIT…)
barks[].text_vistring ≤ 64 ký tự★chữ
barks[].voice_sfxstring ^SFX_[A-Z][A-Z0-9_]*?_[a-z0-9][a-z0-9_]*$giọng không lời
barks[].priorityboss · ash_callout · npc · hero★ưu tiên 0–255 (0 cao)
barks[].cooldown_snumber [0..]hồi chiêu (s)
barks[].onceany1 lần
docstringdoc đị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)

FieldKiểu / giá trị cho phép★Nghĩa
idstring ^B[1-6]$ | = "HUB"★ID duy nhất (mẫu ở §2)
name_vistring★tên hiển thị tiếng Việt có dấu
actact_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_vistring★chủ đề
paletteobject★≤ 8–12 hex
palette.family_vistring★họ màu
palette.floor_hexstring ^#[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.tokensmap key → string ^#[0-9a-fA-F]{6}$★token màu hệ thống
palette.light_hexstring ^#[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[].idstring ^HZ_B[1-6]_[a-z0-9_]+$★ID duy nhất (mẫu ở §2)
hazards[].name_vistring★tên hiển thị tiếng Việt có dấu
hazards[].tellY · P · N · NONE★Y vàng / P tím / N vùng / NONE (INV-02)
hazards[].period_snumber [1.0..]★chu kỳ ≥ 1.0
hazards[].windup_snumber [0..]windup (sàn doc 11 §1.2)
hazards[].dmgnumber [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_vistring★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_tokenany★ă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[].idstring ^RM_(B[1-6]|HUB)_[a-z0-9_]+$★ID duy nhất (mẫu ở §2)
rooms[].name_vistring★tên hiển thị tiếng Việt có dấu
rooms[].shapecircle · rect · corridor · arena · hub★hình hitbox doc 10 §1.4
rooms[].size_px[ number [0..] ] (2..2)★cỡ px
rooms[].safe_center_rnumber [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[].landmarkstring ^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_vistringghi 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
ambienceobject★bed + spot
ambience.bedstring ^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_vistringđiều cấm
musicobject★cue nhạc
music.mainstring ^MUS_[a-z0-9_]+$★cue chính
music.h12string ^MUS_[a-z0-9_]+$bộ stem H12
music.bossstring ^MUS_[a-z0-9_]+$boss
music.ministring ^MUS_[a-z0-9_]+$mini-boss
landmarks[ object ]★landmark
landmarks[].idstring ^LMK_(B[1-6]|HUB)_[a-z0-9_]+$★ID duy nhất (mẫu ở §2)
landmarks[].name_vistring★tên hiển thị tiếng Việt có dấu
landmarks[].desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
landmarks[].roomstring ^RM_(B[1-6]|HUB)_[a-z0-9_]+$id phòng
enemy_setstring ^EN_B[1-6]$owner AV quái
minibosses[ string ^MB_B[1-6]_\d$ ] (0..2)mini-boss
bossstring ^(BS_B[1-4]|BS_FINAL|BS_TRUE|MB_B[1-6]_\d)$boss
env_avstring ^ENV_(B[1-6]|HUB)$★owner AV môi trường
stations[ string ^ST_[A-Z_]+$ ]trạm
lore_vistringlore ngắn
codexstring ^CDX_[a-z0-9_]+$trang Sổ Tang CDX_*
docstring★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[].idstring ^OBJ_[A-Z0-9_]+$★ID duy nhất (mẫu ở §2)
objective_props[].name_vistring★tên hiển thị tiếng Việt có dấu
objective_props[].hpnumber [0..]HP
objective_props[].envstring ^ENV_(B[1-6]|HUB)_[a-z0-9_]+$ENV sprite

4.15 encounters.json — encounters.schema.json (luật: doc 15 §2–§13)

FieldKiểu / giá trị cho phép★Nghĩa
objectives[ object ] (10..13)★mục tiêu
objectives[].idPURGE · VIGIL · BELLS · TIDE · NEST · GAUNTLET · CHASE · DUEL · HUNT · RESCUE · BOSS · MINIBOSS … (13)★ID duy nhất (mẫu ở §2)
objectives[].name_vistring★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_sobject★thời điểm trung vị đạt mục tiêu
objectives[].t_target_s.Inumber [0..]★Hồi I
objectives[].t_target_s.II_IVnumber [0..]★chỉ số II_IV (doc 10 §2.1)
objectives[].obj_multnumber/array★nhân ngân sách mục tiêu
objectives[].curveSTD · FLAT · TIDE · RUN · GATE★đường cong
objectives[].win_vistring★điều kiện thắng
objectives[].fail_vistring/null★thua mục tiêu
objectives[].mesoany★cho MESO
objectives[].time_cap_snumber/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[].idEDGE · 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_vistring★hình
patterns[].p1_vistringnghĩa p1
patterns[].p2_vistringnghĩa p2
patterns[].p1_defaultnumber/string/nullp1 mặc định
patterns[].p2_defaultnumber/string/nullp2 mặc định
patterns[].in_viewno · 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[].biomestring ^B[1-6]$★biome B1–B6/HUB
directors[].B_roomnumber [0..]★ngân sách phòng TP
directors[].BPS_actnumber [0..]★TP/giây
directors[].mixmap ^(EN|EL)_B[1-6]_\d{2}$ → number [0..100]★lufs_i_full/true_peak/ducked_by
directors[].intro_rowsobject★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_vistring★mẫu đặc trưng
directors[].objective_propsmap enum → string ^OBJ_[A-Z0-9_]+$★đạo cụ mục tiêu OBJ_*
directors[].carrier_vistringngười mang báu CHASE
directors[].boss_tricklestring ^EN_B[1-6]_\d{2}$★quái sân rỉ
directors[].priority_killstring ^EN_B[1-6]_\d{2}$ | any★vai ưu tiên diệt
directors[].trialobjectải Kết/Bí mật
directors[].trial.idFINALE_TRIAL · SHORE_TRIAL★ID duy nhất (mẫu ở §2)
directors[].trial.duration_snumber [0..]★thời lượng (s)
directors[].trial.rules_vistring★luật
wave_scripts[ object ] (1..)★kịch bản sóng (wave_scripts.csv)
wave_scripts[].script_idstring ^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[].biomestring ^B[1-6]$★biome B1–B6/HUB
wave_scripts[].objectivePURGE · 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_actI · II · III · IV · V · VI★Hồi gốc (số soạn ở Hồi này, doc 17 §5.1)
wave_scripts[].t_target_snumber [20..180]★thời điểm trung vị đạt mục tiêu
wave_scripts[].corridor_pxnumber [0..]dài hành lang
wave_scripts[].rows[ object ] (2..)★dòng kịch bản
wave_scripts[].rows[].rowinteger [1..999]★thứ tự dòng
wave_scripts[].rows[].triggerT · PCT · PH · EV★trigger thẻ doc 13 §5.9 (PASSIVE, ON_HIT…)
wave_scripts[].rows[].atnumber/string★giá trị trigger
wave_scripts[].rows[].untilnumber/string/nullhết hiệu lực
wave_scripts[].rows[].actionBUDGET · MIX · BEAT · ELITE · MINI · BOSS · OBJ · HAZ · CALL · REST · CAP · WIN … (14)★hành động doc 13 §5.9
wave_scripts[].rows[].targetstring/nullđích Edge doc 13 §5.4
wave_scripts[].rows[].nnumber/nullsố theo action
wave_scripts[].rows[].everynumber/nullchu kỳ lặp s
wave_scripts[].rows[].patternstring ^(EDGE|PACK|RING|ARC|ARC_BACK|FLANK|BURST|TRICKLE|SWARM|AMBUSH|GATE|FAR|NEST|LINE)(@OBJ)?$ | anymẫu spawn §3 (+@OBJ)
wave_scripts[].rows[].p1number/string/nulltham số 1
wave_scripts[].rows[].p2number/string/nulltham số 2
wave_scripts[].rows[].flags[ string ^(NO_MESO|ARROW|NO_ELITE|CHILD|OBJ_ATTACK(:\d+)?)$ ]cờ
wave_scripts[].rows[].notestringghi chú (không loc)
wave_scripts[].desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
wave_scripts[].assumedanytrue = có số [ASSUMED] lượt đầu, playtest chỉnh
tp_table[ object ]bảng TP & trần
tp_table[].enemystring ^(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[].tpnumber [0..]★điểm đe doạ doc 15 §2.1
tp_table[].cap_groupstring★nhóm trần sống
tp_table[].cap_aliveinteger/null★trần sống/phòng; null = không
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
acts[ object ] (6..6)★6 Hồi
acts[].actI · II · III · IV · V · VI★Hồi I..VI
acts[].biomestring ^B[1-6]$★biome B1–B6/HUB
acts[].rowsinteger [1..8]★dòng kịch bản
acts[].median_snumber [0..]★trung vị giây
acts[].transition_snumber [0..]chuyển Hồi
acts[].bossstring ^(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_fromanyHồi có mutator
gridobject★lưới bản đồ
grid.lanesinteger [2..6]số làn
grid.rowsinteger [1..8]dòng kịch bản
grid.cross_maxinteger [0..]giao làn tối đa
node_types[ object ] (11..11)★loại nút
node_types[].idCMB · ELT · CHL · EVT · SHP · RST · SEC · RSC · MBS · BOS · DOCK★ID duy nhất (mẫu ở §2)
node_types[].name_vistring★tên hiển thị tiếng Việt có dấu
node_types[].frameC · G · U · R6 · DOCK★khung nút / frame
node_types[].t_sobject★thời lượng I–IV
node_types[].t_s.Inumber [0..]★Hồi I
node_types[].t_s.IInumber [0..]★chỉ số II (doc 10 §2.1)
node_types[].t_s.IIInumber [0..]★chỉ số III (doc 10 §2.1)
node_types[].t_s.IVnumber [0..]★chỉ số IV (doc 10 §2.1)
node_types[].iconstring ^icon_[a-z0-9_]+$★tên sprite icon icon_<slug>
node_types[].reward_rule_vistring★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[].idstring ^LN_[A-Z0-9_]+$★ID duy nhất (mẫu ở §2)
lane_templates[].r1C · G · U★hàng 1
lane_templates[].r2C · G · U★hàng 2
lane_templates[].r3C · G · U★hàng 3
lane_templates[].r4C · G · U★hàng 4
lane_templates[].r5C · G · U★hàng 5
lane_templates[].weightnumber [0..]★trọng số cuộn
child_weightsmap 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[].idstring ^MAP_FB_(I|II|III|IV|V|VI)_\d$★ID duy nhất (mẫu ở §2)
map_fallback[].actI · 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[].iconEDGE+ · SKILL · RELIC · GOLD · HEAL · META · ECHO★tên sprite icon icon_<slug>
reward_tables[].weight_CMBnumber [0..]★trọng số ở CMB
reward_tables[].weight_CHLnumber [0..]★trọng số ở CHL
reward_tables[].amountobject★lượng
reward_tables[].amount.Inumber [0..]Hồi I
reward_tables[].amount.IInumber [0..]chỉ số II (doc 10 §2.1)
reward_tables[].amount.IIInumber [0..]chỉ số III (doc 10 §2.1)
reward_tables[].amount.IVnumber [0..]chỉ số IV (doc 10 §2.1)
shop_prices[ object ] (1..)★giá Sạp Rong
shop_prices[].slotEDGE · 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[].rarityCOMMON · RARE · EPIC · ANY★COMMON/RARE/EPIC/LEGENDARY/CURSED (doc 13 §5.1)
shop_prices[].priceinteger [0..]★giá Vàng Mã
heal_budget[ object ]ngân sách HP %/Hồi
heal_budget[].actI · II · III · IV · V · VI★Hồi I..VI
heal_budget[].pctnumber [0..500]★phần trăm
settings→ params (§4.0)núm run_structure.csv
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
events[ object ] (1..40)★sự kiện
events[].idstring ^EVT_B[1-6]_\d{2}$★ID duy nhất (mẫu ở §2)
events[].biomestring ^B[1-6]$★biome B1–B6/HUB
events[].name_vistring★tên hiển thị tiếng Việt có dấu
events[].text_vistring★chữ
events[].speakerstringngười nói
events[].choices[ object ] (2..4)★2–4 lựa chọn
events[].choices[].text_vistring★chữ
events[].choices[].cost→ cost (§4.0)giá: {CUR_*: số}
events[].choices[].hp_cost_pctnumber [0..100]giá HP %
events[].choices[].outcomeobject★kết quả
events[].choices[].outcome.kindstring★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_vistring★kết quả chữ
events[].choices[].condition→ condition (§4.0)điều kiện có cấu trúc {kind, ref, op, value}
events[].weightnumber [0..]★trọng số cuộn
events[].conditions[ → condition (§4.0) ]điều kiện
events[].once_per_runany★1 lần/run
events[].codexstring ^CDX_[a-z0-9_]+$trang Sổ Tang CDX_*
events[].art_vistringart
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
bands[ object ] (15..15)★15 Khăn Tang
bands[].idstring ^MRN\d{2}$★ID duy nhất (mẫu ở §2)
bands[].name_vistring★tên hiển thị tiếng Việt có dấu
bands[].effect_vistring★hiệu ứng
bands[].max_rankinteger [1..3]★hạng tối đa theo rarity
bands[].points_per_rankinteger [1..3]★điểm Độ Tang/bậc
bands[].per_rank[ → params (§4.0) ] (1..3)★params mỗi bậc
bands[].unlockHồ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_tokenany★ăn token tím
bands[].glyphstring ^glyph_mrn\d{2}$★sprite glyph HUD
bands[].cut_lineanycắt được
docstring★doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8)
metaobject★meta Khăn Tang
meta.name_vistring★tên hiển thị tiếng Việt có dấu
meta.score_name_vistring★tên điểm
meta.max_totalinteger [0..]★tổng tối đa
meta.base_set_maxinteger [0..]★bộ gốc tối đa
meta.stationstring ^ST_[A-Z_]+$★trạm
meta.npcstring ^NPC_[A-Z]+$★NPC
meta.milestone_rewards[ object ]thưởng mốc
meta.milestone_rewards[].scoreinteger [0..]★điểm
meta.milestone_rewards[].echo_shardinteger [0..]★Mảnh Vọng

4.19 mutators.json — mutators.schema.json (luật: doc 17 §7.2)

FieldKiểu / giá trị cho phép★Nghĩa
mutators[ object ] (12..12)★12 Act Mutator
mutators[].idstring ^MUT\d{2}$★ID duy nhất (mẫu ở §2)
mutators[].name_vistring★tên hiển thị tiếng Việt có dấu
mutators[].effect_vistring★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_actinteger [2..5]★Hồi sớm nhất
mutators[].chl_safeany★an toàn CHL
mutators[].uses_purple_tokenany★ăn token tím
mutators[].speed_buffnumber [0..1]buff tốc (kẹp INV-17)
mutators[].glyphstring ^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
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
modes[ object ] (5..5)★5 mode
modes[].idSTANDARD · DAILY · ENDLESS · Đêm Hồi Chuông BOSS_RUSH · CUSTOM★ID duy nhất (mẫu ở §2)
modes[].name_vistring★tên hiển thị tiếng Việt có dấu
modes[].unlock_vistring★mở
modes[].unlock→ condition (§4.0)★điều kiện + giá mở
modes[].rules_vi[ string ] (1..)★luật
modes[].currency_multmap ^CUR_[A-Z_]+$ → number/string★nhân tiền tệ
modes[].mastery_multnumber [0..1]★nhân Thông Thạo
modes[].ash_layersALL · SEED · MICRO · CUSTOM_0_3★tầng Tro Nhớ
modes[].mourningoptional · fixed · off · custom★Khăn Tang
modes[].leaderboardany★bảng xếp hạng
modes[].seededany★seed cố định
modes[].score_formulastringcô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[].musicstring ^MUS_[a-z0-9_]+$cue nhạc
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
currencies[ object ] (4..4)★4 tiền tệ
currencies[].idstring ^CUR_[A-Z_]+$★ID duy nhất (mẫu ở §2)
currencies[].name_vistring★tên hiển thị tiếng Việt có dấu
currencies[].scopemeta · run★meta/run
currencies[].color_hexstring ^#[0-9a-fA-F]{6}$★màu
currencies[].iconstringtên sprite icon icon_<slug>
currencies[].sources[ object ] (1..)★nguồn
currencies[].sources[].keystring ^[a-z][a-z0-9_]*$★giọng
currencies[].sources[].desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
currencies[].sources[].amountnumber/string★lượng
currencies[].sources[].unit_vistringchữ tiếng Việt
currencies[].sources[].docstringdoc định nghĩa luật của file/khối (vd 12-Hero-Framework §8)
currencies[].sinks[ object ] (1..)★đích
currencies[].sinks[].keystring ^[a-z][a-z0-9_]*$★giọng
currencies[].sinks[].desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
currencies[].sinks[].amountnumber/string★lượng
currencies[].sinks[].unit_vistringchữ tiếng Việt
currencies[].sinks[].docstringdoc định nghĩa luật của file/khối (vd 12-Hero-Framework §8)
currencies[].income_target_vistring★mục tiêu thu nhập
currencies[].mode_multmap enum → number/string★nhân theo mode
currencies[].capnumber [0..]trần
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
hubobject★HUB_BELL_TOWER
hub.id= "HUB_BELL_TOWER"★ID duy nhất (mẫu ở §2)
hub.name_vistring★tên hiển thị tiếng Việt có dấu
hub.desc_vistring★chữ thẻ/tooltip, mẫu câu có {param}
stations[ object ] (8..8)★trạm
stations[].idstring ^ST_[A-Z_]+$★ID duy nhất (mẫu ở §2)
stations[].name_vistring★tên hiển thị tiếng Việt có dấu
stations[].npcstring ^NPC_[A-Z]+$ | any★NPC
stations[].func_vistring★chức năng
stations[].unlock→ condition (§4.0)điều kiện + giá mở
stations[].env_propstring ^ENV_(B[1-6]|HUB)_[a-z0-9_]+$prop trạm
restoration[ object ] (5..5)★Phục Dựng GD1–GD5
restoration[].idstring ^GD[1-5]$★ID duy nhất (mẫu ở §2)
restoration[].costnumber [0..]★giá: {CUR_*: số}
restoration[].unlocks_vistring★mở gì
restoration[].flags[ string ]cờ
restoration[].scene_vistringcảnh truyện
station_upgrades[ object ] (30..30)★30 nâng trạm UP_*
station_upgrades[].name_vistringtên hiển thị tiếng Việt có dấu
station_upgrades[].costnumber [0..]★giá: {CUR_*: số}
station_upgrades[].effect_vistring★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[].idstring ^UP_[A-Z_]+_\d$★ID duy nhất (mẫu ở §2)
station_upgrades[].stationstring ^ST_[A-Z_]+$★trạm
station_upgrades[].ninteger [1..5]★số theo action
offerings[ object ] (6..6)★Lễ Vật LV01–LV06
offerings[].name_vistring★tên hiển thị tiếng Việt có dấu
offerings[].costnumber [0..]★giá: {CUR_*: số}
offerings[].effect_vistring★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[].idstring ^LV\d{2}$ID duy nhất (mẫu ở §2)
unlock_nodes[ object ] (1..)★nút mở khoá
unlock_nodes[].idstring ^UNL_[A-Z0-9_]+$★ID duy nhất (mẫu ở §2)
unlock_nodes[].targetstring★đích Edge doc 13 §5.4
unlock_nodes[].trackHERO · MODE · ASPECT · ULT · POOL · MOURNING · STATION★nhánh
unlock_nodes[].condition_vistring★đ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ố}
masteryobject★Thông Thạo
mastery.xp_formulastring★công thức điểm Thông Thạo
mastery.rank_costobject★XP(MRn→n+1) = base + per_rank × n
mastery.rank_cost.basenumber [0..]★gốc
mastery.rank_cost.per_ranknumber [0..]★params mỗi bậc
mastery.mode_multmap 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[].idstring ^MR\d{2}$★ID duy nhất (mẫu ở §2)
mastery.ranks[].grants_vistring★thưởng bậc
mastery.ranks[].unlock_ids[ string ]id được mở
mastery.challenge_templates[ object ] (5..5)★TT1–TT5
mastery.challenge_templates[].idstring ^TT[1-5]$★ID duy nhất (mẫu ở §2)
mastery.challenge_templates[].desc_vistring★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
poolsobject★pool chung
pools.shared_edges_startinteger [0..72]★Edge chung sẵn
pools.relics_startinteger [0..60]★Relic sẵn
pools.unlock_cost_totalnumber [0..]★tổng giá mở
flags[ object ]★cờ
flags[].idstring ^FLAG_[A-Z_]+$★ID duy nhất (mẫu ở §2)
flags[].condition_vistring★điều kiện chữ
flags[].effect_vistring★hiệu ứng
docstring★doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8)
economyobjectkinh tế meta doc 17 §10
economy.meta_fixed_sinksmap ^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[].outcomestring ^(D[1-5]|W|W6)$★kết quả
economy.income_by_outcome[].soul_ashnumber [0..]★Tro Hồn
economy.income_by_outcome[].echo_shardnumber [0..]★Mảnh Vọng
economy.income_by_outcome[].masterynumber [0..]★Thông Thạo
economy.income_by_outcome[].minutesnumber [0..]★phút
economy.anti_grind_vi[ string ]luật chống cày
cosmetics[ object ]mỹ phẩm Nến Canh
cosmetics[].idstring ^(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[].kindSKIN · STATUE · MUSIC_BOX · PAINTING★loại (enum)
cosmetics[].cost→ cost (§4.0)★giá: {CUR_*: số}
cosmetics[].name_vistring★tên hiển thị tiếng Việt có dấu

4.23 npcs.json — npcs.schema.json (luật: doc 20 §8)

FieldKiểu / giá trị cho phép★Nghĩa
npcs[ object ] (7..7)★7 NPC
npcs[].idstring ^NPC_[A-Z]+$★ID duy nhất (mẫu ở §2)
npcs[].name_vistring★tên hiển thị tiếng Việt có dấu
npcs[].stationstring ^ST_[A-Z_]+$ | any★trạm
npcs[].role_vistring★vai Bible §7.2
npcs[].arc_vistringchữ tiếng Việt
npcs[].arc[ object ] (0..8)★beat arc / độ cung
npcs[].arc[].beatinteger [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_vistring★kết arc
npcs[].murmur_sfxstring ^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[].codexstring ^CDX_[a-z0-9_]+$trang Sổ Tang CDX_*
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
lines[ object ] (1..)★dòng thoại
lines[].idstring ^DLG_[A-Z0-9_]+_\d{3}$★ID duy nhất (mẫu ở §2)
lines[].speakerstring★người nói
lines[].listenerstringngười nghe
lines[].contextHUB_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[].priorityinteger [0..100]★ưu tiên 0–255 (0 cao)
lines[].text_vistring★chữ
lines[].onceany★1 lần
lines[].nextstring ^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_charsinteger [1..400]trần ký tự
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
endings[ object ] (3..3)★3 kết
endings[].idstring ^END_[A-Z_]+$★ID duy nhất (mẫu ở §2)
endings[].name_vistring★tên hiển thị tiếng Việt có dấu
endings[].condition_vistring★điều kiện chữ
endings[].conditions[ → condition (§4.0) ] (1..)★điều kiện
endings[].effects_vistring★hậu quả
endings[].unlocks[ string ]★mở
endings[].sets_flags[ string ^FLAG_[A-Z_]+$ ]cờ đặt
endings[].musicstring ^MUS_[a-z0-9_]+$★cue nhạc
endings[].cards[ object ]thẻ theo hero
endings[].cards[].herostring ^H\d{2}$★hero chủ
endings[].cards[].text_vistring★chữ
endings[].achievementstring ^ACH_[a-z0-9_]+$thành tựu
endings[].repeatableany★lặp được
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
pages[ object ] (1..)★trang codex
pages[].idstring ^CDX_[a-z0-9_]+$★ID duy nhất (mẫu ở §2)
pages[].categoryHERO · ENEMY · ELITE · BOSS · NPC · PLACE · LORE · RELIC · ADAPTIVE · LEDGER★loại
pages[].subjectstring★chủ thể
pages[].title_vistring★danh hiệu
pages[].body_vistring★nội dung
pages[].unlock→ condition (§4.0)★điều kiện + giá mở
pages[].ledger_pageany★trang Sổ Tang
pages[].frame_dataanyhiện frame data
pages[].paintinganycó tranh
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
cues[ object ] (1..)★cue nhạc (doc 32 §3.6)
cues[].idstring ^MUS_[a-z0-9_]+$★ID duy nhất (mẫu ở §2)
cues[].contextstring★ngữ cảnh
cues[].stateTITLE · HUB · DOCK · EXPLORE · COMBAT · BOSS · GATE_MINI · FINALE · SECRET · DEATH · ENDING · DRAFT★state MusicDirector
cues[].bpmnumber/null★tempo
cues[].meterstring★nhịp 4/4
cues[].keystring★giọng
cues[].chordsstring ^[A-Za-z0-9_]+\.chords\.json$|^-$file hợp âm
cues[].intro_barsinteger [0..]★ô intro
cues[].loop_barsinteger [0..]★ô loop
cues[].loop_samplesinteger [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[].adaptivemap key → any★khối thích nghi
cues[].stingers[ object ]★stinger
cues[].stingers[].slugstring ^[a-z0-9_]+$★slug
cues[].stingers[].barsnumber [0..]★ô
cues[].stingers[].entrynext_bar · next_beat · immediate★điểm vào
cues[].stingers[].cuts[ string ^S[0-4]([a-z0-9]+)?$ ]stem bị cắt
cues[].transitionsobject★quantize/fade/exit_to
cues[].transitions.quantizebar · beat · none★bar/beat
cues[].transitions.fade_in_barsnumber [0..]ô fade vào
cues[].transitions.fade_out_barsnumber [0..]ô fade ra
cues[].transitions.exit_tostringcue kế
cues[].leitmotifs[ string ^LM_[A-Z0-9_]+$ ]★LM_*
cues[].mixobject★lufs_i_full/true_peak/ducked_by
cues[].mix.lufs_i_fullnumber [-40..-10]★LUFS-I khi đủ stem
cues[].mix.true_peaknumber [-6..0]★dBTP
cues[].mix.ducked_by[ string ]bị duck bởi
cues[].files[ string ] (1..)★đường dẫn file
cues[].statusbrief · demo · final · approved★STS_X:giây hoặc null
cues[].h12_ofstring ^MUS_[a-z0-9_]+$cue gốc của bộ H12
cues[].banned[ string ]timbre cấm riêng cue
leitmotifs[ object ]★LM_*
leitmotifs[].idstring ^LM_[A-Z0-9_]+$★ID duy nhất (mẫu ở §2)
leitmotifs[].notesstring★nốt
leitmotifs[].instrument_vistring★nhạc cụ
leitmotifs[].ownerstringchủ của hàng (HxxSHAREDowner AV)
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
achievements[ object ] (1..60)★60 thành tựu
achievements[].idstring ^ACH_[a-z0-9_]+$★ID duy nhất (mẫu ở §2)
achievements[].name_vistring★tên hiển thị tiếng Việt có dấu
achievements[].desc_vistring★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[].hiddenany★ẩn
achievements[].steam_api_namestring ^[A-Z0-9_]+$★tên API Steam
achievements[].mercy_blockedany★khoá khi Thương Xót
achievements[].mourning_relatedanyliên quan Độ Tang
achievements[].iconstringtên sprite icon icon_<slug>
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
curves[ object ] (8..)★đường cong CRV_
curves[].idXP 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_vistring★tên hiển thị tiếng Việt có dấu
curves[].kindFORMULA · TABLE★loại (enum)
curves[].formulastringcông thức
curves[].xstring★trục x
curves[].ystring★trục y
curves[].x_unitstringđơn vị x
curves[].y_unitstringđơn vị y
curves[].interpLINEAR · STEP · NONE★nội suy
curves[].points[ object ]điểm {x,y}
curves[].points[].xnumber/string★trục x
curves[].points[].ynumber/object★trục y
curves[].checks[ object ]ví dụ VD- kiểm
curves[].checks[].xnumber/string★trục x
curves[].checks[].ynumber★trục y
curves[].checks[].vdstring ^VD-[A-Z0-9]+$id ví dụ doc 17
curves[].assumedanytrue = có số [ASSUMED] lượt đầu, playtest chỉnh
curves[].docstring★doc định nghĩa luật của file/khối (vd 12-Hero-Framework §8)
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
sectionsmap enum → map ^[a-z][a-z0-9_.]*$ → object★section → khoá → núm
ai_archetypes[ object ]ai_archetypes.csv
ai_archetypes[].aiswarm_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_ringinner · outer · nonevòng vây
ai_archetypes[].keep_minnumber [0..]giữ cự ly min
ai_archetypes[].keep_maxnumber [0..]giữ cự ly max
ai_archetypes[].flee_distnumber [0..]chạy xa
ai_archetypes[].flee_timenumber [0..]chạy giây
ai_archetypes[].token_kind[ MELEE · PROJ · P_FLOOR · HEAVY · SIGNATURE · NONE ] (1..)★token
ai_archetypes[].approach_modestringcách tiếp cận
ai_archetypes[].special_vistring★đặc biệt
ash_spawn_shift[ object ]vai khắc chế theo trục
ash_spawn_shift[].axisstring★trục
ash_spawn_shift[].dirHIGH · 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_vistringghi chú thiết kế
docstring★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)

FieldKiểu / giá trị cho phép★Nghĩa
axes[ object ] (12..12)★12 trục PSP
axes[].idstring ^A\d{2}$★ID duy nhất (mẫu ở §2)
axes[].keystring ^[A-Z_]+$★giọng
axes[].name_vistring★tên hiển thị tiếng Việt có dấu
axes[].measure_vistring★đ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_baseany★BASE đọc được
axes[].habit_vistring★thói quen bị đọc
docstring★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ếuPhải trỏ tớiGhi 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_idmoves[].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_requiresEDGE:/SKILL:/UL:/AS:/RS1:/RS2:/LV: + id tồn tại1 điều kiện, không chuỗi (doc 13 §5.2)
params.tpltemplates[].id của hero_upgrades/<Hxx>.json hoặc shared_edges.jsonaction = CUSTOM_HOOK
mechanic, mechanic_keycặ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_attacksattacks[].id cùng chủ
CUR_* · NPC_* · ST_* · FLAG_* · END_* · EM/MRN/MUTcurrencies · 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.json khá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> (vd ERROR 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.
  • --all in 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ómKiểm
chungid 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%
heroid = 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_upgradesE01–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 chungSE 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/bossid 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
AVowner = 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ụcid 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 + key mechanic ngoài từ vựng mechanics.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 renderNguồn JSONKhoá
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ừ movesid
hero_edges_<Hxx>.csvhero_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.csvtuning.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.jsonnhư 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 platformkey
config/ea_roadmap.json (doc 40 EaProgress, doc 43 §4) — file runtime {ms, month, items_vi[]}lộ trình EA ở doc 43 §4ms
Assets/_Project/Data/credits.json (doc 40 §5.7.1) — {sections[{title_key, lines[]}]}, sinh lúc builddanh sách credit doc 40 §5.7.1title_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: --all 0 ERROR.
  • Tên field = đúng schema (sai 1 ký tự = schema ERROR do additionalProperties: false). Field mới chỉ qua sửa tools/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 trong av/<chủ>.json (hoặc SHARED/UI) trước khi --all sạch.
  • Chữ thẻ là mẫu câu {param}; số gameplay đặt trong params, không viết cứng trong chữ. Không khoảng số trong dữ liệu: 1 giá trị, kèm assumed: true nếu là lượt đầu.
  • Mảng theo hạng [I, II, III] dài đúng max_rank; giá trị không theo hạng là vô hướng.
  • mechanic/mechanic_key lấy từ mechanics.json (từ vựng đóng); không chế key mới — thêm primitive = sửa doc 12 §9/§10 + mechanics.json cù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: TELL dù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

QQuyết địnhLý do
Nguồn sự thật dữ liệu?JSON GDD/Full/data/ + schema tools/schema/ (draft 2020-12, strict); CSV/MD/HTML là render1 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 §12doc 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à rendergom 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_viquy ướ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/passivedoc 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ả 2giữ 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 script1 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_scriptsdoc 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.ranks1 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: falsedữ liệu là nguồn sự thật
2026-11-07 — Skin hero?visual.skins đúng 4 = 3 Nến Canh + skin ngà MR20doc 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 đọcStoryDirector đọ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.0aengine đọ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.jsonhết báo lỗi giả, giữ quy ước id doc 32 §3.4