1Tổng quan
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ới11-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 quaai_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ạng | S thường · M Tinh Anh · L mini-boss · XL boss (mass_class, Bible §5.2) |
BASE | phả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 |
| PSP | Player 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 L | cấp Tro Nhớ 0–3 (§10); L_eff = cấp hiệu lực sau trừ |
| Mắt Tro | HUD 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ẹo | CV 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) |
| Token | quyề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_on_s = 5micro_forget_s = 30micro_forget_margin = 0.15micro_margin_scale = 0.25micro_resample_s = 0.25micro_step_s = 2psp_thr_on = 0.6psp_thr_off = 0.45psp_min_rooms = 2meso_alpha = 0.15w10_bins = 0.25/40w20_bins = 0.25/80spawn_shift_max = 0.15spawn_shift_step = 0.05macro_rank_w = 1/0.8/0.6/0.4/0.2macro_age_decay = 0.9macro_drop_age = 20macro_min_records = 2ledger_ring = 5ledger_min_fight_s = 20macro_card_s = 2.5scar_max = 2scar_soul_ash_bonus = 20scar_fade_runs = 3scar_fade_wins = 5scar_cleanse_cost = 2001.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_aitá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 đọc | Tuổi tối thiểu |
|---|---|---|
| Vị trí, vận tốc, hướng mặt hero | có | 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 hero | khô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)
| File | Khoá | Cột chính |
|---|---|---|
data/ai_archetypes.csv | ai | engage_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.csv | cv_id | hợp đồng §12 |
data/ash_spawn_shift.csv | axis+dir | vai khắc chế theo trục (§8.2) |
data/psp_axes.json → hero_baseline | Hxx → 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.csv | key | núm §16 |
save/ash_profile_<steamId>.json | hero | PSP 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)
| AI | Tầm vào | Vòng ô | Token | Tiếp cận | Đặc biệt |
|---|---|---|---|---|---|
swarm_melee | 4 | inner | MELEE | reach_plus | engage = tầm đòn + 4 px; vào ô vòng trong; gói 6–12 đi cụm (cohesion r48) |
lunger | 50/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_kiter | 150/210 | — | PROJ | — | giữ cự ly, bắn khi có đường bắn (14 §3.3); FLEE < 60 px 1.2 s |
ranged_lead | 160/240 | — | PROJ | — | ngắm đón đầu aim = pos + v̄(1.0 s) × t_bay, lệch ≤ 60 px (BASE); keep [ASSUMED] |
shield_bearer | 0 | — | MELEE | reach_plus | engage = tầm đòn; xoay khiên về hero 90°/s; EN_B4_01 xoay theo hướng đòn cuối nhận |
bomber_self | 40 | — | P_FLOOR | — | lao thẳng 1.0× tốc; nổ P r48 (token P sàn) |
ambusher | 60 | — | MELEE, P_FLOOR | — | SPECIAL ẩn (mờ/lặn) tới khi trong 60–90 px rồi hiện + đánh; tell 100% |
stationary | 220 | — | P_FLOOR | — | không đi; đòn đường thẳng P |
flyer_swarm | 30 | — | MELEE | — | bay qua vật cao; rắc vùng N (không token); chích Y |
spawner_mobile | 180/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_aura | 80/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 |
roller | 260 | — | MELEE | — | lăn theo đường thẳng tới điểm hero lúc khoá (60% windup); Y lao |
thrower | 120/180 | — | P_FLOOR | — | ném vòng cầu bom P; [ASH] mìn (14 §13 VD1) |
charger | 120/200 | — | MELEE | — | húc thẳng (Y lao); đâm tường → tự choáng 1.5 s |
grappler | 40/110 | — | MELEE | — | cưa lướt / kìm kéo |
retaliator | 0 | — | MELEE, P_FLOOR | reach_plus | engage = tầm đòn; bị đánh sau lưng → Bắn Gai P vòng (windup 0.45 s) |
diver | 160/220 | — | MELEE, P_FLOOR | — | trên không; bổ nhào/lao bom theo đường khoá ở 60% windup |
cone_breather | 60/100 | — | MELEE | — | Y×3 phụt nón, khe 0.35 s |
tether_pair | 0 | — | 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) |
reformer | 140/200 | — | PROJ | — | sau 2 loạt: vỡ → tụ lại cách 120–160 px (ấn 0.8 s, không đánh) |
drifter | 120 | — | P_FLOOR | — | trôi chậm về hero, Nuốt P vùng tròn |
echo | 0 | — | MELEE | reach_plus | engage = tầm đòn; bóng hero (chỉ BS_TRUE P3) |
2.1 Trạng thái
| State | Vào khi | Làm gì | Ra khi |
|---|---|---|---|
SPAWN | sinh | ấ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 r90 | hết 0.6 s → APPROACH |
APPROACH | mặ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 |
ENGAGE | trong tầm | giữ ô, đ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 |
ORBIT | khô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 token | giữ 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]) |
STAGGER | bị ĐÁP | choáng 1.0 s (canon demo; EN_B1_04 1.5 s) | → ENGAGE |
FLINCH | trúng cú ≥ LIGHT | 0.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_dist | chạy ngược 1.2 s (canon EN_B1_03: < 60 px) | → REPOSITION |
SPECIAL | theo archetype | lặn/hiện/tụ lại/tụng/đẻ (bảng §2.2) | theo archetype |
AIRBORNE | bị hất tung | 0.40 s, không đánh (doc 10 §4.3) | → ENGAGE |
LEASH | xa > 900 px 3 s | biến mất, tái sinh phía trước hướng chạy của hero ngoài màn (canon) | → SPAWN |
DYING | HP 0 | anim 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
WINDUPnhắm hero (doc 11 §5.3).
2.2 Archetype (ai, code enum; tham số ở ai_archetypes.csv)
ai | engage | Hành vi riêng (BASE) | Token |
|---|---|---|---|
| swarm_melee | tầm đòn + 4 px | vào ô vòng trong; gói 6–12 đi cụm (cohesion r48) | MELEE |
lunger | 50–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ạt | MELEE |
| ranged_kiter | keep 150–210 | giữ cự ly, bắn khi có đường bắn (§3.3); FLEE < 60 px 1.2 s | PROJ |
| ranged_lead | keep 160–240 [ASSUMED] | ngắm đón đầu: aim = pos + v̄(1.0 s) × t_bay, lệch ≤ 60 px (BASE) | PROJ |
| shield_bearer | tầm đòn | xoay khiên về hero 90°/s; EN_B4_01 xoay theo hướng đòn cuối nhận | MELEE |
| bomber_self | 40 px | lao thẳng 1.0× tốc; nổ P r48 (token P sàn) | P_FLOOR |
ambusher | 60 px | SPECIAL ẩn (mờ/lặn) tới khi trong 60–90 px rồi hiện + đánh; tell 100% | MELEE / P_FLOOR |
stationary | 220 px | không đi; đòn đường thẳng P | P_FLOOR |
| flyer_swarm | 30 px | bay qua vật cao; rắc vùng N (không token); chích Y | MELEE |
| spawner_mobile | — | giữ 180–260 px, thả 4 quái/6 s ngoài r90 (EN_B2_07) | MELEE (Mái Chèo) |
| support_aura | 80–140 px sau bầy | đứng sau quái S gần nhất so với hero (khoảng 40 px), aura | MELEE |
roller | 260 px | lăn theo đường thẳng tới điểm hero lúc khoá (60% windup) | MELEE (Y lao) |
thrower | keep 120–180 | ném vòng cầu bom P; [ASH] mìn (§13 VD1) | P_FLOOR |
charger | 120–200 px | húc thẳng; đâm tường → tự choáng 1.5 s | MELEE (Y lao) |
grappler | 40–110 px | cưa lướt / kìm kéo | MELEE |
retaliator | tầm đòn | bị đánh sau lưng → Bắn Gai P vòng (windup 0.45 s) | MELEE / P_FLOOR |
diver | 160–220 px trên không | bổ nhào/lao bom theo đường khoá ở 60% windup | MELEE / P_FLOOR |
| cone_breather | 60–100 px | Y×3 phụt nón, khe 0.35 s | MELEE |
| tether_pair | — | 2 chiếc giữ cách nhau 90–150 px, căng xích P giữa 2 chiếc | P_FLOOR |
reformer | keep 140–200 | sau 2 loạt: vỡ → tụ lại cách 120–160 px (ấn 0.8 s, không đánh) | PROJ |
drifter | 120 px | trôi chậm về hero, Nuốt P vùng tròn | P_FLOOR |
echo | tầm đòn | bóng hero (chỉ BS_TRUE P3) | MELEE |
elite_utility | r_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.2 | HEAVY + token theo đòn (MELEE/PROJ/P_FLOOR của từng _Ann) |
- Hàng
ai_archetypes.csvcủaelite_utility: engage_range =-1(đọcr_prefruntime) · slot_ring 0 · keep_min/keep_max/flee_* rỗng · token_kindHEAVY+ATTACK· approach_modeutility· special rỗng.
2.3 Gán archetype cho roster thường (Bible §7.2)
| Biome | 01 | 02 | 03 | 04 | 05 | 06 | 07 |
|---|---|---|---|---|---|---|---|
| B1 | swarm_melee | lunger | ranged_kiter | shield_bearer | bomber_self | ranged_lead | ambusher |
| B2 | swarm_melee | lunger (cung nhảy) | ranged_kiter (destructible) | stationary | flyer_swarm | ambusher (lặn) | spawner_mobile |
| B3 | swarm_melee | support_aura | roller | thrower | charger | grappler | retaliator |
| B4 | shield_bearer | diver | diver (bom P) | cone_breather | tether_pair | reformer | support_aura |
| B6 | EN_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 trong | 8 ô, 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_maxcủ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
| Token | Trần | Ai giữ | Giữ từ → tới |
|---|---|---|---|
MELEE | 4; 2 khi có M/L/XL đang windup nhắm hero; 0 trong 0.6 s cuối windup P của boss | quái S | đầu WINDUP → hết STRIKE |
PROJ | 3 loạt nhắm hero (gồm triệu hồi boss); ≤ 12 đạn địch trên màn | S + đạ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_FLOOR | 3 tell P sàn từ quái S | quái S | đầu windup → hết active |
P_TOTAL | 5 (gồm hazard, Ấn, mutator, Khăn Tang, P của M/L/XL) | mọi nguồn P | như 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úc | M, L, XL | đầu WINDUP → hết STRIKE của đòn (cả chuỗi giữ token, khe chuỗi không trả) |
OBJECTIVE | 6 windup nhắm mục tiêu VIGIL/vật cần bảo vệ | quái S | như MELEE; không tính vào MELEE |
- M/L/XL không giữ
MELEE/P_FLOORcủa quái S (canon), trừ EM16 Thề Thù chiếm 1/4MELEEcho đà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 1HEAVY(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ú |
|---|---|---|
| Hero | 10 | mặc định mọi hạng |
Mồi nhử hero có cờ taunt | 12 (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_attacker | Director gắn cờ cho 40% spawn VIGIL [ASSUMED] |
| Tường/hố hero dựng | 0 (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ặn | vậ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ợp | Dijkstra từ ô hero (+ ô mục tiêu VIGIL), job Burst, 10 Hz + ngay khi ô chặn đổi (Bible §10.4) |
| Hướng đi | gradient 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ẹt | dị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
| State | Luật |
|---|---|
SPAWN | Tinh Anh/triệu hồi: xoáy trung tính 1.0 s (INV-14); boss: intro + khoá cổng sân |
DECIDE | mỗ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 |
MOVE | tiế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) |
STALK | chờ HEAVY: vòng 90–140 px, 50% tốc, mặt hướng hero |
WINDUP/STRIKE/RECOVER | như §2.1; sàn windup 0.45 s Y (M/L/XL), P 0.45 (M) / 0.60 (L/XL) (doc 11 §1.2) |
LINK | khe chuỗi giữa 2 đòn: gap ∈ [gap_min, gap_max], gap_min ≥ 0.35 s |
REST | sau chuỗi: rest_s theo pha (BS_B1 canon 0.8 / 0.5 / 0.4; Tinh Anh 1.0) |
BROKEN | Vỡ Thế (doc 10 §4.1): huỷ windup, trả HEAVY; không đổi thế đáp, không bắt đầu P mới |
PHASE | qua 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ọiG_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 →
mtừ 1 hàng. Sẹo thứ 2 không chồng (§9.4).
6.4 Đồ thị đòn & chuỗi động
| Field link | Nghĩa |
|---|---|
to | đòn kế (id) |
p | xác suất nối gốc |
gap_min, gap_max | khe (s); gap_min ≥ 0.35 (INV-03); Y→P: P vẫn đủ windup sàn của chính nó |
cond | r_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àop_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ạng | max_links | Đòn/chuỗi tối đa |
|---|---|---|
| M Tinh Anh | 2 | 3 |
| L mini-boss | 2 | 3 |
| XL boss | 3 | 4 |
- Đò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, posehold+ SFXSFX_<ownerId>_feintriê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ật | Giá trị |
|---|---|
| Vừa dùng đòn a | K_a = 0.35 |
| a dùng ở cả 2 lần chọn gần nhất | K_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 signature | theo lịch riêng (cooldown), không bị K giảm |
| Chuỗi | khô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_masktrên mỗi đòn; ngưỡng HP pha ở doc boss (canon BS_B1: < 50% P2, < 25% P3). Trọng số gốcweight_p1..p3riê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 | Khoá | Đo | Khoảng | Cửa sổ | Hướng | Thói quen hiển thị |
|---|---|---|---|---|---|---|
| Pha phòng thủ A01 | DEF_MIX | mỗ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ánh | 0/1 | W20, MESO, MACRO | HIGH, LOW | HIGH 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 A02 | RANGE | mỗ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.40 | 0/1 | W20, MESO, MACRO | HIGH, LOW | HIGH: đánh xa Tinh Anh · LOW: áp sát |
| Tần suất Lướt A03 | EVADE_RATE | Lướ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.40 | 0/1 | W20, MESO, MACRO | HIGH, LOW | HIGH: Lướt liên tục · LOW: ít Lướt |
| Phía Lướt A04 | EVADE_SIDE | Lướ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/1 | W10, W20, MESO, MACRO | LEFT, RIGHT, SIDE | LEFT: 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 A05 | AOE_SHARE | sá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.40 | 0/1 | W20, MESO, MACRO | HIGH, LOW | HIGH: gom cụm diệt AoE · LOW: đánh đơn mục tiêu |
| Tỉ phần đạn/ném A06 | PROJ_SHARE | 0.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.30 | 0/1 | W20, MESO, MACRO | HIGH, LOW | HIGH: dựa vào đạn/ném · LOW: không dùng đạn |
| Bấm dồn A07 | MASH | input Đá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.40 | 0/1 | W20, MESO, MACRO | HIGH, LOW | HIGH: bấm dồn khi địch windup · LOW: chờ tell |
| Núp vật cao A08 | COVER | % 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.20 | 0/1 | W20, MESO, MACRO | HIGH, LOW | HIGH: núp vật cao · LOW: đứng giữa sân |
| Ô sân quen A09 | ZONE_HEAT | lướ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.0625 | 0/1 | W10, MESO, MACRO | HIGH | HIGH: đứng một chỗ (1 ô sân chiếm phần lớn 10 s) |
| Ưu tiên mục tiêu A10 | PRIORITY | quá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.50 | 0/1 | W20, MESO, MACRO | HIGH, LOW | HIGH: 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ế A11 | BURST | mỗ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.50 | 0/1 | W20, MESO, MACRO | HIGH, LOW | HIGH: dồn kỹ năng/ult khi Vỡ Thế · LOW: giữ kỹ năng |
| Độ chính xác A12 | PRECISION | (ĐÁ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.40 | 0/1 | W20, MESO, MACRO | HIGH, LOW | HIGH: ĐÁP/Né chuẩn · LOW: ĐÁP/Né hụt nhiều |
7.1 Kho & cửa sổ
| Kho | Cửa sổ | Cập nhật | Dùng cho |
|---|---|---|---|
W10 | 10 s trượt, thùng 0.25 s × 40 | mỗi tick | BASE (≤ 10 s, chỉ sự kiện trên màn) |
W20 | 20 s trượt, thùng 0.25 s × 80 | mỗi tick | MICRO, đổi CV Tinh Anh giữa trận, HUD "Tro đang nhớ" |
ROOM | 1 phòng chiến (CMB/CHL/RSC/ELT/MBS/BOS) | cuối phòng | giá trị x_room vào EMA |
MESO | EMA α 0.15/phòng | cuối phòng | CV Tinh Anh/mini/boss, dịch spawn |
FIGHT | 1 trận boss Hồi (vào sân → thắng/chết) | cuối trận | Sổ 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ục | Sự kiện đếm | Giá trị thô | Chuẩn hoá 0–1 | Mẫu tối thiểu W20 / ROOM | Mặc định trung tính |
|---|---|---|---|---|---|
| A01 DEF_MIX | mỗ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ính | sẵn 0–1 mỗi nhánh; trục con A01.DEFLECT… | 6 / 10 | 0.33 mỗi nhánh |
| A02 RANGE | mỗ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 | clamp((d̄ − 40)/160, 0, 1) (40 px → 0; 200 px → 1) | 8 / 15 cú | 0.40 |
| A03 EVADE_RATE | Lướ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 tranh | clamp(rate/30, 0, 1) | 10 s giao tranh / 20 s | 0.40 |
| A04 EVADE_SIDE | Lướt bắt đầu ≤ 1.0 s trước va chạm của 1 đòn nhắm hero | s = 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 / 10 | 0 |
| A05 AOE_SHARE | sát thương hero gây | phần sát thương từ instance hitbox trúng ≥ 3 mục tiêu | sẵn 0–1 | 30 cú / 60 cú | 0.40 |
| A06 PROJ_SHARE | sát thương hero gây + đạn địch Y tới hero | 0.5·dmg_proj_share + 0.5·(đạn bị ĐÁP / đạn tới); không có đạn địch → chỉ vế 1 | sẵn 0–1 | 30 cú / 60 cú; ≥ 4 đạn cho vế 2 | 0.30 |
| A07 MASH | input Đá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 trong thời gian đó | clamp(rate/8, 0, 1) | 3 s windup / 6 s | 0.40 |
| A08 COVER | thời gian giao tranh | % thời gian tâm hero ≤ 24 px từ mép vật cao | sẵn 0–1; phòng không vật cao → không cập nhật | 10 s / 20 s | 0.20 |
| A09 ZONE_HEAT | vị trí hero mỗi tick | lướ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èm | luôn có (BASE, W10) | 0.0625 |
| A10 PRIORITY | quá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) | clamp((15 − t̄)/12, 0, 1) (≤ 3 s → 1; ≥ 15 s → 0) | 2 / 4 quái | 0.50 |
| A11 BURST | mỗ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_events | 1 / 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–1 | 6 / 10 lần thử | 0.40 |
- A01 hiển thị "Gạt 72%" =
A01.DEFLECT0.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 ghiHOLDkhi 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 định | Ghi 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.2 | giá 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ật | n = 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 đạt | thr_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ắt | HIGH/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 H | kit cố định trục → không có thói quen để đọc |
| Bật MESO | MESO ≥ on trong ≥ 2 phòng liền (MESO sau mỗi phòng) | Bible §8.2 (b ≤ 0.40 → đúng 0.60) |
| Tắt MESO | MESO qua off (HIGH: < off; LOW: > off) | trễ chống rung |
| Bật MICRO | W20 qua on của hàng CV liên tục ≥ 5 s + đủ mẫu | — |
| Quên MICRO | W20 qua off liên tục 30 s | Bible "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ụng | MESO (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_ash | BASE 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 |
|---|---|---|
| H07 | A02 0.85 · A06 0.70 | cung tầm xa, đạn |
| H06 | A02 0.05 | găng, đấm/vật áp sát |
| H02 · H05 · H10 · H11 | A05 0.65 | kit AoE (quét/xoay/vùng) |
| H08 · H09 | A06 0.70 | kit đạ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.40y 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ạchoff/onhiệ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ồidùng/trần,L_base → L_eff+ lý do trừ (mercy, Mặt Nạ Vô Danh, công tắc). - Ghi file
ash_debug.csvmỗi phòng khi bật cờ devash_trace(§16).
10Tầng MICRO & MESO
📊 Dịch spawn theo trục
| Trục | Hướng | Vai khắc chế | Ghi chú |
|---|---|---|---|
| Cự ly đánh A02 | HIGH | lunge, grapple, dive_bomb | đánh xa Tinh Anh → vồ/lao · kéo/cưa · bổ nhào bom |
| Cự ly đánh A02 | LOW | self_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 A05 | HIGH | shield, ranged, flyer_slow, reform | gom 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 A06 | HIGH | shield, ambush, flyer_slow | đạn/ném → khiên · phục kích/ẩn · bay/làm chậm |
| Núp vật cao A08 | HIGH | bomber, dive_bomb, roller | núp vật cao → ném bom/mìn · bổ nhào bom · lăn theo đường |
| Tần suất Lướt A03 | HIGH | tether, flyer_slow, turret | Lướ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 A10 | LOW | support, ranged, lead_shot | bỏ 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 vi | mỗ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ồn | BASE (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ì) |
| Roster | chỉ 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ên | windup/đò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ắt | tham 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ện | L_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ục | trục spawn có lề lớn nhất trong bảng dưới; hoà → thứ tự bảng |
| Độ dịch | s = 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ịch | chuyể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ưởng | XP + 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ồi | KHÔ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 quen | Vai khắc (Bible §7.2) |
|---|---|---|
| A02 HIGH | đánh xa Tinh Anh | vồ/lao · kéo/cưa · bổ nhào bom |
| A02 LOW | áp sát | tự nổ · ném bom/mìn · phản đòn sau lưng |
| A05 HIGH | gom cụm diệt AoE | khiên · đánh xa/ném · bay/làm chậm · trụ tái tụ (tản + giáp) |
| A06 HIGH | đạn/ném | khiên · phục kích/ẩn · bay/làm chậm |
| A08 HIGH | núp vật cao | ném bom/mìn · bổ nhào bom · lăn theo đường |
| A03 HIGH | Lướt liên tục | dây nối · bay/làm chậm · trụ đứng yên |
| A10 LOW | bỏ 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 |
|---|---|
| Kit | mỗ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ần | CV 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ên | CV 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 đổi | khi 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ẵn | như CHL; tính ngân sách; mọi công tắc INV-15 tắt → Ấn trống |
| MRN14 Kẻ Truy Tang | Tinh 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 | Đọc | Mặc định khi tắt |
|---|---|---|---|
| BS_B3 P1 Rèn Phản | bú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 định | búa → xích → giáo (Bible #41) |
| EL_B4_03 điểm dừng chuỗi | dừng 1 đòn trước chuỗi ĐÁP TB của hero (§13 VD4) | W20 | dừ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 += 1cho 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ước | Luậ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 |
| 2 | Lề 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 |
| 3 | Bá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 tay | 2 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ực | Sẹ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ột | ST_LEDGER Bàn Thờ Ký Ức: 200 CUR_SOUL_ASH (UP_TEST_BELL_4: 150) |
| Cấm | khô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âu | chỉ nâng trần TVD (§11.2); không đổi số bản ghi, suy giảm, ngưỡng |
| MRN13 Tro Thức Sớm | mốc bật 60 → 30 s; boss luôn sau mốc → không đổi MACRO |
| Độ Tang khác | khô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ù) |
| DAILY | hồ sơ seed cố định (§10.2), không đọc/ghi Sổ Thù, không Sẹo |
| BOSS_RUSH | chỉ 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ẮT | khô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 boss | kit_version khác → bỏ active_cv lạ, giữ axes |
| Cổng pháp lý (FTO) trượt | MACRO + 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
| L | Tầng đọc PSP | Nhịp lừa ASH | Dùng ở |
|---|---|---|---|
| 0 | không (mọi đòn ASH = mặc định trung tính; BASE vẫn chạy) | không | Thương Xót "Tro Nhớ 0", CUSTOM 0, 3 run đầu đời, 60 s đầu run |
| 1 | MICRO | có (MICRO) | BOSS_RUSH (trần mode), CUSTOM 1 |
| 2 | MICRO + 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_effgiảm → CV thuộc tầng >L_effNGỦ ởRESTkế 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 > 1với H → thay bằng trục kế trong danh sách (vòng, theorng_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_aicủ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ật | Kiểm |
|---|---|---|
| F1 | Tell (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 CV | ash_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ịch | fairness_lint (doc 11) + guard §6.3 |
| F3 | Mỗ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 ra | ash_lint |
| F4 | Khô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ẵn | ash_lint: effect_type ∈ {WEIGHT_MULT, UNLOCK_ATTACK, PARAM_MOD, COMPOSITION_SHIFT}, param ∈ whitelist §12.2 |
| F5 | Mọi CV có cửa phạt dài hơn: recover của đòn đích + ≥ 0.15 s (Bible §8.5) | ash_lint |
| F6 | Bá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òng | runtime: effect_at ≥ telegraph_at + 60 tick |
| F7 | Phả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 |
| F8 | Nhịp lừa ≤ 1/chuỗi, ≤ 0.35 s, pose + SFX riêng, glint 2 đúng 7 tick trước va chạm | ash_lint + runtime đếm |
| F9 | Không đổi CV khi Vỡ Thế / giữa chuỗi; không bắt đầu P mới khi Vỡ Thế | runtime |
| F10 | Khô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ồi | review + 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ạng | Gốc | MRN04 bậc 1 | MRN04 bậc 2 |
|---|---|---|---|
| M Tinh Anh | 0.20 | 0.25 | 0.30 |
| L mini-boss | 0.20 (theo Tinh Anh) | 0.25 | 0.30 |
| XL boss (gồm BS_FINAL, BS_TRUE) | 0.35 | 0.42 | 0.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ồi | I | II | III | IV | Kết | Bí mật | ENDLESS |
|---|---|---|---|---|---|---|---|
| Ô CV bật cùng lúc (gồm EM12, đòn ASH, MICRO ASH, Sẹo, lựa chọn ASH) | 1 | 2 | 3 | 3 | 3 | 3 | theo Hồi của biome đang chạy |
- Mỗi kẻ địch ≤ 1 CV ASH bật (CV BASE
budget_cost0 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Ủ ở
RESTkế (báo mờ ◆).
11.4 Đỡ người chơi đang chật vật (rubber-band, chỉ có lợi)
| Kích hoạt | Hiệ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ó CV | CV đó 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ó CV | trậ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ót | Tro 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 (quaoffhiệ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ột | Kiểu / miền | Luật |
|---|---|---|
cv_id | <ownerId>_CV1 · _CV2 | MICRO: chỉ _CV1 (≤ 1/loại); M/L/XL: đúng 2 |
owner · tier | enemyId · S/M/L/XL | khớp Bible §7 |
layer | MICRO · MESO | MESO của boss Hồi được dùng làm thế mở màn MACRO + Sẹo |
adaptive_source | BASE · ASH | BASE 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 · dir | A01.DEFLECT/HOLD/DASH, A02–A12 · HIGH/LOW/LEFT/RIGHT/SIDE | SIDE = LEFT hoặc RIGHT theo on hiệu lực §7.3 (hướng lấy theo dấu) |
thr_on · thr_off | 0.30–0.85 · thr_on − 0.15 | mặ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_rooms | 0–3 | mặc định 2 (MESO); MICRO = 0 (dùng 5 s W20) |
effect_type | WEIGHT_MULT · UNLOCK_ATTACK · PARAM_MOD · COMPOSITION_SHIFT | COMPOSITION_SHIFT chỉ ở ash_spawn_shift.csv (§8.2) |
targets | id đòn <ownerId>_Ann | đòn có sẵn trong kit của chủ |
mult | A01:0.7|A03:2.0 | mỗ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.0 | biế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 · default | tên trong whitelist §12.2 | default = giá trị khi tắt (trung tính) |
phase_mask | 1/2/3 | đòn đích phải có trong pha |
answers | ≥ 2 trong {DEFLECT, DASH, EXIT, BREAK_OBJECT, POISE_BREAK} | F3 |
recover_add_s | ≥ 0.15 | cửa phạt dài hơn (F5) |
feint | 0/1 | 1 → tính quota nhịp lừa/chuỗi |
habit_key · hint_key · bark_key | khoá loc | callout "NÓ ĐÃ ĐỌC BẠN: <habit>" · mẹo codex/"Tro đã học" · bark ≤ 48 ký tự |
budget_cost | 1 | mọi hàng ASH; BASE = 0 |
scar_ok | 0/1 | 1 chỉ cho BS_B1–BS_B4 |
codex_key | khoá | mở trang ngay lần gặp đầu (Bible §8.4) |
12.2 Whitelist tham số PARAM_MOD / biến thể
param | Áp cho | Biên | Ghi chú |
|---|---|---|---|
aim_lead_px | đạn, lao, nhảy | 0–60 px | đón đầu theo v̄ 1.0 s |
aim_offset_px | vùng P / điểm nhảy | 0–32 px, hướng theo trục | kích thước vùng không đổi |
angle_offset_deg | vồ, quét, nón | 0–20° | |
windup_hold_s | đòn Y/P | 0–0.35 s, chèn giữa glint 1 và glint 2 | feint = 1; pose hold + SFX_<ownerId>_feint |
chain_stop | đòn Y×n có nhánh dừng | ≥ nhịp 3 | sau dừng = đòn kế viết sẵn (P có windup đủ) |
link_order | đồ thị đòn | hoán vị link có sẵn | không tạo link mới vi phạm gap_min |
extra_beat | đòn Y×n | +1 nhịp, khe ≥ 0.35 s | giữ F2 Y-floor |
step_px | M/L/XL đòn cận chiến | 0–48 px trước nhịp 1, trong windup | hitbox giữ nguyên |
payload | vật ném | đổi dạng cùng tell lớp, cùng sát thương, cùng bán kính | vd bom → mìn |
weapon_pick · shadow_order | BS_B3 · BS_FINAL | danh sách canon | lựa chọn ASH §8.3 |
recover_add_s | mọi | +0.15–+0.50 s | bắ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)
VD1 — Thường, MICRO ASH, PARAM_MOD: EN_B3_04_CV1 Phu Bom "bom → mìn"
| Field | Giá trị |
|---|---|
| axis · dir · thr | A06 · HIGH · on 0.40 / off 0.25 (Bible: A06 > 40%) |
| param | payload: tỉ lệ ném ra mìn, lo 0.50 · hi 1.00 · default 0 (bom) |
| Mìn | rơ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_add | EXIT (đ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"
| Field | Giá trị |
|---|---|
| axis · dir · thr | A12 · HIGH · 0.60 / 0.45 |
| param | windup_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_add | DEFLECT (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"
| Field | Giá trị |
|---|---|
| axis · dir | A01.DEFLECT · HIGH (0.60 / 0.45, 2 phòng) |
| mult | A01 Chặt Bổ ×0.7 · A03 Nện Mộ P ×2.0 |
| answers · recover_add | DASH (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"
| Field | Giá trị |
|---|---|
| axis | A01.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 |
| param | chain_stop = clamp(round(streak_avg) − 1, 3, 6) · default 5 (BASE canon) |
| Sau dừng | 1 đòn P viết sẵn, windup ≥ 0.45 s + vùng tím; recover P +0.20 s |
| answers | DASH 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"
| Field | Giá trị |
|---|---|
| axis · dir | A02 · HIGH |
| variant | Châ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 |
| answers | DEFLECT ×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ì"
| Field | Giá trị |
|---|---|
| axis · dir | A01.DEFLECT · HIGH · scar_ok 1 |
| variant | Chuô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 |
| answers | DEFLECT (đợ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_MODA03 Nhảy Chuôngaim_offset_px24 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
| Field | Giá trị |
|---|---|
| axis · dir | A08 COVER · HIGH (2 phòng) |
| Vai khắc trong B3 | né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/Tab | bả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 CV | kẻ đị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 boss | 2 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/mini | tag "◆ <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 — bestiary | mỗ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ện | Trườ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_off | cv_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_block | cv_id bị đẩy, ai giữ ô |
ash_spawn_shift | node, 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_fight | boss, kết quả, thời lượng, cv mở màn (MACRO/Sẹo/không), dmg_taken_per_min |
ash_death | 5 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_settings | memory on/off, ash_level CUSTOM, Thương Xót Tro Nhớ |
| KPI | Đích | Hà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 hero | max/min ≤ ×2 [ASSUMED] | như trên |
18Debug overlay & núm chỉnh
📊 Núm chỉnh (tuning.ai · tuning.ash)
| Núm | Giá trị | Đơn vị | Ghi chú |
|---|---|---|---|
perception_age_s | 0.25 | s | đọc anim/vị trí hero để chọn đòn (INV-15 phản xạ) |
perception_ring | 0.25/8 | s · ô | ring snapshot 0.25 s × 8 (2 s) |
spawn_mark_s | 0.6 | s | ấn tro (INV-14) |
spawn_no_windup_s | 0.8 | s | — |
engage_sway_px | 4 | px | đung đưa ±4 px |
orbit_wait_s | 0.5 | s | chờ > 0.5 s không token → ORBIT |
orbit_min | 38 | px | INV-08 |
orbit_max | 70 | px | — |
orbit_speed_mult | 0.3 | × | 30% tốc; sáng −10% |
strike_active_max_ticks | 8 | tick | Y cận chiến |
stagger_s | 1 | s | bị ĐÁP (EN_B1_04 1.5 s) |
flee_s | 1.2 | s | EN_B1_03 < 60 px |
slot_inner_count | 8 | ô | góc 45° |
slot_outer_count | 12 | ô | vòng chờ |
slot_outer_r | 54 | px | — |
slot_inner_reach_mult | 0.8 | × reach | r_in = 7 + radius + reach × 0.8 |
slot_assign_period | 0.25 | s | c = Δgóc/45 + dist/64 |
slot_keep_hysteresis | 0.3 | chi phí | giữ ô nếu c_cũ ≤ c_mới + 0.3 |
slot_front_cone | 90 | ° | ô trong nón ±90° điền trước |
ranged_spacing_px | 48 | px | cách nhau ≥ 48 px |
ranged_spacing_deg | 30 | ° | ≥ 30° góc nhìn |
swarm_cohesion_r | 48 | px | trọng số 0.3 |
swarm_cohesion_w | 0.3 | × | — |
swarm_split_n | 12 | quái | tách gói khi > 12 |
support_spacing_r | 100 | px | — |
swarm_lead_px | 24 | px | bầy đi trước support/ranged ≥ 24 px |
lof_period | 0.25 | s | — |
lof_shrink_px | 40 | px | không LOS 2.0 s → r_keep −40 |
lof_shrink_after_s | 2 | s | — |
low_prop_cost | 1.5 | × | vật thấp chi phí đi |
melee_tokens | 4 | token | INV-08 (demo) |
melee_tokens_duel | 2 | token | khi M/L/XL windup nhắm hero |
melee_tokens_boss_p | 0 | token | 0 trong 0.6 s cuối windup P boss |
melee_tokens_boss_p_window | 0.6 | s | — |
proj_tokens | 3 | loạt | INV-08 |
proj_hold_max_s | 2 | s | — |
p_floor_tokens | 3 | token | — |
p_total_tokens | 5 | token | — |
heavy_tokens | 1 | token | đổi → DEC |
objective_tokens | 6 | token | — |
token_cd_melee | 0.8 | s | — |
token_cd_proj | 1.2 | s | — |
token_prio | on_screen: 100, in_front: 50, wait_s: 20, wait_cap_s: 3, dist_px: −0.1, slot_inner: 10, front_dot: 0.3 | điểm | prio token |
p_escape_disc_r | 120 | px | P mới > 70% đĩa r120 → trì 0.3 s |
p_escape_pct | 70 | % | — |
p_escape_delay | 0.3 | s | trì 2 lần vẫn vượt → huỷ |
aggro_base | hero: 10, taunt_s: 12, taunt_m: 6, taunt_lxl: 0, objective: 14, structure: 0 | điểm | score = base − dist/100 |
aggro_hysteresis | 0.5 | điểm | — |
aggro_eval_s | 0.5 | s | — |
objective_attacker_pct | 40 | % | Director gắn cờ cho 40% spawn VIGIL |
vigil_brazier_hp | 300 | HP | lò canh VIGIL |
flow_cell_px | 16 | px | — |
flow_hz | 10 | Hz | — |
flow_cost | low_prop: 1.5, zone_n: 4, zone_p_windup: 8 | × | — |
flow_wide_hz | 5 | Hz | trường rộng L/XL |
seek_r | 48 | px | trong r48 lái thẳng tới ô |
stuck_px | 4 | px | dịch < 4 px trong 2 s |
stuck_s | 2 | s | — |
stuck_side_px | 32 | px | lệch ngang 1.0 s |
stuck_leash_s | 5 | s | — |
leash_px | 900 | px | canon 14 (15 §5.2 ghi 600 px — open issue) |
leash_s | 3 | s | canon |
move_max_s | 2 | s | MOVE ≤ 2.0 s rồi buộc chọn đòn |
stalk_r | 90/140 | px | 50% tốc |
stalk_speed_mult | 0.5 | × | — |
rest_elite_s | 1 | s | BS_B1 0.8/0.5/0.4 |
utility_attack_frac | 0.15 | × Σq | S ≥ 0.15 · Σ q → ATTACK |
range_falloff_px | 40 | px | R = max(0, 1 − dist_out/40) |
angle_out_mult | 0.5 | × | G ngoài angle_max |
behind_deg | 120 | ° | hero sau lưng > 120° → xoay |
summon_cd_min | 20 | s | đòn summon boss ≥ 20 s |
y_floor | 0.5 | tỉ lệ | y(q) ≥ 0.50; chia đôi λ ≤ 6 lần |
y_floor_halvings | 6 | lần | — |
max_links_m | 2 | link | — |
max_links_l | 2 | link | — |
max_links_xl | 3 | link | — |
link_decay | 0.7 | × | p × 0.7^(k−1) |
gap_beta | 2/3 | Beta(α,β) | gap = gap_min + (gap_max − gap_min) · u |
rep_last | 0.35 | K | — |
rep_pity_picks | 8 | lần | — |
rep_pity_mult | 3 | K | — |
rep_pity_q_min | 0.1 | q | đòn q ≥ 0.10 |
rep_pair_mult | 0.3 | × | cặp link lặp p × 0.3 |
mini_phases_max | 2 | pha | — |
| Núm | Giá trị | Đơn vị | Ghi chú |
|---|---|---|---|
psp_thr_on | 0.6 | v | đổi → DEC |
psp_thr_off | 0.45 | v | LOW: > 0.55 |
psp_min_rooms | 2 | phòng liền | Bible |
meso_alpha | 0.15 | α | EMA/phòng |
w10_bins | 0.25/40 | s · thùng | — |
w20_bins | 0.25/80 | s · thùng | — |
read_age_s | 0.5 | s | W20 bỏ 2 thùng mới nhất |
safe_view_margin_px | 16 | px | vùng an toàn 427×267 + 16 px |
micro_on_s | 5 | s | — |
micro_forget_s | 30 | s | Bible |
micro_forget_margin | 0.15 | v | < ngưỡng − 0.15 |
micro_margin_scale | 0.25 | m | param = lo + (hi − lo)·clamp(m/0.25) |
micro_resample_s | 0.25 | s | đổi ≤ 1 bước/2 s |
micro_step_s | 2 | s | — |
spawn_shift_max | 0.15 | ×B | INV-15 |
spawn_shift_step | 0.05 | ×B | s = 0.05 · round(3 · clamp(m/0.25)) |
cap_m | 0.2 | TVD | M gốc; L theo M |
cap_xl | 0.35 | TVD | XL gốc |
cap_tier_mrn04 | M: 0.2/0.25/0.3, L: 0.2/0.25/0.3, XL: 0.35/0.42/0.5 | TVD | gốc · MRN04 bậc 1 · bậc 2 |
cv_budget_act | I: 1, II: 2, III: 3, IV: 3, V: 3, VI: 3 | ô CV | ENDLESS theo Hồi biome |
macro_rank_w | 1/0.8/0.6/0.4/0.2 | w | mới → cũ |
macro_age_decay | 0.9 | ×/run | — |
macro_drop_age | 20 | run | — |
macro_min_records | 2 | bản ghi | — |
ledger_ring | 5 | trận | hero × boss Hồi |
ledger_min_fight_s | 20 | s | trận ≥ 20 s mới ghi |
macro_card_s | 2.5 | s | thẻ 'X nhớ' |
pain_dmg_norm | 60 | HP/phút | pain = 0.5 · loss_rate + 0.5 · clamp(dmg/60) |
scar_max | 2 | Sẹo/boss | — |
scar_soul_ash_bonus | 20 | %/Sẹo | — |
scar_fade_runs | 3 | run | 3 run không gặp boss → mờ |
scar_fade_wins | 5 | lần thắng | — |
scar_cleanse_cost | 200 | Tro Hồn | UP_TEST_BELL_4: 150 |
cv_kill_soul_ash_mult | 1.5 | × | +50% Tro Hồn boss khi CV bật |
unlock_run_s | 60 | s | L_eff = 0 khi run_time < 60 s (MRN13: 30 s) |
unlock_run_s_mrn13 | 30 | s | — |
unlock_lifetime_runs | 3 | run | — |
mercy_hp | 0.25 | HP% | HP < 25% → L_eff − 1 |
mercy_s | 10 | s | Bible |
mercy_k | 0.5 | × | — |
daily_seed_axis_v | 0.72 | v | 2 trục seed = 0.72 |
struggle_hp | 0.4 | HP% | — |
struggle_window_s | 20 | s | — |
struggle_sleep_s | 20 | s | — |
struggle_rearm_margin | 0.05 | m | — |
revive_sleep_s | 15 | s | Lửa Gửi: CV ngủ 15 s |
feint_max_s | 0.35 | s | INV-15 |
telegraph_lead_s | 1 | s | ≥ 1.0 |
ash_stagger_s | 0.6 | s | Bible |
callout_spawn_s | 2.5 | s | TRO DỒN BẦY |
reflex_min_s | 0.25 | s | F7 không phản ứng input < 0.25 s |
cv_recover_add_s | 0.15 | s | F5 recover + ≥ 0.15 s |
chl_cv_neg_margin | −0.2 | m | mọi lề < −0.20 → _CV1 |
trick_ach_min_fight_s | 20 | s | ACH_trick_the_ash |
16.1 Overlay (F3, chỉ build dev; phím debug gỡ khỏi bản phát hành — doc 01)
| Trang | Hiển thị |
|---|---|
| AI | nhã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 dev | ash.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)
| Key | Mặc định | Biên an toàn |
|---|---|---|
slot_inner_count · slot_outer_count · slot_outer_r | 8 · 12 · 54 | 6–10 · 8–16 · 38–70 |
token_cd_melee · token_cd_proj | 0.8 · 1.2 s | 0.4–1.5 · 0.8–2.0 |
heavy_tokens | 1 | 1 (đổi → DEC) |
flow_cell_px · flow_hz | 16 · 10 | 8–24 · 5–20 |
leash_px · leash_s | 900 · 3 | canon |
max_links_M/L/XL · link_decay | 2/2/3 · 0.7 | 1–3 · 0.5–0.9 |
rep_last · rep_pity_picks · rep_pity_mult | 0.35 · 8 · 3.0 | 0.2–0.6 · 6–12 · 2–4 |
psp_thr_on · psp_thr_off · psp_min_rooms | 0.60 · 0.45 · 2 | Bible (đổi → DEC) |
meso_alpha | 0.15 | Bible |
daily_seed_margin | 0.12 | 0.08–0.20 |
lunger_skew_deg_fresh · lunger_skew_deg_old · lunger_skew_age_s | 20 · 10 · 1.0/3.0 | 10–20 (Bible) |
micro_on_s · micro_forget_s | 5 · 30 | 3–8 · Bible |
spawn_shift_max · spawn_shift_step | 0.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_records | 1/.8/.6/.4/.2 · 0.9 · 20 · 2 | — |
mercy_s · mercy_k | 10 · 0.5 | Bible · 0.3–1.0 |
struggle_hp · struggle_window_s · struggle_sleep_s | 0.40 · 20 · 20 | 0.3–0.6 · 10–30 · 10–30 |
feint_max_s | 0.35 | ≤ 0.35 (INV-15) |
telegraph_lead_s · ash_stagger_s | 1.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ódefaulttrung tính và hàng CV trongash_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/offhiệu lực §7.3 (baselinehero_baseline); cấm so thẳng vớithr_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ạyash_lint+fairness_linttrướ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
| Q | Quyết định | Lý do |
|---|---|---|
| Q1 Id thế đáp | 2026-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_of | cầ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-boss | 2026-11-07 — L dùng trần Tinh Anh 0.20/0.25/0.30 | Bible chỉ ghi Elite/Boss; chọn mức chặt hơn = an toàn INV-15 |
Q5 Token HEAVY | 2026-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–3 | 0 tắt · 1 MICRO · 2 +MESO · 3 +MACRO; mercy/Mặt Nạ Vô Danh trừ 1 cấp | Bible 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ắt | luôn ghi trong run; chỉ STANDARD/ENDLESS lưu vào hồ sơ; chỉ ĐỌC bị công tắc chặn | run 4 có lịch sử; không đổi công bằng |
| Q9 MESO lưu xuyên run | EMA theo hero lưu trong hồ sơ tài khoản; tắt nhớ → khởi đầu từ phòng đầu mỗi run | Bible: 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ản | Sẹo áp mọi hero; Sổ Thù theo hero | Sẹ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ừa | chỉ "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-band | chỉ 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 run | không khoá thành tựu/leaderboard | chỉ 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 hero | 2026-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/ACH | ngưỡ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 ASH | A04 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 Anh | 2026-11-07 — thêm elite_utility (engage = r_pref, HEAVY + token theo đòn, không vòng vây) cho mọi M/L/XL | thiế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 MICRO | chỉ 4 quái thường canon có hàng MICRO; quái thường khác 0 CV | Bible §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ần | 2026-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 ASH | EL_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 pha | 2026-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 |