🔔 Bladewake GDD
Trang chủ › Hệ thống › AI thích nghi (Tro Nhớ)
⚙️ Hệ thống

AI thích nghi (Tro Nhớ)

Doc 14 trình bày kèm trục PSP, kiểu AI và núm chỉnh từ data.

Cập nhật: 2026-11-07

1Tổng quan

12
trục PSP
22
kiểu AI
7
luật dịch spawn

Mục đích: khung AI mọi hạng địch (thường S · Tinh Anh M · mini-boss L · boss XL) + hệ Tro Nhớ (AshMemory): hồ sơ lối chơi PSP A01–A12, 3 tầng MICRO/MESO/MACRO, chọn đòn theo đồ thị có trọng số, hợp đồng soạn thế đáp, trần công bằng, UI/diegesis, telemetry, debug, núm chỉnh. Phụ thuộc: 00-Design-Bible.md + data/_bible.json (INV-02/03/08/14/15/17, §7 kẻ địch, §8 Tro Nhớ, adaptive, psp_axes, modes, mourning_bands, run.act_mutators); 10-Combat-Core.md (tick 60 Hz, §2.2 chỉ số địch, §4 Thế/khựng/khối bầy, §7.4 phân giải đòn, §10 trần hiệu năng); 11-Defense-Tells.md (§1 tell Y/P/N + thời lượng sàn, §5 token & công bằng, fairness_lint). Được dùng bởi: doc kẻ địch/biome/Tinh Anh/mini/boss (soạn kit, thế đáp _CV), doc Khăn Tang/mode/mutator, doc UI/HUD/codex, doc âm thanh (bark, AshVariantOn (Tro Nhớ đổi thế: khựng 0.6 s + ◆ Mắt Tro, ≥ 1.0 s trước… SFX_SHARED_ash_read), code EnemyBrain/AttackTokens/FlowField/Director/AshMemory/Telemetry, tool ash_lint.

2Phạm vi, thứ bậc, thuật ngữ

  • Doc này định nghĩa cách AI ra quyết định + cách thích nghi. Số riêng từng đòn (windup, sát thương, hitbox, trọng số gốc) ở doc kẻ địch + enemy_attacks.csv. Mâu thuẫn với Bible → Bible thắng; mâu thuẫn tell/token với 11-Defense-Tells → doc 11 thắng; mâu thuẫn AI/thích nghi với doc kẻ địch → doc này thắng.
  • [ASSUMED] = giá trị lượt đầu, chỉnh qua ai_tuning.csv / ash_tuning.csv (key = tên field ở doc này) không cần DEC nếu không chạm INV.
Thuật ngữNghĩa (code)
HạngS thường · M Tinh Anh · L mini-boss · XL boss (mass_class, Bible §5.2)
BASEphản ứng trong kit, luôn bật; chỉ đọc trạng thái THẤY trên màn = sự kiện đơn lẻ (vị trí/vận tốc hero, cú Lướt vừa thấy, bộ phận bị đánh), lịch sử ≤ 10 s; KHÔNG trung bình thói quen (A04 TB, tỉ lệ…) (Bible §8). Vd: EN_B1_02 góc vồ theo cú Lướt vừa thấy, EN_B1_06 đón đầu theo v̄ 1.0 s, EL_B3_02, MB_B2_2 (A09 W10)
b[H][axis]baseline trục của hero H (do kit, không do thói quen), psp_axes.json → hero_baseline (§7.3)
ASHđọc PSP; chịu đủ INV-15; có mặc định trung tính khi tắt
PSPPlayer Style Profile, 12 trục A01–A12 (Bible §8.1)
Thế đáp (counter variant, CV)1 hàng dữ liệu đổi trọng số/tham số đòn có sẵn khi 1 trục vượt ngưỡng; id <ownerId>_CV1/_CV2 (§12)
Bật / ngủCV đang hiệu lực / đủ điều kiện nhưng bị trần ngân sách hoặc công tắc chặn
ash_level Lcấp Tro Nhớ 0–3 (§10); L_eff = cấp hiệu lực sau trừ
Mắt TroHUD 0–3 con ngươi cạnh HP = số CV đang bật ảnh hưởng hero (§14)
Sổ Thùbộ nhớ MACRO theo hero × boss Hồi, 5 trận gần nhất (§9)
SẹoCV boss bật sẵn do người chơi tự khắc sau khi thắng (Bible §8.2)
TVDđộ dịch trọng số = ½ Σ abs(q − p) giữa phân phối đòn gốc p và đã dịch q (§6.3)
Tokenquyền bắt đầu windup nhắm hero (INV-08, §4)
Chuỗi≤ N đòn nối bằng link của đồ thị đòn (§6.4); 1 đòn Y×n = 1 đòn, n nhịp

3Kiến trúc tổng

📊 Ba tầng thích nghi (núm tuning.ash)

MICRO
micro_on_s = 5
micro_forget_s = 30
micro_forget_margin = 0.15
micro_margin_scale = 0.25
micro_resample_s = 0.25
micro_step_s = 2
MESO
psp_thr_on = 0.6
psp_thr_off = 0.45
psp_min_rooms = 2
meso_alpha = 0.15
w10_bins = 0.25/40
w20_bins = 0.25/80
spawn_shift_max = 0.15
spawn_shift_step = 0.05
MACRO
macro_rank_w = 1/0.8/0.6/0.4/0.2
macro_age_decay = 0.9
macro_drop_age = 20
macro_min_records = 2
ledger_ring = 5
ledger_min_fight_s = 20
macro_card_s = 2.5
scar_max = 2
scar_soul_ash_bonus = 20
scar_fade_runs = 3
scar_fade_wins = 5
scar_cleanse_cost = 200

1.1 Vòng tick (khớp 10-Combat-Core §1.1)

tick (1/60 s, đồng hồ World):
  Perception.Snapshot()        // ghi trạng thái hero thấy được vào ring 0.25 s × 8 (2 s)
  Director.Tick()              // ngân sách spawn, dịch MESO (§8.2)
  Tokens.BeginTick()           // thu hồi token hết hạn (§4)
  FlowField.MaybeRebuild()     // job Burst, 10 Hz hoặc khi địa hình đổi (§5.3)
  for enemy in LOD(r200 mỗi tick, ngoài 10 Hz): Brain.Tick(enemy)   // §2 S, §6 M/L/XL
  Tokens.Resolve()             // cấp token theo điểm ưu tiên (§4.2)
  ... đòn quái chạm hero, đạn, vùng (doc 10) ...
  AshMemory.Record(events)     // cuối tick, sau chết/rơi đồ (doc 10 §1.1)
  AshMemory.Evaluate()         // 4 Hz: MICRO; cuối phòng: MESO; đầu trận boss: MACRO
  • Brain M/L/XL luôn tick mỗi frame (không LOD). Quái S ngoài r200 tick 10 Hz nhưng windup/strike đang chạy luôn tick mỗi frame (tell không giật).
  • Mọi roll ngẫu nhiên của AI dùng luồng rng_ai tách từ seed run (DAILY tất định theo seed; không dùng RNG toàn cục của engine).

1.2 Nhận thức (Perception) — AI chỉ thấy cái hero thấy

Dữ liệuĐược đọcTuổi tối thiểu
Vị trí, vận tốc, hướng mặt herocó0 s (di chuyển/đuổi); 0.25 s khi dùng để CHỌN đòn/né (INV-15 phản xạ)
Trạng thái anim hero (đánh, Lướt, ĐÁP, verb giữ, ult)có≥ 0.25 s (đọc snapshot cũ nhất ≥ 0.25 s)
Vật hero dựng (tường H02, hố H11, triệu hồi, mồi nhử có cờ taunt)có0 s
Input thô, buffer, thời gian hồi chiêu, tài nguyên, HP, cấp, build herokhông— (doc 10 §2.4: không chỉ số địch đọc HP/cấp hero)
PSP (ASH)chỉ qua AshMemory.Read()snapshot ≥ 0.5 s tuổi (§7.4)
Lịch sử cho BASE≤ 10 s, chỉ sự kiện đơn lẻ trên màn (cú Lướt cuối, vị trí, vận tốc); không thống kê trung bình≥ 0.25 s khi dùng để chọn đòn/góc
  • Ngoại lệ có lợi người chơi: Thương Xót / luật HP < 25% (§10) do hệ thống đọc HP, KHÔNG do brain quái.

1.3 File dữ liệu (doc này sở hữu schema)

FileKhoáCột chính
data/ai_archetypes.csvaiengage_range, slot_ring, keep_min, keep_max, flee_dist, flee_time, token_kind, approach_mode, special
enemy_attacks.csv (doc 11 sở hữu tell)<enemyId>_Ann+ cột AI: r_min, r_max, angle_max, cooldown, weight_p1..p3, phase_mask, links (to:p:gap_min:gap_max), signature, variant_of, adaptive_source
data/ash_counters.csvcv_idhợp đồng §12
data/ash_spawn_shift.csvaxis+dirvai khắc chế theo trục (§8.2)
data/psp_axes.json → hero_baselineHxx → axis (A01 theo nhánh)baseline 0–1 (A04 −1..1) do kit, §7.3; schema ở doc 51 §4.31
data/ai_tuning.csv · data/ash_tuning.csvkeynúm §16
save/ash_profile_<steamId>.jsonheroPSP MESO + Sổ Thù + Sẹo (§9.1)

4AI quái thường (S) — máy trạng thái

📊 Kiểu AI (tuning.ai_archetypes)

22 dòng
AITầm vàoVòng ôTokenTiếp cậnĐặc biệt
swarm_melee4innerMELEEreach_plusengage = tầm đòn + 4 px; vào ô vòng trong; gói 6–12 đi cụm (cohesion r48)
lunger50/80—MELEE—góc vồ lệch 10–20° về phía Lướt quen (A04 cửa sổ 10 s, BASE); nằm sấp sau vồ = cửa phạt
ranged_kiter150/210—PROJ—giữ cự ly, bắn khi có đường bắn (14 §3.3); FLEE < 60 px 1.2 s
ranged_lead160/240—PROJ—ngắm đón đầu aim = pos + v̄(1.0 s) × t_bay, lệch ≤ 60 px (BASE); keep [ASSUMED]
shield_bearer0—MELEEreach_plusengage = tầm đòn; xoay khiên về hero 90°/s; EN_B4_01 xoay theo hướng đòn cuối nhận
bomber_self40—P_FLOOR—lao thẳng 1.0× tốc; nổ P r48 (token P sàn)
ambusher60—MELEE, P_FLOOR—SPECIAL ẩn (mờ/lặn) tới khi trong 60–90 px rồi hiện + đánh; tell 100%
stationary220—P_FLOOR—không đi; đòn đường thẳng P
flyer_swarm30—MELEE—bay qua vật cao; rắc vùng N (không token); chích Y
spawner_mobile180/260—MELEE—giữ 180–260 px, thả 4 quái/6 s ngoài r90 (EN_B2_07); token MELEE cho Mái Chèo
support_aura80/140—MELEE—đứng sau quái S gần nhất so với hero (khoảng 40 px), aura; không vào vòng trong
roller260—MELEE—lăn theo đường thẳng tới điểm hero lúc khoá (60% windup); Y lao
thrower120/180—P_FLOOR—ném vòng cầu bom P; [ASH] mìn (14 §13 VD1)
charger120/200—MELEE—húc thẳng (Y lao); đâm tường → tự choáng 1.5 s
grappler40/110—MELEE—cưa lướt / kìm kéo
retaliator0—MELEE, P_FLOORreach_plusengage = tầm đòn; bị đánh sau lưng → Bắn Gai P vòng (windup 0.45 s)
diver160/220—MELEE, P_FLOOR—trên không; bổ nhào/lao bom theo đường khoá ở 60% windup
cone_breather60/100—MELEE—Y×3 phụt nón, khe 0.35 s
tether_pair0—P_FLOOR—2 chiếc giữ cách nhau 90–150 px, căng xích P giữa 2 chiếc; engage không dùng (0)
reformer140/200—PROJ—sau 2 loạt: vỡ → tụ lại cách 120–160 px (ấn 0.8 s, không đánh)
drifter120—P_FLOOR—trôi chậm về hero, Nuốt P vùng tròn
echo0—MELEEreach_plusengage = tầm đòn; bóng hero (chỉ BS_TRUE P3)

2.1 Trạng thái

StateVào khiLàm gìRa khi
SPAWNsinhấn tro #e8e4f0 0.6 s không sát thương; không windup tới 0.8 s (INV-14); spawn ngoài r90hết 0.6 s → APPROACH
APPROACHmặc địnhđi theo flow field (§5) tới ô vòng vây (§3.1) hoặc điểm giữ cự ly (đánh xa)trong engage_range → ENGAGE; > 900 px quá 3 s → LEASH
ENGAGEtrong tầmgiữ ô, đung đưa ±4 px; xin token mỗi tick (§4)có token + đòn sẵn + tầm/góc hợp lệ → WINDUP; chờ > 0.5 s không token → ORBIT
ORBITkhông tokenđi vòng tiếp tuyến 38–70 px quanh hero, 30% tốc (canon INV-08); sáng −10%có token → WINDUP
WINDUPđược tokengiữ pose windup ≥ sàn (S 0.30 s Y · 0.45 s P), glint/vùng theo doc 11; khoá hướng ở 70% windup; nhảy/lao khoá điểm ở 60%hết windup → STRIKE; khựng khi windup < 50% → FLINCH (trả token)
STRIKE—frame active (≤ 8 tick Y cận chiến; lao = suốt quãng)→ RECOVER, trả token cận chiến
RECOVER—thời gian hồi sau đòn (dữ liệu; MRN12 −20%) = cửa phạt→ ENGAGE (token cooldown 0.8 s [ASSUMED])
STAGGERbị ĐÁPchoáng 1.0 s (canon demo; EN_B1_04 1.5 s)→ ENGAGE
FLINCHtrúng cú ≥ LIGHT0.18 s; ≤ 3 lần/2 s rồi miễn 1.0 s (doc 10 §4.2)→ ENGAGE
REPOSITIONđánh xa ngoài [keep_min, keep_max] hoặc mất đường bắnđi tới điểm đứng mới (§3.3)vào dải + có đường bắn → ENGAGE
FLEEđánh xa, hero < flee_distchạy ngược 1.2 s (canon EN_B1_03: < 60 px)→ REPOSITION
SPECIALtheo archetypelặn/hiện/tụ lại/tụng/đẻ (bảng §2.2)theo archetype
AIRBORNEbị hất tung0.40 s, không đánh (doc 10 §4.3)→ ENGAGE
LEASHxa > 900 px 3 sbiến mất, tái sinh phía trước hướng chạy của hero ngoài màn (canon)→ SPAWN
DYINGHP 0anim chết; trả mọi token; nổ trễ nếu cờ (EN_B1_05 0.35 s)xoá
  • Sau glint 2, đòn Y không còn bị khựng huỷ (doc 10 §4.2). Bị đẩy khi WINDUP ≥ 50% → windup chạy tiếp, hướng khoá giữ.
  • Quái S ngoài vùng an toàn gameplay (+16 px) không vào WINDUP nhắm hero (doc 11 §5.3).

2.2 Archetype (ai, code enum; tham số ở ai_archetypes.csv)

aiengageHành vi riêng (BASE)Token
swarm_meleetầm đòn + 4 pxvào ô vòng trong; gói 6–12 đi cụm (cohesion r48)MELEE
lunger50–80 px (canon EN_B1_02)BASE: góc vồ lệch về phía cú Lướt CUỐI hero vừa thực hiện trên màn (snapshot ≥ 0.25 s tuổi): tuổi cú Lướt 0.25–1.0 s → 20° · 1.0–3.0 s → 10° · > 3.0 s hoặc ngoài màn → 0° (không dùng A04 trung bình); nằm sấp sau vồ = cửa phạtMELEE
ranged_kiterkeep 150–210giữ cự ly, bắn khi có đường bắn (§3.3); FLEE < 60 px 1.2 sPROJ
ranged_leadkeep 160–240 [ASSUMED]ngắm đón đầu: aim = pos + v̄(1.0 s) × t_bay, lệch ≤ 60 px (BASE)PROJ
shield_bearertầm đònxoay khiên về hero 90°/s; EN_B4_01 xoay theo hướng đòn cuối nhậnMELEE
bomber_self40 pxlao thẳng 1.0× tốc; nổ P r48 (token P sàn)P_FLOOR
ambusher60 pxSPECIAL ẩn (mờ/lặn) tới khi trong 60–90 px rồi hiện + đánh; tell 100%MELEE / P_FLOOR
stationary220 pxkhông đi; đòn đường thẳng PP_FLOOR
flyer_swarm30 pxbay qua vật cao; rắc vùng N (không token); chích YMELEE
spawner_mobile—giữ 180–260 px, thả 4 quái/6 s ngoài r90 (EN_B2_07)MELEE (Mái Chèo)
support_aura80–140 px sau bầyđứng sau quái S gần nhất so với hero (khoảng 40 px), auraMELEE
roller260 pxlăn theo đường thẳng tới điểm hero lúc khoá (60% windup)MELEE (Y lao)
throwerkeep 120–180ném vòng cầu bom P; [ASH] mìn (§13 VD1)P_FLOOR
charger120–200 pxhúc thẳng; đâm tường → tự choáng 1.5 sMELEE (Y lao)
grappler40–110 pxcưa lướt / kìm kéoMELEE
retaliatortầm đònbị đánh sau lưng → Bắn Gai P vòng (windup 0.45 s)MELEE / P_FLOOR
diver160–220 px trên khôngbổ nhào/lao bom theo đường khoá ở 60% windupMELEE / P_FLOOR
cone_breather60–100 pxY×3 phụt nón, khe 0.35 sMELEE
tether_pair—2 chiếc giữ cách nhau 90–150 px, căng xích P giữa 2 chiếcP_FLOOR
reformerkeep 140–200sau 2 loạt: vỡ → tụ lại cách 120–160 px (ấn 0.8 s, không đánh)PROJ
drifter120 pxtrôi chậm về hero, Nuốt P vùng trònP_FLOOR
echotầm đònbóng hero (chỉ BS_TRUE P3)MELEE
elite_utilityr_pref §6.2 (trung vị có trọng số tâm dải [r_min, r_max] theo q)mọi Tinh Anh M (EL_*): brain utility + đồ thị đòn §6, KHÔNG dùng vòng vây §3.1 (slot_ring = 0), chờ token → STALK 90–140 px; L/XL dùng cùng ai này, mass_class quyết max_links §6.4 + cap_tier §11.2HEAVY + token theo đòn (MELEE/PROJ/P_FLOOR của từng _Ann)
  • Hàng ai_archetypes.csv của elite_utility: engage_range = -1 (đọc r_pref runtime) · slot_ring 0 · keep_min/keep_max/flee_* rỗng · token_kind HEAVY+ATTACK · approach_mode utility · special rỗng.

2.3 Gán archetype cho roster thường (Bible §7.2)

Biome01020304050607
B1swarm_meleelungerranged_kitershield_bearerbomber_selfranged_leadambusher
B2swarm_meleelunger (cung nhảy)ranged_kiter (destructible)stationaryflyer_swarmambusher (lặn)spawner_mobile
B3swarm_meleesupport_aurarollerthrowerchargergrapplerretaliator
B4shield_bearerdiverdiver (bom P)cone_breathertether_pairreformersupport_aura
B6EN_B6_01 echo · EN_B6_02 drifter
  • Archetype mới chỉ khi rig mới được duyệt (Bible §7.7); quái mới hậu 1.0 chọn archetype có sẵn + tham số.
  • Ưu tiên bầy: quái support_aura/ranged_* không vào vòng trong; quái swarm_melee đi trước họ ≥ 24 px theo trục tới hero (tạo "lá chắn thịt" đọc được, khớp A10 PRIORITY).

5Hành vi nhóm

3.1 Vòng vây (surround slots)

KhoáGiá trị
Vòng trong8 ô, góc 45°, bán kính r_in = 7 + radius_quái + reach_đòn × 0.8 (EN_B1_01: 7 + 6 + 24×0.8 ≈ 32 px)
Vòng ngoài (chờ)12 ô, r 54 px (giữa dải ORBIT 38–70)
Gán ômỗi 0.25 s, tham lam theo chi phí c = Δgóc(°)/45 + dist/64; giữ ô cũ nếu c_cũ ≤ c_mới + 0.3 (trễ, tránh nhảy ô)
Ô ưu tiênô trong nón ±90° hướng mặt/di chuyển hero điền trước (đòn tới từ phía thấy được)
Người trong ô≤ 1 quái/ô; vào ô ≠ có token; token cấp theo §4.2
Vật cao chắn ôô có tâm trong vật/ sau vật (không có đường thẳng tới hero) = khoá
  • Quái chờ ở vòng ngoài khi 8 ô trong đầy. Hero đứng cạnh tường → ô sau tường khoá, còn ≤ 5 ô → ít đòn cùng lúc hơn (thưởng A08 COVER một cách tự nhiên; Director đối trọng bằng MESO §8.2).

3.2 Giãn cách

  • Giãn thân theo 10-Combat-Core §4.4 (hash ô 32 px, 2 lượt/tick, độ cứng 0.9).
  • Cùng loại ranged_*/thrower/reformer: cách nhau ≥ 48 px và ≥ 30° góc nhìn từ hero (tránh 3 viên đạn cùng một đường).
  • Gói swarm_melee: lực kết dính về tâm gói r48 trọng số 0.3; tách gói khi > 12 quái.
  • support_aura không đứng trong r100 của support_aura khác (aura không chồng ở 1 điểm).

3.3 Đường bắn (line-of-fire, LOF)

every 0.25 s for shooter:
  los = Raycast(shooter.pos → hero.pos, layers = TallProp)      // đạn xuyên quái (doc 10 §4.4)
  if !los: target = best point on ring r_keep, |Δθ| ≤ 90°, có LOS, gần nhất
           if none in 2.0 s: r_keep -= 40 px (tối thiểu keep_min)
  fire only if los && token PROJ && trong vùng an toàn màn
  • Tầm bắn hiệu lực = r_max của đòn; keep_min–keep_max ở ai_archetypes.csv.
  • Vật thấp (bia mộ, đống xương) không chặn đạn, không chặn đi (chi phí đi ×1.5, §5.2).

6Token tấn công (INV-08 tổng quát)

4.1 Bể token

TokenTrầnAi giữGiữ từ → tới
MELEE4; 2 khi có M/L/XL đang windup nhắm hero; 0 trong 0.6 s cuối windup P của bossquái Sđầu WINDUP → hết STRIKE
PROJ3 loạt nhắm hero (gồm triệu hồi boss); ≤ 12 đạn địch trên mànS + đạn của M/L/XL tính vào trần 12đầu WINDUP → viên cuối loạt chết hoặc 2.0 s
P_FLOOR3 tell P sàn từ quái Squái Sđầu windup → hết active
P_TOTAL5 (gồm hazard, Ấn, mutator, Khăn Tang, P của M/L/XL)mọi nguồn Pnhư trên; đòn chữ ký boss miễn nhưng khi boss windup P thì không P nào khác bắt đầu
HEAVY [mới, chặt hơn INV]1 windup M/L/XL nhắm hero cùng lúcM, L, XLđầu WINDUP → hết STRIKE của đòn (cả chuỗi giữ token, khe chuỗi không trả)
OBJECTIVE6 windup nhắm mục tiêu VIGIL/vật cần bảo vệquái Snhư MELEE; không tính vào MELEE
  • M/L/XL không giữ MELEE/P_FLOOR của quái S (canon), trừ EM16 Thề Thù chiếm 1/4 MELEE cho đàn của nó.
  • HEAVY: boss > mini > Tinh Anh khi tranh; Tinh Anh chờ → STALK (§6.1). EM08 Song Sinh: 2 bản dùng chung 1 HEAVY (canon "không windup cùng lúc").
  • Trần token KHÔNG đổi bởi Khăn Tang, Ấn, mutator, Tro Nhớ (INV-15 bất biến token).

4.2 Cấp token

each tick: requests = enemies in ENGAGE wanting token T, sorted by prio desc
prio = 100·onScreen + 50·inFront(dot(heroFacing, dirToEnemy) > 0.3) + 20·clamp(wait_s, 0, 3) − 0.1·dist_px + 10·isSlotInner
grant while used[T] < cap[T]; cooldown sau khi trả: 0.8 s (MELEE), 1.2 s (PROJ) [ASSUMED]
  • Không token ≥ 0.5 s → ORBIT (canon). Mất token giữa windup chỉ khi bị huỷ (khựng < 50%, chết, Vỡ Thế) → trả ngay.
  • Lối thoát P (doc 11 §5.2): P mới làm vùng P trong đĩa r120 quanh hero > 70% → trì 0.3 s; trì 2 lần vẫn vượt → huỷ đòn, quái về cooldown.

7Mục tiêu (aggro) & tìm đường

5.1 Chọn mục tiêu

Mục tiêuĐiểm cơ sởGhi chú
Hero10mặc định mọi hạng
Mồi nhử hero có cờ taunt12 (S) · 6 (M) · 0 (L/XL)doc hero khai báo; boss/mini không bị dụ
Vật mục tiêu (VIGIL lò canh HP 300)14 với quái có cờ objective_attackerDirector gắn cờ cho 40% spawn VIGIL [ASSUMED]
Tường/hố hero dựng0 (không đánh); chỉ chặn đườngđòn có cờ hits_structures mới phá
score(t) = base(t) − dist(t)/100 ; giữ mục tiêu cũ nếu score_old ≥ score_new − 0.5 ; đánh giá lại 0.5 s
  • Không "đổi mục tiêu sang người chơi khác": game 1 người; triệu hồi hero chỉ hút aggro nếu có taunt.

5.2 Lưới & flow field

KhoáGiá trị
Lưới điô 16 px sàn [ASSUMED]; sân 1600×1200 → 100×75 = 7.500 ô
Ô chặnvật cao (cột, tượng, lồng, tường hero H02, gờ Bia Sụt H11), hố H11, vực B4
Ô chi phívật thấp ×1.5 · vùng N đang có ×4 · vùng P đang windup ×8 (quái né vùng của chính phe mình trừ archetype bomber_self)
Trường tích hợpDijkstra từ ô hero (+ ô mục tiêu VIGIL), job Burst, 10 Hz + ngay khi ô chặn đổi (Bible §10.4)
Hướng đigradient 8 hướng của trường; trong r48 quanh đích → lái thẳng tới ô vòng vây (seek + arrive)
Bay (flyer_swarm, diver, tether_pair)bỏ qua vật cao/hố; không bỏ qua tường biên sân
Kẹtdịch < 4 px trong 2 s khi APPROACH → lệch ngang ±32 px 1.0 s; > 5 s → LEASH ngoài màn
  • Chi phí CPU: 1 trường chung cho mọi quái S/M (không A* từng con); L/XL dùng cùng trường + lái riêng theo bán kính lớn (ô có khe < 2 × radius = chặn với chúng: trường thứ 2 "rộng" dựng 5 Hz).
  • Đòn lao/húc (lunge) đi đường thẳng, dừng ở vật cao (EN_B3_05 tự choáng 1.5 s); không xuyên vật cao.

8Tinh Anh / mini-boss / boss — utility + đồ thị đòn

6.1 Vòng quyết định

StateLuật
SPAWNTinh Anh/triệu hồi: xoáy trung tính 1.0 s (INV-14); boss: intro + khoá cổng sân
DECIDEmỗi lần hết REST/RECOVER và mỗi 0.25 s khi đang MOVE: tính điểm utility §6.2, chọn 1 hành động
MOVEtiến/lùi về dải r_pref + 30% tiếp tuyến; ≤ 2.0 s rồi buộc chọn đòn có R > 0 hoặc đòn áp sát (lao/nhảy)
STALKchờ HEAVY: vòng 90–140 px, 50% tốc, mặt hướng hero
WINDUP/STRIKE/RECOVERnhư §2.1; sàn windup 0.45 s Y (M/L/XL), P 0.45 (M) / 0.60 (L/XL) (doc 11 §1.2)
LINKkhe chuỗi giữa 2 đòn: gap ∈ [gap_min, gap_max], gap_min ≥ 0.35 s
RESTsau chuỗi: rest_s theo pha (BS_B1 canon 0.8 / 0.5 / 0.4; Tinh Anh 1.0)
BROKENVỡ Thế (doc 10 §4.1): huỷ windup, trả HEAVY; không đổi thế đáp, không bắt đầu P mới
PHASEqua ngưỡng HP: đòn đang STRIKE xong mới chuyển; huỷ link còn lại; quỳ bất tử (canon BS_B1 1.5/1.0 s); đánh giá lại CV (§8.3)

6.2 Điểm utility (DECIDE)

for attack a in kit where phase_mask ∋ phase && cooldown_ready(a):
    R_a = 1 if r_min ≤ d ≤ r_max else max(0, 1 − dist_out(d)/40)      // d = cự ly tâm-tâm
    G_a = 1 if |angle(facing, hero)| ≤ angle_max else 0.5             // đòn quay được trong windup
    K_a = repetition(a)                                              // §6.5
    T_a = tokenOK(a) ? 1 : 0                                          // HEAVY + P_TOTAL nếu đòn P
    s_a = q_a · R_a · G_a · K_a · T_a                                 // q = trọng số SAU Tro Nhớ (§6.3)
S = Σ s_a
if S ≥ 0.15 · Σ q_a  → ATTACK: roll a ~ s_a / S  (rng_ai)
elif summon_ready && adds_alive < summon_cap → SUMMON (đòn summon có weight riêng, vẫn qua §6.3)
else → MOVE tới r_pref = trung vị có trọng số của tâm dải [r_min, r_max] theo q
  • cooldown(a) từ dữ liệu; đòn summon boss canon ≥ 20 s (BS_B1_A04). Hero sau lưng (> 120°) → điểm MOVE "xoay" thay ATTACK nếu mọi G_a = 0.5 [ASSUMED].
  • Demo EL_B1_01 tái tạo bằng dữ liệu: A01 [0,55] w45 · A02 [0,55] w35 · A03 [0,140] w20 (nhảy 60) → trong 55 px ra 45/35/20; 55–140 px chỉ A03 có R = 1.

6.3 Trọng số gốc → trọng số Tro Nhớ (công thức khoá)

p   = weights_phase / Σ                         // phân phối gốc (BASE) của pha
q*  = normalize(p ⊙ m)                           // m = hệ số của CV đang bật (WEIGHT_MULT), 1 nếu không
      UNLOCK: chuyển f · p_b từ đòn gốc b sang biến thể v (q*_v = f·p_b, q*_b = (1−f)·p_b)
D   = ½ Σ |q*_i − p_i|                           // TVD
c   = cap_tier(Khăn Tang) · k_mercy               // §11.2; k_mercy = 0.5 khi luật HP < 25% đang chạy, còn lại 1
λ   = min(1, c / D)  (D = 0 → λ = 1)
q   = p + λ (q* − p)                             // tuyến tính → TVD(q, p) = λD ≤ c, chính xác
Y-floor: y(q) = Σ q_i·nY_i / Σ q_i·n_i ≥ 0.50   // n_i = số nhịp đòn i, nY_i = số nhịp Y
         nếu < 0.50: chia đôi λ tới khi đạt (≤ 6 lần; p đạt sẵn nhờ ash_lint)
  • Trần c đo trên p của pha, TRƯỚC lọc tầm/góc/cooldown; lọc §6.2 áp lên q sau.
  • Chỉ 1 CV/kẻ địch bật → m từ 1 hàng. Sẹo thứ 2 không chồng (§9.4).

6.4 Đồ thị đòn & chuỗi động

Field linkNghĩa
tođòn kế (id)
pxác suất nối gốc
gap_min, gap_maxkhe (s); gap_min ≥ 0.35 (INV-03); Y→P: P vẫn đủ windup sàn của chính nó
condr_min..r_max của đòn kế phải thoả lúc nối, không thì không nối
chain = [a0]; k = 1
while k ≤ max_links(tier) and roll(rng_ai) < p_link(a_{k-1}→next) · 0.7^(k−1):
    next = argmax over links(a_{k−1}) by s_next (§6.2, K đầy đủ)
    gap  = gap_min + (gap_max − gap_min) · u,  u ~ Beta(2,3)   // nghiêng về nhanh, thỉnh thoảng chậm
    chain += next; k += 1
then REST(rest_s[phase])
  • Lọc link hợp lệ: links(a_{k−1}) chỉ xét đích có phase_mask ∋ pha hiện tại và cooldown_ready; đích ngoài pha hoặc đang hồi bị bỏ qua (không tính vào p_link); không còn đích hợp lệ → chuỗi dừng, về REST. Ví dụ BS_B1: A01→A08, A03→A08 bị bỏ qua ở P1/P3 (A08 chỉ ở P2); A05→A12 bị bỏ qua ở P3 (A12 chỉ ở P2); A13→A02, A08→A02 chỉ có thể chạy ở P2 vì đòn nguồn chỉ ở P2 — Q21.
Hạngmax_linksĐòn/chuỗi tối đa
M Tinh Anh23
L mini-boss23
XL boss34
  • Đòn Y×n (EL_B4_03 3–7 nhịp, BS_B1_A01 ×3/×4) = 1 đòn; nhịp trong đòn theo dữ liệu đòn, khe ≥ 0.35 s.
  • Mix-up được phép (mọi nguồn): (a) khe nhịp biến thiên trong [gap_min, gap_max] (đổi tempo); (b) đòn "trì" viết sẵn trong kit (windup dài hơn, pose giữ riêng) = đòn BASE bình thường; (c) nhịp lừa = giữ thêm ≤ 0.35 s giữa glint 1 và glint 2, pose hold + SFX SFX_<ownerId>_feint riêng; glint 2 vẫn đúng 7 tick trước va chạm; ≤ 1 nhịp lừa/chuỗi (đếm cả BASE + ASH).
  • Cấm: huỷ windup giả (đã glint 1 rồi bỏ) ngoài MB_B4_2 Kiếm Sĩ Gương (canon ảnh giả); rút ngắn windup; đổi tell giữa windup; khe < 0.35 s; đòn không token.

6.5 Chống lặp

LuậtGiá trị
Vừa dùng đòn aK_a = 0.35
a dùng ở cả 2 lần chọn gần nhấtK_a = 0 (trừ khi là đòn duy nhất có R > 0)
Bảo đảm xoay vòngđòn có q ≥ 0.10 chưa ra trong 8 lần chọn → K_a = 3.0 tới khi ra
Đòn signaturetheo lịch riêng (cooldown), không bị K giảm
Chuỗikhông lặp cùng 1 cặp link 2 chuỗi liền (cặp đó p × 0.3)

6.6 Pha (phase gating)

  • phase_mask trên mỗi đòn; ngưỡng HP pha ở doc boss (canon BS_B1: < 50% P2, < 25% P3). Trọng số gốc weight_p1..p3 riêng mỗi pha.
  • Đòn ASH chỉ được bật trong pha có đòn gốc tương ứng. Đổi CV chỉ ở PHASE (boss/mini) hoặc 1 lần ở 50% HP (Tinh Anh, §8.3).
  • Tinh Anh/mini không có pha trừ khi doc của nó ghi; mini có tối đa 2 pha [ASSUMED].

9Hồ sơ lối chơi PSP (A01–A12)

📊 Trục PSP (data/psp_axes.json)

Trục PSP × cửa sổ đoTrục PSP × cửa sổ đoW20MESOMACROW10A01 Pha phòng thủA01 Pha phòng thủ × W20: 1A01 Pha phòng thủ × MESO: 1A01 Pha phòng thủ × MACRO: 1A01 Pha phòng thủ × W10: —A02 Cự ly đánhA02 Cự ly đánh × W20: 1A02 Cự ly đánh × MESO: 1A02 Cự ly đánh × MACRO: 1A02 Cự ly đánh × W10: —A03 Tần suất LướtA03 Tần suất Lướt × W20: 1A03 Tần suất Lướt × MESO: 1A03 Tần suất Lướt × MACRO: 1A03 Tần suất Lướt × W10: —A04 Phía LướtA04 Phía Lướt × W20: 1A04 Phía Lướt × MESO: 1A04 Phía Lướt × MACRO: 1A04 Phía Lướt × W10: 1A05 Tỉ phần đòn diện rộngA05 Tỉ phần đòn diện rộng × W20: 1A05 Tỉ phần đòn diện rộng × MESO: 1A05 Tỉ phần đòn diện rộng × MACRO: 1A05 Tỉ phần đòn diện rộng × W10: —A06 Tỉ phần đạn/némA06 Tỉ phần đạn/ném × W20: 1A06 Tỉ phần đạn/ném × MESO: 1A06 Tỉ phần đạn/ném × MACRO: 1A06 Tỉ phần đạn/ném × W10: —A07 Bấm dồnA07 Bấm dồn × W20: 1A07 Bấm dồn × MESO: 1A07 Bấm dồn × MACRO: 1A07 Bấm dồn × W10: —A08 Núp vật caoA08 Núp vật cao × W20: 1A08 Núp vật cao × MESO: 1A08 Núp vật cao × MACRO: 1A08 Núp vật cao × W10: —A09 Ô sân quenA09 Ô sân quen × W20: —A09 Ô sân quen × MESO: 1A09 Ô sân quen × MACRO: 1A09 Ô sân quen × W10: 1A10 Ưu tiên mục tiêuA10 Ưu tiên mục tiêu × W20: 1A10 Ưu tiên mục tiêu × MESO: 1A10 Ưu tiên mục tiêu × MACRO: 1A10 Ưu tiên mục tiêu × W10: —A11 Dồn sát thương lúc Vỡ ThếA11 Dồn sát thương lúc Vỡ Thế × W20: 1A11 Dồn sát thương lúc Vỡ Thế × MESO: 1A11 Dồn sát thương lúc Vỡ Thế × MACRO: 1A11 Dồn sát thương lúc Vỡ Thế × W10: —A12 Độ chính xácA12 Độ chính xác × W20: 1A12 Độ chính xác × MESO: 1A12 Độ chính xác × MACRO: 1A12 Độ chính xác × W10: —
TrụcKhoáĐoKhoảngCửa sổHướngThói quen hiển thị
Pha phòng thủ A01DEF_MIXmỗi nhịp Y nhắm hero có nguồn trên màn được trả lời bằng ĐÁP (Answered), verb giữ (Held) hoặc Lướt (gồm Né Hoàn Hảo) → 3 tỉ lệ DEFLECT/HOLD/DASH tổng 1; trúng/đi ra không tính; mẫu tối thiểu W20 6 / ROOM 10; trung tính 0.33 mỗi nhánh0/1W20, MESO, MACROHIGH, LOWHIGH theo nhánh: 'bạn Gạt NN%' (A01.DEFLECT, chữ Gạt giữ theo Bible §8.4) · 'bạn Thủ NN%' (A01.HOLD) · 'bạn Lướt NN%' (A01.DASH)
Cự ly đánh A02RANGEmỗi cú hero gây sát thương lên M/L/XL: d̄ = TB cự ly tâm-tâm (px) trọng số theo sát thương; chuẩn hoá clamp((d̄ − 40)/160, 0, 1) (40 px → 0; 200 px → 1); mẫu W20 8 / ROOM 15 cú; trung tính 0.400/1W20, MESO, MACROHIGH, LOWHIGH: đánh xa Tinh Anh · LOW: áp sát
Tần suất Lướt A03EVADE_RATELướt trong giao tranh (có quái trong 200 px hoặc windup nhắm hero trong 2 s qua): Lướt/phút; chuẩn hoá clamp(rate/30, 0, 1); mẫu W20 10 s giao tranh / ROOM 20 s; trung tính 0.400/1W20, MESO, MACROHIGH, LOWHIGH: Lướt liên tục · LOW: ít Lướt
Phía Lướt A04EVADE_SIDELướt bắt đầu ≤ 1.0 s trước va chạm của 1 đòn nhắm hero: s = cross(t̂, d̂) (t̂ = hero→nguồn, d̂ = hướng Lướt; > 0 = trái), TB; giữ −1..1, ngưỡng dùng abs(A04); mẫu W20 6 / ROOM 10; trung tính 0−1/1W10, W20, MESO, MACROLEFT, RIGHT, SIDELEFT: Lướt lệch trái · RIGHT: Lướt lệch phải · SIDE: luôn né ngang (abs)
Tỉ phần đòn diện rộng A05AOE_SHAREsát thương hero gây: phần từ instance hitbox trúng ≥ 3 mục tiêu (0–1); mẫu W20 30 cú / ROOM 60 cú; trung tính 0.400/1W20, MESO, MACROHIGH, LOWHIGH: gom cụm diệt AoE · LOW: đánh đơn mục tiêu
Tỉ phần đạn/ném A06PROJ_SHARE0.5 · tỉ phần sát thương từ đạn/ném + 0.5 · (đạn Y_REFLECT + Y_HEAVY bị ĐÁP / đạn tới); không có đạn địch → chỉ vế 1; đạn P không tính; mẫu 30 cú / 60 cú, ≥ 4 đạn cho vế 2; trung tính 0.300/1W20, MESO, MACROHIGH, LOWHIGH: dựa vào đạn/ném · LOW: không dùng đạn
Bấm dồn A07MASHinput Đánh/Kỹ năng/ĐÁP (không tính di chuyển) khi ≥ 1 windup nhắm hero trong 160 px, nguồn trên màn: input/s; chuẩn hoá clamp(rate/8, 0, 1); mẫu 3 s windup / 6 s; trung tính 0.400/1W20, MESO, MACROHIGH, LOWHIGH: bấm dồn khi địch windup · LOW: chờ tell
Núp vật cao A08COVER% thời gian giao tranh tâm hero ≤ 24 px từ mép vật cao; phòng không vật cao → không cập nhật; mẫu 10 s / 20 s; trung tính 0.200/1W20, MESO, MACROHIGH, LOWHIGH: núp vật cao · LOW: đứng giữa sân
Ô sân quen A09ZONE_HEATlưới 4×4 sân, ô hero đứng lâu nhất trong 10 s gần nhất: (cell, share), share 0–1; luôn có (BASE, W10); MESO chỉ lưu share; trung tính 0.06250/1W10, MESO, MACROHIGHHIGH: đứng một chỗ (1 ô sân chiếm phần lớn 10 s)
Ưu tiên mục tiêu A10PRIORITYquái vai đánh xa/ném, hỗ trợ/buff, bắn đón đầu, tổ sinh quái, trụ đứng yên hiện trên màn: giây từ lúc hiện tới lúc chết (sống quá 20 s hoặc rời màn = 20); chuẩn hoá clamp((15 − t̄)/12, 0, 1); mẫu 2 / 4 quái; trung tính 0.500/1W20, MESO, MACROHIGH, LOWHIGH: hạ quái xa/hỗ trợ trước · LOW: bỏ mặc quái xa/hỗ trợ
Dồn sát thương lúc Vỡ Thế A11BURSTmỗi lần M/L/XL Vỡ Thế: có ≥ 1 kỹ năng hoặc ult tung trong 3 s đầu Vỡ Thế; burst_events / broken_events; mẫu 1 / 2 lần Vỡ Thế; trung tính 0.500/1W20, MESO, MACROHIGH, LOWHIGH: dồn kỹ năng/ult khi Vỡ Thế · LOW: giữ kỹ năng
Độ chính xác A12PRECISION(ĐÁP thành công + Né Hoàn Hảo) / (ĐÁP bấm + Lướt bắt đầu ≤ 0.5 s trước va chạm nhắm hero); mẫu 6 / 10 lần thử; trung tính 0.400/1W20, MESO, MACROHIGH, LOWHIGH: ĐÁP/Né chuẩn · LOW: ĐÁP/Né hụt nhiều
Baseline PSP theo heroBaseline PSP theo heroH01H02H03H04H05H06H07H08H09H10H11H12A01.DEFLECTA01.DEFLECT × H01: 0.450.45A01.DEFLECT × H02: 0.30.3A01.DEFLECT × H03: 0.30.3A01.DEFLECT × H04: 0.350.35A01.DEFLECT × H05: 0.250.25A01.DEFLECT × H06: 0.40.4A01.DEFLECT × H07: 0.250.25A01.DEFLECT × H08: 0.30.3A01.DEFLECT × H09: 0.30.3A01.DEFLECT × H10: 0.250.25A01.DEFLECT × H11: 0.250.25A01.DEFLECT × H12: 0.30.3A01.HOLDA01.HOLD × H01: 0.250.25A01.HOLD × H02: 0.450.45A01.HOLD × H03: 0.350.35A01.HOLD × H04: 0.30.3A01.HOLD × H05: 0.450.45A01.HOLD × H06: 0.350.35A01.HOLD × H07: 0.250.25A01.HOLD × H08: 0.40.4A01.HOLD × H09: 0.30.3A01.HOLD × H10: 0.40.4A01.HOLD × H11: 0.50.5A01.HOLD × H12: 0.350.35A01.DASHA01.DASH × H01: 0.30.3A01.DASH × H02: 0.250.25A01.DASH × H03: 0.350.35A01.DASH × H04: 0.350.35A01.DASH × H05: 0.30.3A01.DASH × H06: 0.250.25A01.DASH × H07: 0.50.5A01.DASH × H08: 0.30.3A01.DASH × H09: 0.40.4A01.DASH × H10: 0.350.35A01.DASH × H11: 0.250.25A01.DASH × H12: 0.350.35A02A02 × H01: 0.20.2A02 × H02: 0.20.2A02 × H03: 0.450.45A02 × H04: 0.20.2A02 × H05: 0.20.2A02 × H06: 0.050.05A02 × H07: 0.850.85A02 × H08: 0.350.35A02 × H09: 0.50.5A02 × H10: 0.30.3A02 × H11: 0.20.2A02 × H12: 0.30.3A03A03 × H01: 0.450.45A03 × H02: 0.250.25A03 × H03: 0.350.35A03 × H04: 0.40.4A03 × H05: 0.40.4A03 × H06: 0.30.3A03 × H07: 0.550.55A03 × H08: 0.40.4A03 × H09: 0.40.4A03 × H10: 0.40.4A03 × H11: 0.250.25A03 × H12: 0.40.4A05A05 × H01: 0.40.4A05 × H02: 0.650.65A05 × H03: 0.50.5A05 × H04: 0.350.35A05 × H05: 0.650.65A05 × H06: 0.20.2A05 × H07: 0.450.45A05 × H08: 0.550.55A05 × H09: 0.550.55A05 × H10: 0.650.65A05 × H11: 0.650.65A05 × H12: 0.450.45A06A06 × H01: 0.150.15A06 × H02: 0.150.15A06 × H03: 0.20.2A06 × H04: 0.150.15A06 × H05: 0.150.15A06 × H06: 0.150.15A06 × H07: 0.70.7A06 × H08: 0.60.6A06 × H09: 0.450.45A06 × H10: 0.150.15A06 × H11: 0.20.2A06 × H12: 0.30.3A07A07 × H01: 0.50.5A07 × H02: 0.250.25A07 × H03: 0.40.4A07 × H04: 0.40.4A07 × H05: 0.20.2A07 × H06: 0.50.5A07 × H07: 0.250.25A07 × H08: 0.30.3A07 × H09: 0.350.35A07 × H10: 0.350.35A07 × H11: 0.30.3A07 × H12: 0.30.3A11A11 × H01: 0.550.55A11 × H02: 0.450.45A11 × H03: 0.50.5A11 × H04: 0.50.5A11 × H05: 0.50.5A11 × H06: 0.550.55A11 × H07: 0.550.55A11 × H08: 0.50.5A11 × H09: 0.50.5A11 × H10: 0.50.5A11 × H11: 0.50.5A11 × H12: 0.40.40.050.85

7.1 Kho & cửa sổ

KhoCửa sổCập nhậtDùng cho
W1010 s trượt, thùng 0.25 s × 40mỗi tickBASE (≤ 10 s, chỉ sự kiện trên màn)
W2020 s trượt, thùng 0.25 s × 80mỗi tickMICRO, đổi CV Tinh Anh giữa trận, HUD "Tro đang nhớ"
ROOM1 phòng chiến (CMB/CHL/RSC/ELT/MBS/BOS)cuối phònggiá trị x_room vào EMA
MESOEMA α 0.15/phòngcuối phòngCV Tinh Anh/mini/boss, dịch spawn
FIGHT1 trận boss Hồi (vào sân → thắng/chết)cuối trậnSổ Thù (§9)
x_room hợp lệ  ⇔ mẫu ≥ min_room(axis)   (không đủ → EMA giữ nguyên, đếm "phòng liền" không tăng, không reset)
MESO_0         = giá trị lưu của hero (bật nhớ xuyên run) ; tắt nhớ → MESO_0 = x_room đầu tiên hợp lệ
MESO_n         = (1 − 0.15) · MESO_{n−1} + 0.15 · x_room_n
Đọc (ASH)      = snapshot có tuổi ≥ 0.5 s: W20 bỏ 2 thùng mới nhất; MESO đọc bản chốt cuối phòng trước
  • Chỉ ghi sự kiện hero thấy: nguồn đòn/quái nằm trong vùng an toàn màn (427×267 giữa màn + 16 px) lúc sự kiện xảy ra.
  • PSP luôn ghi (cả 3 run đầu đời, 60 s đầu) để có lịch sử; chỉ đọc bị công tắc chặn (§10). Chỉ STANDARD/ENDLESS ghi vào hồ sơ lưu (MESO + Sổ Thù); DAILY/BOSS_RUSH/CUSTOM chỉ có W20/MESO trong run, không lưu.

7.2 Định nghĩa trục (số khoá)

TrụcSự kiện đếmGiá trị thôChuẩn hoá 0–1Mẫu tối thiểu W20 / ROOMMặc định trung tính
A01 DEF_MIXmỗi nhịp Y nhắm hero có nguồn trên màn mà hero trả lời bằng ĐÁP (Answered), verb giữ (Held) hoặc Lướt (i-frame né, gồm Né Hoàn Hảo)3 tỉ lệ DEFLECT, HOLD, DASH (tổng 1); trúng/đi ra không tínhsẵn 0–1 mỗi nhánh; trục con A01.DEFLECT…6 / 100.33 mỗi nhánh
A02 RANGEmỗi cú hero gây sát thương lên M/L/XLd̄ = TB cự ly tâm-tâm (px), trọng số theo sát thươngclamp((d̄ − 40)/160, 0, 1) (40 px → 0; 200 px → 1)8 / 15 cú0.40
A03 EVADE_RATELướt trong giao tranh (có quái trong 200 px hoặc windup nhắm hero trong 2 s qua)Lướt/phút giao tranhclamp(rate/30, 0, 1)10 s giao tranh / 20 s0.40
A04 EVADE_SIDELướt bắt đầu ≤ 1.0 s trước va chạm của 1 đòn nhắm heros = cross(t̂, d̂) (t̂ = hướng hero→nguồn, d̂ = hướng Lướt; > 0 = trái); TB−1..1 giữ nguyên; ngưỡng dùng abs(A04) (§7.3)6 / 100
A05 AOE_SHAREsát thương hero gâyphần sát thương từ instance hitbox trúng ≥ 3 mục tiêusẵn 0–130 cú / 60 cú0.40
A06 PROJ_SHAREsát thương hero gây + đạn địch Y tới hero0.5·dmg_proj_share + 0.5·(đạn bị ĐÁP / đạn tới); không có đạn địch → chỉ vế 1sẵn 0–130 cú / 60 cú; ≥ 4 đạn cho vế 20.30
A07 MASHinput Đánh/Kỹ năng/ĐÁP (không tính di chuyển) khi ≥ 1 windup nhắm hero trong 160 px, nguồn trên màninput/s trong thời gian đóclamp(rate/8, 0, 1)3 s windup / 6 s0.40
A08 COVERthời gian giao tranh% thời gian tâm hero ≤ 24 px từ mép vật caosẵn 0–1; phòng không vật cao → không cập nhật10 s / 20 s0.20
A09 ZONE_HEATvị trí hero mỗi ticklưới 4×4 sân, ô có thời gian đứng lớn nhất trong 10 s gần nhất: (cell, share)share 0–1; ô = dữ liệu đi kèmluôn có (BASE, W10)0.0625
A10 PRIORITYquái vai đánh xa/ném, hỗ trợ/buff, bắn đón đầu, tổ sinh quái, trụ đứng yên hiện trên màngiây từ lúc hiện tới lúc chết (sống quá 20 s hoặc rời màn = 20)clamp((15 − t̄)/12, 0, 1) (≤ 3 s → 1; ≥ 15 s → 0)2 / 4 quái0.50
A11 BURSTmỗi lần M/L/XL Vỡ Thếsự kiện có ≥ 1 kỹ năng hoặc ult tung trong 3 s đầu Vỡ Thếburst_events / broken_events1 / 2 lần Vỡ Thế0.50
A12 PRECISIONĐÁP bấm + Lướt bắt đầu ≤ 0.5 s trước va chạm nhắm hero(ĐÁP thành công + Né Hoàn Hảo) / (ĐÁP bấm + Lướt đó)sẵn 0–16 / 10 lần thử0.40
  • A01 hiển thị "Gạt 72%" = A01.DEFLECT 0.72 (chữ "Gạt" giữ theo Bible §8.4). Hero có verb giữ không chặn (đặt bẫy/di chuyển) vẫn ghi HOLD khi verb đó làm đòn Y không trúng.
  • A06 vế 2 dùng đạn Y_REFLECT + Y_HEAVY (doc 11 §1.3); đạn P không tính.
  • A09 là trục BASE (vị trí thấy được): MB_B2_2 đọc trực tiếp W10; không lưu vào MESO (ô phụ thuộc sân) — MESO chỉ lưu share để báo "đứng một chỗ".

7.3 Ngưỡng & hướng

KhoáMặc địnhGhi chú
Baseline b[H][axis]psp_axes.json → hero_baseline[Hxx][axis] (A01 theo nhánh A01.DEFLECT/HOLD/DASH); thiếu → trung tính §7.2giá trị trục khi chơi "bình thường" bằng kit hero đó; A09 (BASE) không có baseline
Ngưỡng hiệu lực bậtn = trung tính §7.2 của trục · HIGH: on = thr_on + max(0, b − n) · LOW: on = (1 − thr_on) − max(0, n − b) · A04 (n = 0) LEFT: thr_on + max(0, b) · RIGHT: −thr_on − max(0, −b) · SIDE = LEFT hoặc RIGHT, bên nào đạtthr_on = cột hàng CV (mặc định 0.60, Bible §8.2) = mức sàn; hero kit trung tính (b = n) → đúng số Bible; baseline chỉ làm ngưỡng CHẶT hơn, không bao giờ lỏng hơn. Hàng mặc định A02: on = b + 0.20 khi b ≥ n
Ngưỡng hiệu lực tắtHIGH/LEFT: off = on − (thr_on − thr_off) · LOW/RIGHT: off = on + (thr_on − thr_off)gap hàng (mặc định 0.15 = Bible 0.60 → 0.45)
on > 1 (HIGH) hoặc < 0 (LOW)trục đó không bao giờ bật với hero Hkit cố định trục → không có thói quen để đọc
Bật MESOMESO ≥ on trong ≥ 2 phòng liền (MESO sau mỗi phòng)Bible §8.2 (b ≤ 0.40 → đúng 0.60)
Tắt MESOMESO qua off (HIGH: < off; LOW: > off)trễ chống rung
Bật MICROW20 qua on của hàng CV liên tục ≥ 5 s + đủ mẫu—
Quên MICROW20 qua off liên tục 30 sBible "quên khi đổi lối 30 s"
Lề (margin)m = v − on (HIGH/LEFT) / on − v (LOW/RIGHT)chọn CV có lề lớn nhất; mọi phép dùng lề (MICRO param, MESO spawn, CV M/L/XL, CHL, MACRO) dùng on hiệu lực
Áp dụngMESO (spawn + CV), MICRO ASH, MACRO thế mở màn + đề xuất Sẹo, CHL/EM12 bật sẵn, vector seed DAILY (§10.2), HUD "Tro đang nhớ", ACH_trick_the_ashBASE không dùng baseline (đọc trạng thái thấy)

Baseline lượt đầu (hero_baseline) — nguồn: sim 5 run/kit bằng bot lối chơi trung tính [ASSUMED]; sau EA refit = trung vị telemetry ash_room.x_room theo hero (≥ 200 run/hero), làm tròn 0.05, cập nhật qua patch dữ liệu (không cần DEC). Trước khi sim chạy: mọi ô = trung tính §7.2, trừ các ô kit cố định dưới đây:

HeroÔ khác trung tính [ASSUMED]Lý do kit
H07A02 0.85 · A06 0.70cung tầm xa, đạn
H06A02 0.05găng, đấm/vật áp sát
H02 · H05 · H10 · H11A05 0.65kit AoE (quét/xoay/vùng)
H08 · H09A06 0.70kit đạn/ném
  • Ví dụ (P7 "đọc lối chơi, không đọc hero"): H07, W20 A02 = 0.92, b = 0.85, n = 0.40 → on = 0.60 + 0.45 = 1.05 > 1 → A02 HIGH không bao giờ bật với H07 → không CV, không dịch spawn "vồ/lao", không Rèn Phản giáo phóng. Cùng H07 áp sát: A02 = 0.38 → LOW on = 0.40 − max(0, 0.40 − 0.85) = 0.40 → m = 0.02 → bật (đúng thói quen lệch kit). H06 (b A02 = 0.05): LOW on = 0.40 − 0.35 = 0.05 → áp sát là kit, gần như không bao giờ bật.
  • Ví dụ trung tính: H01 A01.DEFLECT b = n = 0.33 → on = 0.60, off = 0.45 → y hệt Bible. VD1 §13 (EN_B3_04, A06 thr 0.40, hero b = n = 0.30) → on = 0.40 y hệt Bible; với H08 (b 0.70) → on = 0.80.

7.4 Debug PSP (dev, phím F3 trang "PSP")

  • 12 hàng: thanh W20 · thanh MESO · chấm MACRO (TB Sổ Thù) · số mẫu (xám khi < tối thiểu) · vạch b (trắng) + vạch off/on hiệu lực của hero đang chơi · cờ phòng liền (0/1/2).
  • Khung phải: CV đang bật/ngủ (cv_id, tầng, lề, giây còn báo), ngân sách Hồi dùng/trần, L_base → L_eff + lý do trừ (mercy, Mặt Nạ Vô Danh, công tắc).
  • Ghi file ash_debug.csv mỗi phòng khi bật cờ dev ash_trace (§16).

10Tầng MICRO & MESO

📊 Dịch spawn theo trục

TrụcHướngVai khắc chếGhi chú
Cự ly đánh A02HIGHlunge, grapple, dive_bombđánh xa Tinh Anh → vồ/lao · kéo/cưa · bổ nhào bom
Cự ly đánh A02LOWself_destruct, bomber, retaliateáp sát → tự nổ · ném bom/mìn · phản đòn sau lưng
Tỉ phần đòn diện rộng A05HIGHshield, ranged, flyer_slow, reformgom cụm diệt AoE → khiên · đánh xa/ném · bay/làm chậm · trụ tái tụ
Tỉ phần đạn/ném A06HIGHshield, ambush, flyer_slowđạn/ném → khiên · phục kích/ẩn · bay/làm chậm
Núp vật cao A08HIGHbomber, dive_bomb, rollernúp vật cao → ném bom/mìn · bổ nhào bom · lăn theo đường
Tần suất Lướt A03HIGHtether, flyer_slow, turretLướt liên tục → dây nối · bay/làm chậm · trụ đứng yên
Ưu tiên mục tiêu A10LOWsupport, ranged, lead_shotbỏ mặc quái xa/hỗ trợ → hỗ trợ/buff · đánh xa/ném · bắn đón đầu

8.1 MICRO — từng loại quái thường (W20)

KhoáLuật
Phạm vimỗi enemyId thường đang có trong phòng; ≤ 1 tham số/loại (Bible §8.2) = ≤ 1 hàng CV tầng MICRO/loại
NguồnBASE (trạng thái thấy, sự kiện đơn lẻ ≤ 10 s, luôn bật, không ngưỡng/baseline: EN_B1_02 góc vồ theo cú Lướt cuối §2.2, EN_B1_06 đón đầu theo v̄ 1.0 s) hoặc ASH (đọc W20 so on hiệu lực §7.3, chịu §10–§11: EN_B3_04 mìn, EN_B1_07 trì)
Rosterchỉ 4 quái thường canon có hàng MICRO (EN_B1_02, EN_B1_06 BASE · EN_B3_04, EN_B1_07 ASH); quái thường khác 0 CV (Bible §10.1 = 42 biến thể = 21 chủ M/L/XL × 2: 9 EL + 7 MB + 5 BS (BS_B1–B4, BS_FINAL); BS_TRUE chỉ BASE, 0 CV — DEC-2026-11-07-13; 4 hàng MICRO ngoài con số đó). Thêm hàng MICRO mới = DEC
Tham sốparam = lo + (hi − lo) · clamp(m / 0.25, 0, 1), m = lề §7.3; lấy mẫu lại mỗi 0.25 s, đổi tối đa 1 bước/2 s
Áp lênwindup/đòn BẮT ĐẦU sau khi hiệu lực; đòn đang chạy không đổi
Bật (ASH)L_eff ≥ 1 · qua mốc 60 s (MRN13: 30 s) · 1 ô ngân sách Hồi (§11.3) · W20 đạt ngưỡng ≥ 5 s
Báo (ASH)lần bật đầu mỗi loại mỗi run: 1 con gần hero nhất của loại khựng 0.6 s + ◆ 0.6 s + callout + AshVariantOn (Tro Nhớ đổi thế: khựng 0.6 s + ◆ Mắt Tro, ≥ 1.0 s trước… SFX_SHARED_ash_read; hiệu lực sau 1.0 s; con mới spawn của loại đó có ◆ nhỏ trên ấn tro
Quên§7.3: < ngưỡng − 0.15 liên tục 30 s → về mặc định, ◆ mờ 0.5 s, trả ô ngân sách
Mặc định khi tắttham số = default của hàng (EN_B3_04: bom · EN_B1_07: không trì)

8.2 MESO — Đạo Diễn Tro dịch thành phần spawn

KhoáLuật
Phòng hợp lệCMB mục tiêu VIGIL/BELLS/NEST/GAUNTLET/CHASE · CHL · RSC. Không: phòng chiến đầu mỗi Hồi (MUT12 bỏ luật này), PURGE, TIDE, ELT, MBS, BOS
Điều kiệnL_eff ≥ 2 · run đã qua 60 s (MRN13: 30 s) · có trục spawn bật cờ MESO (MESO qua on hiệu lực của hero, §7.3, trong 2 phòng liền)
Chọn trụctrục spawn có lề lớn nhất trong bảng dưới; hoà → thứ tự bảng
Độ dịchs = 0.05 · round(3 · clamp(m / 0.25, 0, 1)) → 0 / 0.05 / 0.10 / 0.15 (trần 15%, INV-15)
Cách dịchchuyển s · B điểm ngân sách đe doạ của phòng từ vai không khắc sang vai khắc (chia đều các vai khắc có trong roster biome); không vai khắc nào trong biome → s = 0, không callout
ThưởngXP + CUR_SOUL_ASH phòng × (1 + s) (Bible: 15% → +15%)
Báođầu phòng (trước spawn đầu): Mắt Tro loé + callout "TRO DỒN BẦY: <vai> · +<s>% Tro Hồn" 2.5 s
Ngân sách HồiKHÔNG tính (không phải thế đáp); trần 250 quái + token không đổi
Trục · dir (ash_spawn_shift.csv)Thói quenVai khắc (Bible §7.2)
A02 HIGHđánh xa Tinh Anhvồ/lao · kéo/cưa · bổ nhào bom
A02 LOWáp sáttự nổ · ném bom/mìn · phản đòn sau lưng
A05 HIGHgom cụm diệt AoEkhiên · đánh xa/ném · bay/làm chậm · trụ tái tụ (tản + giáp)
A06 HIGHđạn/némkhiên · phục kích/ẩn · bay/làm chậm
A08 HIGHnúp vật caoném bom/mìn · bổ nhào bom · lăn theo đường
A03 HIGHLướt liên tụcdây nối · bay/làm chậm · trụ đứng yên
A10 LOWbỏ mặc quái xa/hỗ trợhỗ trợ/buff · đánh xa/ném · bắn đón đầu
  • Ví dụ: Hồi II B2, hero H01 (b A05 = 0.40 → on 0.60), MESO A05 = 0.71 hai phòng liền → m = 0.11 → s = 0.05·round(1.32) = 0.05; phòng VIGIL ngân sách 100 điểm → 5 điểm từ bầy EN_B2_01 sang EN_B2_03 / EN_B2_05 (B2 không có khiên, trụ tái tụ) → +5% XP/Tro Hồn.

8.3 MESO — thế đáp Tinh Anh / mini / boss

KhoáLuật
Kitmỗi M/L/XL đúng 2 CV viết tay (_CV1, _CV2), ≤ 1 bật cùng lúc (Bible §8.2)
CV BASE vs trầnCV BASE (budget_cost 0) là phản ứng kit, luôn bật, không tính vào trần ≤ 1 bật và ngân sách Hồi (§11.3); trần ≤ 1 chỉ áp giữa CV ASH. Vd: EL_B2_02, EL_B3_02, EL_B4_01, EL_B4_02 (1 BASE + 1 ASH) → CV BASE chạy suốt trận, CV ASH vẫn được xét bật/đổi theo các hàng dưới (Q20)
Điểm đánh giáTinh Anh: lúc spawn + 1 lần ở HP ≤ 50% · mini/boss: đầu trận (sau MACRO §9) + mỗi PHASE
Ứng viênCV có cờ trục bật (MESO qua on hiệu lực §7.3 trong 2 phòng liền); chọn lề lớn nhất; cần L_eff ≥ 2, 60 s, ô ngân sách
Đổi giữa trận Tinh Anh (≤ 1 lần)ở HP ≤ 50%: trục CV đang bật trong W20 < ngưỡng tắt VÀ trục CV kia trong W20 ≥ ngưỡng bật ≥ 5 s → đổi; chỉ trục cũ rơi → CV ngủ (về trung tính), ◆ mờ "Tro lơi"
Báo (mọi lần bật/đổi)t0: kẻ địch khựng 0.6 s (pose ash_read, bất động, không windup, vẫn nhận đòn) + ◆ ash-eye #f2ead8 socket overhead 0.6 s + Mắt Tro loé + AshVariantOn (Tro Nhớ đổi thế: khựng 0.6 s + ◆ Mắt Tro, ≥ 1.0 s trước… SFX_SHARED_ash_read + callout "NÓ ĐÃ ĐỌC BẠN: <thói quen>" + bark; hiệu lực từ t0 + 1.0 s (lần DECIDE đầu sau đó)
Không đổikhi BROKEN, khi đang WINDUP/STRIKE/LINK (đợi REST)
CHL (Thử Lửa)Tinh Anh của phòng bật sẵn 1 CV: lề lớn nhất kể cả âm (cờ không cần; lề theo on hiệu lực §7.3, CV có on ngoài [0,1] với hero bị loại); tất cả lề < −0.20 hoặc cả 2 bị loại → _CV1 (nếu _CV1 bị loại → _CV2; cả 2 bị loại → không bật, Tinh Anh thường); vẫn báo đủ ở lần DECIDE đầu
EM12 Nhớ Sẵnnhư CHL; tính ngân sách; mọi công tắc INV-15 tắt → Ấn trống
MRN14 Kẻ Truy TangTinh Anh săn đuổi dùng luật Tinh Anh thường; không bật sẵn

Lựa chọn ASH đặc biệt (chiếm ô CV của chủ):

ChủLựa chọnĐọcMặc định khi tắt
BS_B3 P1 Rèn Phảnbúa + 1 đòn P (A01.DEFLECT) · roi xích quét Y (A03) · giáo phóng Y phản được (A02 HIGH)MESO, lề lớn nhất theo on hiệu lực §7.3 (H07: A02 HIGH bị loại); mọi lề < 0 → mặc địnhbúa → xích → giáo (Bible #41)
EL_B4_03 điểm dừng chuỗidừng 1 đòn trước chuỗi ĐÁP TB của hero (§13 VD4)W20dừng ở đòn 5 → 1 đòn P
BS_FINAL P2 chọn bóng§9.5 (MACRO)Sổ ThùBS_B4 → BS_B3 → BS_B2

11Tầng MACRO — Sổ Thù (xuyên run)

9.1 Lưu trữ (save/ash_profile_<steamId>.json, Steam Auto-Cloud)

profile_version, kit_version
heroes[Hxx]: { meso: {A01:{DEFLECT,HOLD,DASH}, A02..A12, streak[axis]}, runs_played }
ledger[Hxx][BS_B1..BS_B4]: ring 5 × {
  run_id, utc, mode, do_tang, result(WIN|LOSS), duration_s, phase_reached,
  axes{A01..A12 trong cửa sổ FIGHT}, active_cv[], dmg_taken_per_min, killing_attack, age_runs }
scars[BS_B1..BS_B4]: ≤ 2 × { cv_id, carved_utc, runs_unmet, wins_since_carve }   // theo TÀI KHOẢN
  • Sổ Thù theo hero × boss Hồi, 5 trận gần nhất (Bible §8.2). Không lưu gì gắn danh tính quái (vùng an toàn thiết kế Bible §8.2).
  • Ghi khi: mode STANDARD/ENDLESS · công tắc "Trí nhớ xuyên run" BẬT · trận ≥ 20 s. Ghi cả ở 3 run đầu đời (chỉ ghi, không đọc). Mỗi run kết thúc: age_runs += 1 cho mọi bản ghi của hero vừa chơi.

9.2 Đọc & suy giảm

M_axis = Σ_k w_k · x_k,axis / Σ_k w_k
w_k    = r_rank(k) · 0.9^{age_runs_k}       r_rank = 1.0, 0.8, 0.6, 0.4, 0.2 (mới → cũ)
bỏ bản ghi khi age_runs > 20 (quên hẳn)     cần ≥ 2 bản ghi còn hiệu lực, nếu không → không mở màn MACRO
  • Ví dụ: 3 bản ghi A01.DEFLECT = 0.80 (age 0), 0.70 (age 2), 0.55 (age 5): w = 1.0, 0.8·0.81 = 0.648, 0.6·0.59 = 0.354 → M = (0.80 + 0.4536 + 0.1947)/2.002 = 0.72 → thẻ "Người Gác Chuông nhớ: bạn Gạt 72%".

9.3 Thế mở màn (boss Hồi BS_B1–BS_B4)

BướcLuật
1Đầu trận, L_eff = 3, có ô ngân sách: nếu boss có Sẹo → Sẹo thắng (§9.4), bỏ qua bước 2
2Lề MACRO của 2 CV: m = M_axis − on (HIGH; LOW on − M_axis), on = ngưỡng hiệu lực §7.3 theo b của hero của Sổ Thù; lề lớn nhất ≥ 0 → bật CV đó làm thế mở màn
3Báo: thẻ "X nhớ: bạn <thói quen> NN%" (NN = M × 100, làm tròn) trong 2.5 s khoá cổng + bark boss + ◆ trên thanh boss; hiệu lực ở DECIDE đầu tiên sau thẻ (≥ 1.0 s)
4Đổi pha: đánh giá lại theo MESO + W20 (§8.3); thế mở màn có thể bị thay, vẫn ≤ 1 bật
Tro lơi tay2 bản ghi mới nhất cùng là LOSS khi có CV bật → trận này bỏ thế mở màn; thẻ "X nhớ… nhưng Tro lơi tay"; reset khi thắng boss đó 1 lần
  • MACRO chỉ CHỌN 1 trong 2 CV viết sẵn của boss — không tạo nội dung, không tăng trần, không cộng dồn.
  • Hạ boss khi đang có CV bật: +50% CUR_SOUL_ASH từ boss đó + 1 CUR_ECHO_SHARD lần đầu mỗi cv_id (Bible §8.2).

9.4 Sẹo (tự chọn, Bible §8.2)

KhoáLuật
Mởsau Hồi Chuông END_BELL_TOLL; chỉ BS_B1–BS_B4; chỉ STANDARD/ENDLESS; tắt ở DAILY/BOSS_RUSH/CUSTOM
Nút "Khắc Sẹo"màn thắng; đề xuất CV có lề lớn nhất trong cửa sổ FIGHT vừa thắng ("theo cách bạn hạ nó"); CV đó đã là Sẹo → CV kia; đủ 2 → ẩn nút
Hiệu lựcSẹo 1 bật từ đầu trận (không xét ngưỡng); Sẹo 2 bật từ PHASE 2 (thay Sẹo 1, báo đủ); luôn ≤ 1 CV ASH bật (CV BASE ngoài trần, §8.3); tính ngân sách Hồi (boss ưu tiên)
Thưởng+20% CUR_SOUL_ASH từ boss đó / Sẹo
Mờ3 run liên tiếp (mọi hero) không gặp boss đó → Sẹo cũ nhất mờ; HOẶC 5 lần thắng boss đó không khắc Sẹo mới → Sẹo cũ nhất mờ
GộtST_LEDGER Bàn Thờ Ký Ức: 200 CUR_SOUL_ASH (UP_TEST_BELL_4: 150)
Cấmkhông kháng sát thương, không chỉ số, không thăng cấp kẻ địch; Sẹo chỉ sinh từ chiến thắng của người chơi

9.5 BS_FINAL P2 — chọn bóng boss

pain_b = 0.5 · loss_rate_b + 0.5 · clamp(dmg_taken_per_min_b / 60, 0, 1)    // từ Sổ Thù hero đang chơi, b ∈ BS_B1..BS_B4
thứ tự bóng = 3 boss pain cao nhất, giảm dần; hoà → thứ tự mặc định
mặc định (L_eff < 3, hoặc < 3 boss có ≥ 1 bản ghi): BS_B4 → BS_B3 → BS_B2
  • Chiếm ô CV của BS_FINAL trong P2; mỗi lần đổi bóng báo như §8.3. BS_TRUE P3 (hoá hero đang chơi) = BASE (thấy được), không đọc PSP.

9.6 Tương tác Khăn Tang, mode, reset

Yếu tốTác động lên MACRO
MRN04 Tro Nhớ Sâuchỉ nâng trần TVD (§11.2); không đổi số bản ghi, suy giảm, ngưỡng
MRN13 Tro Thức Sớmmốc bật 60 → 30 s; boss luôn sau mốc → không đổi MACRO
Độ Tang kháckhông đổi trí nhớ; bản ghi lưu do_tang chỉ để hiện codex
ENDLESSđọc + ghi như STANDARD (boss vòng lặp cùng Sổ Thù)
DAILYhồ sơ seed cố định (§10.2), không đọc/ghi Sổ Thù, không Sẹo
BOSS_RUSHchỉ MICRO: không MACRO/MESO/Sẹo, không ghi
CUSTOMđọc theo ash_level chọn; không ghi; không Sẹo
Công tắc "Trí nhớ xuyên run" TẮTkhông đọc/ghi Sổ Thù, không Sẹo, MESO khởi đầu mỗi run từ phòng đầu (§7.1); bản ghi giữ nguyên, xám trong codex
"Xoá Sổ Thù" (Cài đặt)xoá bản ghi theo hero hoặc tất cả, 2 bước xác nhận, miễn phí; không xoá Sẹo
Patch đổi kit bosskit_version khác → bỏ active_cv lạ, giữ axes
Cổng pháp lý (FTO) trượtMACRO + Sẹo chuyển chỉ-thoại: thẻ/bark vẫn hiện, không bật CV (Bible adaptive.legal_gate)

12Cấp Tro Nhớ & công tắc

10.1 ash_level

LTầng đọc PSPNhịp lừa ASHDùng ở
0không (mọi đòn ASH = mặc định trung tính; BASE vẫn chạy)khôngThương Xót "Tro Nhớ 0", CUSTOM 0, 3 run đầu đời, 60 s đầu run
1MICROcó (MICRO)BOSS_RUSH (trần mode), CUSTOM 1
2MICRO + MESO (dịch spawn, CV Tinh Anh/mini/boss, Rèn Phản)cóCUSTOM 2
3+ MACRO (thế mở màn, Sẹo, BS_FINAL P2)cóSTANDARD, ENDLESS, CUSTOM 3 (không Sẹo), DAILY (MACRO = hồ sơ seed, không Sổ Thù)
L_eff = clamp(L_mode − mask − mercy, 0, 3)
mask  = 1 khi hero mang Edge chung "Mặt Nạ Vô Danh" (Bible §8.5)
mercy = 1 trong 10 s kể từ khi HP hero cắt xuống < 25% (mỗi lần cắt từ ≥ 25%); kèm k_mercy = 0.5 (§6.3)
L_eff = 0 khi: run_time < 60 s (MRN13: 30 s) · runs_played_lifetime < 3 · Thương Xót Tro Nhớ = 0
  • L_eff giảm → CV thuộc tầng > L_eff NGỦ ở REST kế tiếp (không giữa chuỗi), ◆ mờ, Mắt Tro bớt con ngươi; tăng lại → bật lại với báo đủ 1.0 s.
  • "Sổ Trắng" (Relic): trục A01 bị bỏ khỏi mọi phép chọn (coi như trung tính 0.33), cả HUD. Then Chốt "đảo 1 trục" (doc hero khai báo trục): trục đó đọc thành 1 − v (A04: −v) với mọi tầng.

10.2 Hồ sơ seed DAILY / Truy Tuần

  • Seed sinh 2 trục cố định (không trùng, rút từ A01.DEFLECT, A02, A03, A05, A06, A08, A10, dir HIGH). Vector theo hero H đang chơi: trục seed = on_HIGH(H) + 0.12 (§7.3; trung tính → 0.72 như cũ); 10 trục còn lại = b[H]. Trục có on_HIGH(H) + 0.12 > 1 với H → thay bằng trục kế trong danh sách (vòng, theo rng_ai), để mọi hero có đúng 2 trục seed với lề 0.12. Không ghi hồ sơ cá nhân, không Sẹo, không Sổ Thù.
  • MESO/CV đọc vector seed (cờ bật sẵn từ phòng 1 vẫn theo luật phòng hợp lệ §8.2); MICRO đọc W20 thật (trong run, giống nhau cho mọi người về luật).
  • Mọi roll AI qua rng_ai của seed → cùng điều kiện cho cả bảng xếp hạng.

13Luật công bằng (cứng, INV-15 + thêm)

11.1 Bất biến (mọi tầng, mọi Khăn Tang/Ấn/mutator)

#LuậtKiểm
F1Tell (Y/P/N, màu, glint, SFX), windup sàn, khe chuỗi ≥ 0.35 s, sát thương, hitbox, token: KHÔNG đổi bởi CVash_lint: hàng biến thể có windup ≥ gốc, tell = gốc, dmg = gốc, shape = gốc
F2≥ 50% nhịp mỗi M/L/XL là Y (đếm nhịp) trong kit; runtime y(q) ≥ 0.50 sau dịchfairness_lint (doc 11) + guard §6.3
F3Mỗi CV: ≥ 2 cách trả lời khả dụng với MỌI hero (cột answers ≥ 2 trong {ĐÁP, Lướt, đi ra/ngoài tầm, phá đạn/vật, ngắt bằng Vỡ Thế}); đòn Y luôn có ĐÁP + Lướt; P luôn có Lướt + đi raash_lint
F4Không vô hiệu cứng 1 build: cấm miễn ĐÁP, miễn đạn, miễn sát thương AoE, đánh chỉ từ sau lưng, tăng tầm/hitbox, hồi HP, kháng theo tag; CV chỉ đổi trọng số/tham số đòn có sẵnash_lint: effect_type ∈ {WEIGHT_MULT, UNLOCK_ATTACK, PARAM_MOD, COMPOSITION_SHIFT}, param ∈ whitelist §12.2
F5Mọi CV có cửa phạt dài hơn: recover của đòn đích + ≥ 0.15 s (Bible §8.5)ash_lint
F6Báo ≥ 1.0 s trước hiệu lực (khựng 0.6 s + ◆ + callout/bark + SFX); dịch spawn báo đầu phòngruntime: effect_at ≥ telegraph_at + 60 tick
F7Phản xạ: không phản ứng input < 0.25 s; thống kê ≥ 0.5 s tuổi; không dùng thông tin hero không thấy (§1.2)test tự động: bot bấm ĐÁP ngẫu nhiên, đo độ trễ phản ứng
F8Nhịp lừa ≤ 1/chuỗi, ≤ 0.35 s, pose + SFX riêng, glint 2 đúng 7 tick trước va chạmash_lint + runtime đếm
F9Không đổi CV khi Vỡ Thế / giữa chuỗi; không bắt đầu P mới khi Vỡ Thếruntime
F10Không có trí nhớ trên quái thường/Tinh Anh/mini/quái sinh thủ tục; không thăng cấp kẻ địch; Sẹo chỉ ở 4 boss Hồireview + ash_lint (Sẹo chỉ owner BS_B1–BS_B4)

11.2 Trần dịch trọng số cap_tier (TVD, §6.3)

HạngGốcMRN04 bậc 1MRN04 bậc 2
M Tinh Anh0.200.250.30
L mini-boss0.20 (theo Tinh Anh)0.250.30
XL boss (gồm BS_FINAL, BS_TRUE)0.350.420.50 (trần tuyệt đối)
  • Dịch spawn MESO: ≤ 0.15 mọi Khăn Tang. MICRO: biên [lo, hi] của hàng, không nhân Khăn Tang.

11.3 Ngân sách thế đáp theo Hồi (đồng thời)

HồiIIIIIIIVKếtBí mậtENDLESS
Ô CV bật cùng lúc (gồm EM12, đòn ASH, MICRO ASH, Sẹo, lựa chọn ASH)123333theo Hồi của biome đang chạy
  • Mỗi kẻ địch ≤ 1 CV ASH bật (CV BASE budget_cost 0 ngoài trần, §8.3 Q20). Không Khăn Tang/mutator nào tăng ngân sách.
  • Tranh ô: boss/mini > Tinh Anh (gồm CHL, EM12, MRN14) > MICRO ASH (đến trước được trước). Bên thấp hơn bị đẩy → NGỦ ở REST kế (báo mờ ◆).

11.4 Đỡ người chơi đang chật vật (rubber-band, chỉ có lợi)

Kích hoạtHiệu ứng
HP < 25%L_eff − 1 + k_mercy 0.5 trong 10 s (Bible)
Mất ≥ 40% HP tối đa trong 20 s do đòn của kẻ địch đang có CVCV đó ngủ 20 s ("Tro lơi", ◆ mờ); lần bật kế cần lề ≥ +0.05 [ASSUMED]
2 lần thua liên tiếp cùng boss khi có CVtrận kế bỏ thế mở màn ("Tro lơi tay", §9.3)
Dùng Lửa Gửi (hồi sinh trong run)mọi CV đang bật ngủ 15 s sau khi đứng dậy [ASSUMED]
Thương XótTro Nhớ 0 bất cứ lúc nào, hiệu lực từ REST kế
  • Rubber-band KHÔNG bao giờ làm khó hơn: không có luật tăng thích nghi khi người chơi thắng dễ (độ khó tăng chỉ qua Khăn Tang).

11.5 Dụ Tro Nhớ = kỹ năng có chủ đích

  • Chọn CV xảy ra ở mốc biết trước (đầu phòng/đầu trận/50% HP Tinh Anh/đổi pha) → người chơi được phép "nuôi" 1 thói quen ở phòng trước rồi đổi lối khi CV đã chốt. Nhờ baseline §7.3, CV chỉ bật khi người chơi LỆCH khỏi baseline kit hero ít nhất thr_on − n (A02 mặc định 0.20) → mọi CV dụ được (về lại baseline = CV tắt); không hero nào bị gán sẵn 1 CV mỗi run.
  • ACH_trick_the_ash: hạ 1 Tinh Anh/boss đang có CV bật trong khi trục của CV đó đo trong cửa sổ trận (từ lúc CV bật) ở phía TẮT (qua off hiệu lực §7.3 của hero) và trận ≥ 20 s.
  • Build chống ký ức (Bible §8.5): Edge chung "Mặt Nạ Vô Danh" (cấp −1) · Relic "Sổ Trắng" (bỏ A01) · mỗi hero 0–1 Then Chốt đảo 1 trục (§10.1).

14Hợp đồng soạn thế đáp (data/ash_counters.csv)

12.1 Cột (mọi hàng phải đủ; thiếu → ash_lint chặn merge)

CộtKiểu / miềnLuật
cv_id<ownerId>_CV1 · _CV2MICRO: chỉ _CV1 (≤ 1/loại); M/L/XL: đúng 2
owner · tierenemyId · S/M/L/XLkhớp Bible §7
layerMICRO · MESOMESO của boss Hồi được dùng làm thế mở màn MACRO + Sẹo
adaptive_sourceBASE · ASHBASE chỉ đọc sự kiện đơn lẻ thấy trên màn ≤ 10 s (cú Lướt cuối, vị trí/ô A09 W10, vận tốc); mọi trung bình trục (kể cả A04 TB) = ASH
axis · dirA01.DEFLECT/HOLD/DASH, A02–A12 · HIGH/LOW/LEFT/RIGHT/SIDESIDE = LEFT hoặc RIGHT theo on hiệu lực §7.3 (hướng lấy theo dấu)
thr_on · thr_off0.30–0.85 · thr_on − 0.15mặc định 0.60 / 0.45; = mức sàn, runtime dùng on/off hiệu lực theo b[H] §7.3; BASE để rỗng
min_rooms0–3mặc định 2 (MESO); MICRO = 0 (dùng 5 s W20)
effect_typeWEIGHT_MULT · UNLOCK_ATTACK · PARAM_MOD · COMPOSITION_SHIFTCOMPOSITION_SHIFT chỉ ở ash_spawn_shift.csv (§8.2)
targetsid đòn <ownerId>_Annđòn có sẵn trong kit của chủ
multA01:0.7|A03:2.0mỗi hệ số 0.25–3.0; TVD thật do §6.3 kẹp
variant_attack · take_f<ownerId>_Ann có variant_of · 0.1–1.0biến thể = đòn gốc đổi tham số §12.2 + 1 pose tell thay; clip mới chỉ boss, ≤ 1/boss (Bible §7.7)
param · lo · hi · defaulttên trong whitelist §12.2default = giá trị khi tắt (trung tính)
phase_mask1/2/3đòn đích phải có trong pha
answers≥ 2 trong {DEFLECT, DASH, EXIT, BREAK_OBJECT, POISE_BREAK}F3
recover_add_s≥ 0.15cửa phạt dài hơn (F5)
feint0/11 → tính quota nhịp lừa/chuỗi
habit_key · hint_key · bark_keykhoá loccallout "NÓ ĐÃ ĐỌC BẠN: <habit>" · mẹo codex/"Tro đã học" · bark ≤ 48 ký tự
budget_cost1mọi hàng ASH; BASE = 0
scar_ok0/11 chỉ cho BS_B1–BS_B4
codex_keykhoámở trang ngay lần gặp đầu (Bible §8.4)

12.2 Whitelist tham số PARAM_MOD / biến thể

paramÁp choBiênGhi chú
aim_lead_pxđạn, lao, nhảy0–60 pxđón đầu theo v̄ 1.0 s
aim_offset_pxvùng P / điểm nhảy0–32 px, hướng theo trụckích thước vùng không đổi
angle_offset_degvồ, quét, nón0–20°
windup_hold_sđòn Y/P0–0.35 s, chèn giữa glint 1 và glint 2feint = 1; pose hold + SFX_<ownerId>_feint
chain_stopđòn Y×n có nhánh dừng≥ nhịp 3sau dừng = đòn kế viết sẵn (P có windup đủ)
link_orderđồ thị đònhoán vị link có sẵnkhông tạo link mới vi phạm gap_min
extra_beatđòn Y×n+1 nhịp, khe ≥ 0.35 sgiữ F2 Y-floor
step_pxM/L/XL đòn cận chiến0–48 px trước nhịp 1, trong winduphitbox giữ nguyên
payloadvật némđổi dạng cùng tell lớp, cùng sát thương, cùng bán kínhvd bom → mìn
weapon_pick · shadow_orderBS_B3 · BS_FINALdanh sách canonlựa chọn ASH §8.3
recover_add_smọi+0.15–+0.50 sbắt buộc ≥ 0.15
  • Cấm đổi: sát thương, kích thước hitbox/vùng, windup (giảm), lớp tell, tốc đi/tốc đạn, HP, giáp, Thế, token, cooldown (giảm), số đạn P, tầm r_max.

15Ví dụ đã tính (7 hàng, đủ 4 hạng + Đạo Diễn)

📌
Trọng số gốc của mini/boss ngoài canon demo là minh hoạ [ASSUMED]; doc kẻ địch chốt số thật, công thức giữ nguyên.

VD1 — Thường, MICRO ASH, PARAM_MOD: EN_B3_04_CV1 Phu Bom "bom → mìn"

FieldGiá trị
axis · dir · thrA06 · HIGH · on 0.40 / off 0.25 (Bible: A06 > 40%)
parampayload: tỉ lệ ném ra mìn, lo 0.50 · hi 1.00 · default 0 (bom)
Mìnrơi = vật thể destructible HP 1 + vòng N chấm r30 không sát thương; hero vào r30 → P windup 0.45 s, nổ bán kính = bom gốc, sát thương = bom gốc; sống 8 s; ≤ 3 mìn/Phu Bom; ăn P_FLOOR lúc kích
answers · recover_addEXIT (đi vòng/Lướt ra khi kích) · BREAK_OBJECT (1 viên đạn bất kỳ phá mìn) · +0.30 s sau mỗi lần ném
  • W20: A06 = 0.52 → m = 0.12 → payload = 0.50 + 0.50 · 0.48 = 0.74 → 74% cú ném ra mìn. Người chơi đạn có lời đáp ngay bằng đúng thói quen của họ (bắn mìn).

VD2 — Thường, MICRO ASH, nhịp lừa: EN_B1_07_CV1 Hồn Khói "ngập ngừng"

FieldGiá trị
axis · dir · thrA12 · HIGH · 0.60 / 0.45
paramwindup_hold_s lo 0 · hi 0.15 · default 0; feint = 1; pose hesitate + EnemyFeint (enemyId=EN_B1_07, cv=EN_B1_07_CV1) — khung 0 clip attack_… SFX_EN_B1_07_feint
answers · recover_addDEFLECT (glint 2 vẫn 7 tick trước va chạm) · DASH · +0.15 s
  • W20 A12 = 0.78 → m = 0.18 → hold = 0.15 · 0.72 = 0.108 s → ceil(0.108·60 − 0.001) = 7 tick (làm tròn có lợi người chơi, doc 10 §1.1). Người ĐÁP theo glint 2 không bị ảnh hưởng; chỉ người bấm theo glint 1/pose bị bắt.

VD3 — Tinh Anh, MESO, WEIGHT_MULT: EL_B1_01_CV1 Đồ Tể Mộ "khinh kẻ gạt"

FieldGiá trị
axis · dirA01.DEFLECT · HIGH (0.60 / 0.45, 2 phòng)
multA01 Chặt Bổ ×0.7 · A03 Nện Mộ P ×2.0
answers · recover_addDASH (ra khỏi Nện Mộ) · EXIT · DEFLECT (A01/A02 còn lại) · A03 recover +0.30 s
p  = (A01 .45, A02 .35, A03 .20)              // canon demo < 55 px
q* = normalize(.315, .35, .40) = (.296, .329, .376)
D  = ½(.154 + .021 + .176) = .175 ≤ c .20 → λ = 1 → q = q*
y(q) = (.296·1 + .329·2) / (.296 + .329·2 + .376·1) = .954 / 1.330 = .72 ≥ .50 ✓
  • MRN04 bậc 2 (c = 0.30): như trên (D < c). Nếu doc Tinh Anh đặt A03 ×3.0: q* = (.249, .277, .474), D = .274 > .20 → λ = .730 → q = (.303, .297, .400), TVD = .20 — kẹp đúng 20%.

VD4 — Tinh Anh, MESO ASH, PARAM_MOD chuỗi: EL_B4_03_CV1 Đấu Sĩ Cánh Quạ "dừng sớm"

FieldGiá trị
axisA01.DEFLECT · HIGH (cờ bật) + đọc streak_avg = TB số nhịp Y liên tiếp hero ĐÁP được từ nhịp 1 của các đòn Y×n (n ≥ 3), W20, ≥ 2 mẫu
paramchain_stop = clamp(round(streak_avg) − 1, 3, 6) · default 5 (BASE canon)
Sau dừng1 đòn P viết sẵn, windup ≥ 0.45 s + vùng tím; recover P +0.20 s
answersDASH khi pose đổi sang P · DEFLECT mọi nhịp Y trước đó
  • streak_avg = 4.6 → round 5 − 1 = 4 → P sau nhịp 4. TVD = 0 (không đổi trọng số), vẫn tốn 1 ô ngân sách.

VD5 — Mini-boss, MESO, UNLOCK_ATTACK bị kẹp: MB_B2_1_CV1 Mẹ Kén Tơ Tro "đuổi kẻ đứng xa"

FieldGiá trị
axis · dirA02 · HIGH
variantChân Đâm Đuổi MB_B2_1_A04 Chân Đâm Đuổi = variant_of A03 Chân Đâm Y×3 + step_px 40 trong windup + pose chồm; take_f 0.6; recover +0.20 s
answersDEFLECT ×3 · DASH · EXIT (lùi khỏi 40 + tầm đòn)
p  = (A01 Đẻ Kén .20 [summon, n=0], A02 Phun Tơ P .35, A03 Chân Đâm Y×3 .45)   [ASSUMED]
q* : A03 .45·.4 = .18 · A04 .27            D = .27 > c .20 → λ = .741
q  = (A01 .20, A02 .35, A03 .25, A04 .20)  TVD = .20 ✓
y(q) = (.25·3 + .20·3) / (.35 + .25·3 + .20·3) = 1.35 / 1.70 = .79 ✓

VD6 — Boss, MACRO mở màn + Sẹo, UNLOCK + nhịp lừa: BS_B1_CV1 Người Gác Chuông "chuông trì"

FieldGiá trị
axis · dirA01.DEFLECT · HIGH · scar_ok 1
variantChuông Trì BS_B1_A06 Chuông Trì [id minh hoạ] = variant_of BS_B1_A01 Chuỗi Chuông Y×3: nhịp 3 windup_hold_s 0.30 (pose chuông ngẩng + EnemyFeint enemyId=BS_B1 attackId=BS_B1_A06 (attack_hold f10 = chuông… SFX_BS_B1_A06_feint), feint 1; take_f 0.5; recover +0.25 s; P2/P3 dùng Y×4, hold ở nhịp 4
answersDEFLECT (đợi glint 2 nhịp cuối) · DASH
P1 p = (A01 .40, A02 P .25, A03 P .20, A04 summon .15)        // canon demo w40/25/20/15
q    = (A01 .20, A06 .20, A02 .25, A03 .20, A04 .15)          TVD = .20 ≤ .35 ✓
y(q) = (.20·3 + .20·3) / (1.20 + .25 + .20) = .727 ✓
  • Sổ Thù hero H01: M(A01.DEFLECT) = 0.72 (VD §9.2) → lề .12 ≥ 0 → thế mở màn = CV1; thẻ "Người Gác Chuông nhớ: bạn Gạt 72%".
  • BS_B1_CV2: A04 · SIDE → PARAM_MOD A03 Nhảy Chuông aim_offset_px 24 về phía Lướt quen (vùng r80 giữ nguyên); answers DASH ngược phía · EXIT; recover +0.20 s.
  • Thắng khi CV1 bật → +50% CUR_SOUL_ASH + 1 CUR_ECHO_SHARD (lần đầu). Sau END_BELL_TOLL: "Khắc Sẹo" đề xuất CV1 → từ đó mọi trận BS_B1 bật CV1 từ giây đầu, +20% CUR_SOUL_ASH.

VD7 — Đạo Diễn Tro, COMPOSITION_SHIFT: B3_A08_HIGH

FieldGiá trị
axis · dirA08 COVER · HIGH (2 phòng)
Vai khắc trong B3ném bom/mìn EN_B3_04 · lăn theo đường EN_B3_03
Ví dụMESO A08 = 0.85 → m .25 → s = .15; phòng NEST ngân sách 120 → 18 điểm từ EN_B3_01 chia đều sang EN_B3_04 / EN_B3_03; callout "TRO DỒN BẦY: ném bom · +15% Tro Hồn"; XP/Tro Hồn phòng ×1.15

16UI & diegesis (người chơi thấy)

Phần tửLuật
Mắt Tro (HUD, cạnh HP)0–3 con ngươi = số CV đang bật ảnh hưởng hero (gồm MICRO ASH); màu ash-eye #f2ead8; loé 0.4 s khi bật/đổi; mờ khi ngủ; L_eff = 0 → mắt nhắm
Giữ View/Tabbảng "Tro đang nhớ": tối đa 3 trục cờ bật, lề lớn nhất trước, dạng "Gạt 72% · Lướt trái 64%" (Bible §8.4) + độ lệch so baseline hero "▲+30" / "▼−22" (= (v − b) × 100, làm tròn; "Hiện số %" TẮT → "lệch ít/nhiều") + danh sách CV bật: tên kẻ địch · thói quen · mẹo hint_key; World không dừng (bảng mờ 70%, không che vùng an toàn tell)
Bật/đổi CVkẻ địch khựng 0.6 s + ◆ trên socket overhead 0.6 s + callout "NÓ ĐÃ ĐỌC BẠN: <thói quen>" giữa-dưới 2.5 s + AshVariantOn (Tro Nhớ đổi thế: khựng 0.6 s + ◆ Mắt Tro, ≥ 1.0 s trước… SFX_SHARED_ash_read (−16 dB) + bark (≤ 1 bark/4 s, ưu tiên boss > Tro Nhớ > NPC > hero — doc 32); không vẽ đè tell
Thanh boss2 khe ◆ cạnh tên: rỗng = CV đã biết (codex) · đặc = đang bật · nứt = Sẹo; tooltip trong bảng View/Tab
Nameplate Tinh Anh/minitag "◆ <tên thế đáp>" khi có CV bật
Đầu phòng (MESO)callout "TRO DỒN BẦY: <vai> · +<s>% Tro Hồn"
Đầu trận boss (MACRO)thẻ "X nhớ: bạn <thói quen> NN%" 2.5 s trong lúc khoá cổng
Màn chết/thắng"Tro đã học": top 3 trục (MESO) + 1 mẹo/trục từ hint_key của CV đã gặp; recap INV-16 ghi ◆ cạnh đòn của CV
Codex — Sổ Thùmỗi boss Hồi × hero: 5 bản ghi (ngày, kết quả, Độ Tang, thói quen nổi bật), thế mở màn dự kiến, Sẹo, nút "Xoá Sổ Thù"
Codex — bestiarymỗi kẻ địch: trang CV mở ngay lần gặp đầu (Bible §8.4): trục, thói quen, mẹo, đòn bị đổi
Cài đặt"Trí nhớ xuyên run" BẬT/TẮT (mặc định BẬT; TẮT = không MACRO/Sẹo, không khoá gì) · "Hiện số %" BẬT/TẮT (TẮT → chữ "ít/nhiều") · Thương Xót "Tro Nhớ 0"
Mù màu / chỉ hình◆ có viền tối 1 px + hình thoi; callout luôn kèm chữ; SFX ash_read có phụ đề "[Tro đọc]"
  • Diegesis: Tro = hồn chưa sang sông xem mọi trận ("Tro nhớ cách bạn giết nó"); Sổ Thù = trang Hol ghi trận; Sẹo = dấu tự khắc lên chuông boss (doc 20 §10). Không dùng thuật ngữ thương mại của hệ "kẻ thù nhớ mặt" có thật trong UI/doc.

17Telemetry & KPI

Sự kiệnTrường
ash_room (cuối phòng)run_id, hero, act, node, objective, x_room[A01..A12] + mẫu, MESO sau cập nhật, streak cờ
ash_cv_on / ash_cv_offcv_id, owner, layer, axis, giá trị, lề, lý do (threshold/budget/mercy/mask/forget/phase/struggle), tick báo, tick hiệu lực
ash_budget_blockcv_id bị đẩy, ai giữ ô
ash_spawn_shiftnode, axis, s, điểm chuyển, vai nhận
ash_hitđòn trúng hero: attack_id, adaptive_source, cv_id hoặc null, feint 0/1, tell Y/P/N
ash_fightboss, kết quả, thời lượng, cv mở màn (MACRO/Sẹo/không), dmg_taken_per_min
ash_death5 nguồn cuối (INV-16) + cv_id của từng nguồn
ash_trickđiều kiện ACH_trick_the_ash đạt
ash_settingsmemory on/off, ash_level CUSTOM, Thương Xót Tro Nhớ
KPIĐíchHành động khi trượt
Nhận ra Tro Nhớ (khảo sát)≥ 60% (Bible)tăng nổi bật callout/◆, thêm bark
Thấy bất công≤ 15% (Bible)giảm cap_tier 0.05 / tăng thr_on 0.05
Tỉ lệ trúng đòn tím< 30% (Bible)soát CV dồn P (VD3), giảm mult P
Chênh tỉ lệ thắng boss có CV vs không≤ 10 điểm % [ASSUMED]giảm cap boss hoặc bỏ CV gây chênh
Chênh sát thương nhận/phút khi CV bật≤ +15% [ASSUMED]như trên
Cái chết có ≥ 1 nguồn CV≤ 25% [ASSUMED]soát answers, tăng recover_add_s
Sát thương nhận từ đòn nhịp lừa vs cùng đòn không lừa≤ ×1.5 [ASSUMED]giảm windup_hold_s.hi
% người chơi tắt nhớ xuyên run≤ 10% [ASSUMED]rà Sổ Thù quá gắt
Cùng 1 cv_id bật ở run của 1 hero≤ 50% số run hero đó [ASSUMED]refit hero_baseline ô trục đó = trung vị telemetry hero (§7.3)
Chênh tỉ lệ CV bật/run giữa 12 heromax/min ≤ ×2 [ASSUMED]như trên

18Debug overlay & núm chỉnh

📊 Núm chỉnh (tuning.ai · tuning.ash)

84 dòng
NúmGiá trịĐơn vịGhi chú
perception_age_s0.25sđọc anim/vị trí hero để chọn đòn (INV-15 phản xạ)
perception_ring0.25/8s · ôring snapshot 0.25 s × 8 (2 s)
spawn_mark_s0.6sấn tro (INV-14)
spawn_no_windup_s0.8s—
engage_sway_px4pxđung đưa ±4 px
orbit_wait_s0.5schờ > 0.5 s không token → ORBIT
orbit_min38pxINV-08
orbit_max70px—
orbit_speed_mult0.3×30% tốc; sáng −10%
strike_active_max_ticks8tickY cận chiến
stagger_s1sbị ĐÁP (EN_B1_04 1.5 s)
flee_s1.2sEN_B1_03 < 60 px
slot_inner_count8ôgóc 45°
slot_outer_count12ôvòng chờ
slot_outer_r54px—
slot_inner_reach_mult0.8× reachr_in = 7 + radius + reach × 0.8
slot_assign_period0.25sc = Δgóc/45 + dist/64
slot_keep_hysteresis0.3chi phígiữ ô nếu c_cũ ≤ c_mới + 0.3
slot_front_cone90°ô trong nón ±90° điền trước
ranged_spacing_px48pxcách nhau ≥ 48 px
ranged_spacing_deg30°≥ 30° góc nhìn
swarm_cohesion_r48pxtrọng số 0.3
swarm_cohesion_w0.3×—
swarm_split_n12quáitách gói khi > 12
support_spacing_r100px—
swarm_lead_px24pxbầy đi trước support/ranged ≥ 24 px
lof_period0.25s—
lof_shrink_px40pxkhông LOS 2.0 s → r_keep −40
lof_shrink_after_s2s—
low_prop_cost1.5×vật thấp chi phí đi
melee_tokens4tokenINV-08 (demo)
melee_tokens_duel2tokenkhi M/L/XL windup nhắm hero
melee_tokens_boss_p0token0 trong 0.6 s cuối windup P boss
melee_tokens_boss_p_window0.6s—
proj_tokens3loạtINV-08
proj_hold_max_s2s—
p_floor_tokens3token—
p_total_tokens5token—
heavy_tokens1tokenđổi → DEC
objective_tokens6token—
token_cd_melee0.8s—
token_cd_proj1.2s—
token_prioon_screen: 100, in_front: 50, wait_s: 20, wait_cap_s: 3, dist_px: −0.1, slot_inner: 10, front_dot: 0.3điểmprio token
p_escape_disc_r120pxP mới > 70% đĩa r120 → trì 0.3 s
p_escape_pct70%—
p_escape_delay0.3strì 2 lần vẫn vượt → huỷ
aggro_basehero: 10, taunt_s: 12, taunt_m: 6, taunt_lxl: 0, objective: 14, structure: 0điểmscore = base − dist/100
aggro_hysteresis0.5điểm—
aggro_eval_s0.5s—
objective_attacker_pct40%Director gắn cờ cho 40% spawn VIGIL
vigil_brazier_hp300HPlò canh VIGIL
flow_cell_px16px—
flow_hz10Hz—
flow_costlow_prop: 1.5, zone_n: 4, zone_p_windup: 8×—
flow_wide_hz5Hztrường rộng L/XL
seek_r48pxtrong r48 lái thẳng tới ô
stuck_px4pxdịch < 4 px trong 2 s
stuck_s2s—
stuck_side_px32pxlệch ngang 1.0 s
stuck_leash_s5s—
leash_px900pxcanon 14 (15 §5.2 ghi 600 px — open issue)
leash_s3scanon
move_max_s2sMOVE ≤ 2.0 s rồi buộc chọn đòn
stalk_r90/140px50% tốc
stalk_speed_mult0.5×—
rest_elite_s1sBS_B1 0.8/0.5/0.4
utility_attack_frac0.15× ΣqS ≥ 0.15 · Σ q → ATTACK
range_falloff_px40pxR = max(0, 1 − dist_out/40)
angle_out_mult0.5×G ngoài angle_max
behind_deg120°hero sau lưng > 120° → xoay
summon_cd_min20sđòn summon boss ≥ 20 s
y_floor0.5tỉ lệy(q) ≥ 0.50; chia đôi λ ≤ 6 lần
y_floor_halvings6lần—
max_links_m2link—
max_links_l2link—
max_links_xl3link—
link_decay0.7×p × 0.7^(k−1)
gap_beta2/3Beta(α,β)gap = gap_min + (gap_max − gap_min) · u
rep_last0.35K—
rep_pity_picks8lần—
rep_pity_mult3K—
rep_pity_q_min0.1qđòn q ≥ 0.10
rep_pair_mult0.3×cặp link lặp p × 0.3
mini_phases_max2pha—
54 dòng
NúmGiá trịĐơn vịGhi chú
psp_thr_on0.6vđổi → DEC
psp_thr_off0.45vLOW: > 0.55
psp_min_rooms2phòng liềnBible
meso_alpha0.15αEMA/phòng
w10_bins0.25/40s · thùng—
w20_bins0.25/80s · thùng—
read_age_s0.5sW20 bỏ 2 thùng mới nhất
safe_view_margin_px16pxvùng an toàn 427×267 + 16 px
micro_on_s5s—
micro_forget_s30sBible
micro_forget_margin0.15v< ngưỡng − 0.15
micro_margin_scale0.25mparam = lo + (hi − lo)·clamp(m/0.25)
micro_resample_s0.25sđổi ≤ 1 bước/2 s
micro_step_s2s—
spawn_shift_max0.15×BINV-15
spawn_shift_step0.05×Bs = 0.05 · round(3 · clamp(m/0.25))
cap_m0.2TVDM gốc; L theo M
cap_xl0.35TVDXL gốc
cap_tier_mrn04M: 0.2/0.25/0.3, L: 0.2/0.25/0.3, XL: 0.35/0.42/0.5TVDgốc · MRN04 bậc 1 · bậc 2
cv_budget_actI: 1, II: 2, III: 3, IV: 3, V: 3, VI: 3ô CVENDLESS theo Hồi biome
macro_rank_w1/0.8/0.6/0.4/0.2wmới → cũ
macro_age_decay0.9×/run—
macro_drop_age20run—
macro_min_records2bản ghi—
ledger_ring5trậnhero × boss Hồi
ledger_min_fight_s20strận ≥ 20 s mới ghi
macro_card_s2.5sthẻ 'X nhớ'
pain_dmg_norm60HP/phútpain = 0.5 · loss_rate + 0.5 · clamp(dmg/60)
scar_max2Sẹo/boss—
scar_soul_ash_bonus20%/Sẹo—
scar_fade_runs3run3 run không gặp boss → mờ
scar_fade_wins5lần thắng—
scar_cleanse_cost200Tro HồnUP_TEST_BELL_4: 150
cv_kill_soul_ash_mult1.5×+50% Tro Hồn boss khi CV bật
unlock_run_s60sL_eff = 0 khi run_time < 60 s (MRN13: 30 s)
unlock_run_s_mrn1330s—
unlock_lifetime_runs3run—
mercy_hp0.25HP%HP < 25% → L_eff − 1
mercy_s10sBible
mercy_k0.5×—
daily_seed_axis_v0.72v2 trục seed = 0.72
struggle_hp0.4HP%—
struggle_window_s20s—
struggle_sleep_s20s—
struggle_rearm_margin0.05m—
revive_sleep_s15sLửa Gửi: CV ngủ 15 s
feint_max_s0.35sINV-15
telegraph_lead_s1s≥ 1.0
ash_stagger_s0.6sBible
callout_spawn_s2.5sTRO DỒN BẦY
reflex_min_s0.25sF7 không phản ứng input < 0.25 s
cv_recover_add_s0.15sF5 recover + ≥ 0.15 s
chl_cv_neg_margin−0.2mmọi lề < −0.20 → _CV1
trick_ach_min_fight_s20sACH_trick_the_ash

16.1 Overlay (F3, chỉ build dev; phím debug gỡ khỏi bản phát hành — doc 01)

TrangHiển thị
AInhãn state trên từng quái (trong r200); icon token đang giữ (M/P/PF/H/O) + bộ đếm dùng/trần; vòng 8 ô + 12 ô; mũi tên flow field (lưới 16 px, bật/tắt); tia LOF xanh/đỏ; quái kẹt tô cam
BRAIN (M/L/XL)3 điểm utility cao nhất; thanh p vs q từng đòn, TVD/cap, y(q); chuỗi đang dựng (link, gap đã roll); K chống lặp; pha; ô HEAVY
PSP§7.4
Lệnh devash.set <axis> <v> · ash.force <cv_id> · ash.level <0-3> · ash.ledger.fake <boss> <n> (sinh n bản ghi) · ash.ledger.clear · ash.trace on · ai.tokens <T> <n> (chỉ test, log cảnh báo)

16.2 Núm (ai_tuning.csv · ash_tuning.csv)

KeyMặc địnhBiên an toàn
slot_inner_count · slot_outer_count · slot_outer_r8 · 12 · 546–10 · 8–16 · 38–70
token_cd_melee · token_cd_proj0.8 · 1.2 s0.4–1.5 · 0.8–2.0
heavy_tokens11 (đổi → DEC)
flow_cell_px · flow_hz16 · 108–24 · 5–20
leash_px · leash_s900 · 3canon
max_links_M/L/XL · link_decay2/2/3 · 0.71–3 · 0.5–0.9
rep_last · rep_pity_picks · rep_pity_mult0.35 · 8 · 3.00.2–0.6 · 6–12 · 2–4
psp_thr_on · psp_thr_off · psp_min_rooms0.60 · 0.45 · 2Bible (đổi → DEC)
meso_alpha0.15Bible
daily_seed_margin0.120.08–0.20
lunger_skew_deg_fresh · lunger_skew_deg_old · lunger_skew_age_s20 · 10 · 1.0/3.010–20 (Bible)
micro_on_s · micro_forget_s5 · 303–8 · Bible
spawn_shift_max · spawn_shift_step0.15 · 0.05≤ 0.15 (INV-15)
cap_M · cap_XL (gốc)0.20 · 0.35≤ Bible
macro_rank_w · macro_age_decay · macro_drop_age · macro_min_records1/.8/.6/.4/.2 · 0.9 · 20 · 2—
mercy_s · mercy_k10 · 0.5Bible · 0.3–1.0
struggle_hp · struggle_window_s · struggle_sleep_s0.40 · 20 · 200.3–0.6 · 10–30 · 10–30
feint_max_s0.35≤ 0.35 (INV-15)
telegraph_lead_s · ash_stagger_s1.0 · 0.6≥ 1.0 · Bible

19Quy tắc cho dev/AI

  • Mọi số AI/Tro Nhớ đọc từ ai_tuning.csv, ash_tuning.csv, ai_archetypes.csv, ash_counters.csv, enemy_attacks.csv; không hard-code id quái/đòn trong code (thay "thrall", "BS01_B1" của demo).
  • Mọi đòn địch có adaptive_source; đòn ASH bắt buộc có default trung tính và hàng CV trong ash_counters.csv. BASE chỉ đọc sự kiện đơn lẻ thấy trên màn; mọi trung bình trục (W20/MESO/MACRO, kể cả A04 TB) = ASH.
  • Mọi so ngưỡng/lề PSP (MICRO, MESO, CV, CHL/EM12, MACRO, Sẹo, DAILY, HUD, ACH) đi qua AshMemory.Threshold(hero, axis, dir, row) = on/off hiệu lực §7.3 (baseline hero_baseline); cấm so thẳng với thr_on.
  • Tinh Anh/mini/boss dùng ai = elite_utility (§2.2); quái thường không có trong §8.1 Roster = 0 hàng CV.
  • Brain không đọc input, buffer, cooldown, tài nguyên, HP, cấp, build của hero; quyết định đòn chỉ dùng snapshot hero ≥ 0.25 s tuổi; PSP chỉ qua AshMemory.Read() (≥ 0.5 s tuổi).
  • Trọng số Tro Nhớ chỉ qua công thức §6.3 (TVD + λ + Y-floor); cấm nhân thẳng trọng số ngoài hàm này.
  • Thế đáp chỉ dùng 4 effect_type + whitelist §12.2; mọi hàng chạy ash_lint + fairness_lint trước merge; trượt = chặn merge.
  • Mỗi kẻ địch ≤ 1 CV ASH bật (CV BASE ngoài trần + ngoài ngân sách, Q20); ngân sách Hồi §11.3; đổi CV chỉ ở REST, không khi Vỡ Thế.
  • Mọi bật/đổi CV phát đủ gói báo (khựng 0.6 s, ◆, callout/bark, SFX) và hiệu lực sau ≥ 60 tick.
  • Không trí nhớ/danh tính trên quái thường, Tinh Anh, mini; Sẹo chỉ BS_B1–BS_B4; không thăng cấp kẻ địch.
  • Token: dùng Tokens.Request/Release; trần ở §4.1 không đổi bởi Khăn Tang/Ấn/mutator/Tro Nhớ.
  • Roll AI qua rng_ai (seed run); DAILY tất định theo seed.
  • AI ngoài r200 tick 10 Hz nhưng windup/strike luôn tick 60 Hz; flow field 1 trường chung (+ 1 trường "rộng" cho L/XL), job Burst.
  • Thêm archetype/tầng/trục/effect_type mới = mục DEC- + sửa Bible/JSON.

20Quyết định đã chốt

QQuyết địnhLý do
Q1 Id thế đáp2026-11-07 — <ownerId>_CV1/_CV2 làm khoá hàng thế đáp (Bible §8.2 có schema hàng nhưng chưa có id); biến thể đòn dùng <ownerId>_Ann + variant_ofcần khoá chính cho CSV/codex/telemetry; không thêm loại thực thể, chỉ khoá cho hàng đã có
Q2 Đo "dịch trọng số"TVD ½Σ|q−p| trên phân phối pha, kẹp tuyến tính λđo chính xác, kẹp đúng trần 20/35/50%, dễ lint
Q3 "≥ 50% đòn ĐÁP được"đếm theo NHỊP (Y×n = n) cả ở kit lẫn runtime y(q)BS_B1 P1 canon chỉ đạt khi đếm nhịp (3 Y / 5 nhịp); đếm theo đòn sẽ làm canon trượt
Q4 Trần mini-boss2026-11-07 — L dùng trần Tinh Anh 0.20/0.25/0.30Bible chỉ ghi Elite/Boss; chọn mức chặt hơn = an toàn INV-15
Q5 Token HEAVY2026-11-07 — ≤ 1 windup M/L/XL nhắm hero cùng lúc [ASSUMED]HUNT 2 Tinh Anh, MRN10, MRN14 có thể chồng đòn nặng; chặt hơn INV-08, không phá
Q6 ash_level 0–30 tắt · 1 MICRO · 2 +MESO · 3 +MACRO; mercy/Mặt Nạ Vô Danh trừ 1 cấpBible dùng "cấp 0–3", "cấp −1" nhưng chưa định nghĩa; khớp BOSS_RUSH "chỉ MICRO"
Q7 Ngân sách theo Hồiđếm CV ASH bật ĐỒNG THỜI (I 1 · II 2 · III–IV 3); CV BASE không tính (Q20)"bật/Hồi" đọc là trần đồng thời; dịch spawn MESO không tính (không phải thế đáp)
Q8 PSP ghi khi tắtluôn ghi trong run; chỉ STANDARD/ENDLESS lưu vào hồ sơ; chỉ ĐỌC bị công tắc chặnrun 4 có lịch sử; không đổi công bằng
Q9 MESO lưu xuyên runEMA theo hero lưu trong hồ sơ tài khoản; tắt nhớ → khởi đầu từ phòng đầu mỗi runBible: hồ sơ phía người chơi; α 0.15 quá chậm nếu reset mỗi run
Q10 Suy giảm Sổ Thùtrọng số hạng 1/.8/.6/.4/.2 × 0.9^age_runs, bỏ khi > 20 run [ASSUMED]"5 trận gần nhất" + nhớ phai khi lâu không gặp
Q11 Sẹo theo tài khoảnSẹo áp mọi hero; Sổ Thù theo heroSẹo = thử thách người chơi tự khắc lên chuông boss (lore doc 20), không phải hồ sơ lối chơi
Q12 Nhịp lừachỉ "giữ" ≤ 0.35 s giữa glint 1–2; cấm huỷ windup giả (trừ MB_B4_2 canon); quota ≤ 1/chuỗi áp cả BASEđọc được: ĐÁP neo vào glint 2 không đổi
Q13 Rubber-bandchỉ giảm thích nghi (HP < 25%, mất 40% HP/20 s, 2 thua liên tiếp, Lửa Gửi); không tăng khi thắng dễđộ khó tăng chỉ qua Khăn Tang (Bible §4)
Q14 Tắt nhớ xuyên runkhông khoá thành tựu/leaderboardchỉ bớt độ khó MACRO/Sẹo; Thương Xót mới khoá
Q15 Chọn CVở mốc biết trước (đầu phòng/trận, 50% HP Tinh Anh, đổi pha)biến "dụ Tro" thành kỹ năng (ACH_trick_the_ash)
Q16 Ngưỡng PSP theo baseline hero2026-11-07 — on = thr_on + max(0, b − n) (LOW đối xứng), gap tắt giữ 0.15; b = psp_axes.json hero_baseline (sim 5 run/kit [ASSUMED] → refit trung vị telemetry); áp MESO/MICRO ASH/MACRO/CHL/DAILY/HUD/ACHngưỡng tuyệt đối làm H07 (A02), H02/H05/H10/H11 (A05), H07/H08/H09 (A06) bị gán cùng CV mỗi run = đọc hero chứ không đọc lối chơi, không dụ được (§11.5), rủi ro KPI P7 ≤ 15%; hero trung tính giữ đúng số Bible 0.60/0.45, baseline chỉ làm chặt hơn
Q17 EN_B1_02 góc vồ2026-11-07 — giữ BASE (Bible §8 ghi BASE) nhưng chỉ đọc cú Lướt CUỐI thấy trên màn (≥ 0.25 s tuổi, 20° ≤ 1.0 s, 10° ≤ 3.0 s, sau đó 0°), không đọc A04 trung bình; không thêm hàng ASHA04 trung bình = thống kê ẩn, BASE luôn bật sẽ lách mọi công tắc INV-15; Bible định nghĩa BASE = "điểm Lướt vừa qua" → sự kiện đơn lẻ hợp canon, không cần tách
Q18 Archetype Tinh Anh2026-11-07 — thêm elite_utility (engage = r_pref, HEAVY + token theo đòn, không vòng vây) cho mọi M/L/XLthiếu hàng làm ai_archetypes.csv không có khoá cho EL_/MB_/BS_; không phải rig mới (Bible §7.7 không áp)
Q19 Phạm vi MICROchỉ 4 quái thường canon có hàng MICRO; quái thường khác 0 CVBible §10.1 ngân sách 42 biến thể = 21 chủ M/L/XL × 2 (BS_TRUE chỉ BASE, DEC-2026-11-07-13)
Q20 CV BASE ngoài trần2026-11-07 — CV BASE (budget_cost 0) là phản ứng kit, không tính vào trần ≤ 1 bật (§8.3, §11) và ngân sách Hồi (§11.3); trần ≤ 1 chỉ áp giữa CV ASHEL_B2_02, EL_B3_02, EL_B4_01, EL_B4_02 có 1 CV BASE (§0: luôn bật) + 1 CV ASH; tính BASE vào trần thì CV ASH không bao giờ bật được, hoặc BASE thôi "luôn bật" → mâu thuẫn §0; BASE chỉ đọc trạng thái thấy nên không phải "đọc lén", Bible §8.2 "≤ 1 bật" hiểu là thế đáp ASH
Q21 Link ngoài pha2026-11-07 - link tới đòn ngoài phase_mask bị bỏ qua (BS_B1 A01→A08, A13→A02, A08→A02 chỉ chạy ở P2); đích đang hồi cũng bỏ qua; hết đích hợp lệ → chuỗi dừng, về REST (§6.4)dữ liệu boss giữ link chéo pha; thiếu luật thì runtime có thể bật đòn ngoài pha, phá §6.6