# WL813w5 Probe 2026-09-09 17:43:25 (edit mode · Play 0 · 로그인 0) playMode=False ── ⓪ 준비 [PASS] WLBossArenaSettings 로드 · Active=True [PASS] BossArena.Subscribed(CombatEvents) [PASS] 🔴 BossArena.RunSubscribed(RunEvents.RunEnded) — 813w5 신규 구독 ── ① 에셋 (Assets/WL/Combat/Settings/Resources/WL/WLBossArenaSettings.asset · 값 전부 SO = C45) 신규 8필드: parkBossOnRunEnd=True nextRunBossHoldSeconds=30 nextRunBossHoldRewarpMargin=1.5 nextRunWarpBeforeHeal=True nextRunClearsPlayerTarget=True leashOutsideRunDistanceOnly=True gateMinSeconds=60 gateMinAllowsZonesCleared=True [PASS] parkBossOnRunEnd=1 (런 종료 순간 고정) [PASS] nextRunBossHoldSeconds=30 (발주서 §1-2) [PASS] gateMinSeconds=60 (발주서 §1-2) [PASS] leashOutsideRunDistanceOnly=1 (런 밖 거리 판정만) [PASS] nextRunWarpBeforeHeal=1 (워프 → 만피 순서) 런 축 대조: runSeconds=270 openGateAtSec=170 zoneClearKills=[18,20] [PASS] gateMinSeconds(60) < openGateAtSec(170) — 시간제한 개방은 막지 않는다 [PASS] gateMinSeconds < runSeconds(270) — 런을 막지 않는다 [PASS] nextRunBossHoldSeconds < runSeconds [PASS] 0 < nextRunBossHoldRewarpMargin(1.5) < arenaRadius(20) ── ② 🔴 D-39 원인 ① 실측 — 「되돌림이 자기 호출 안에서 되돌려진다」 (원본 파일 직접 읽기) MobActor.cs:138 `On_Regen` · :142 그 안의 `Check_Battle();` MobActor.cs:343 `Check_Battle` · :347 `Get_EnemyActors(… f_BaseChaseRange)` MobActor.cs:324 🔴 `Change_MobStatus(Battle)` → **`FindNextTarget(10000f)`** = 사실상 무한 반경 재타깃 MobActor.cs:352 `Check_Patrol`(OriginalPos 기준 f_BaseChaseRange 밖이면 귀환) — 아레나 리쉬보다 먼저 걸린다 [PASS] 🔴 원본 `On_Regen` 은 **그 안에서 `Check_Battle()` 을 부른다** → 813w3 의 `Del_Target` → `On_Regen` → `Set_Warp` 순서에서는 재아그로가 **워프 전(= 런이 끝난 자리 · PC 옆)** 에서 일어나고, 워프 뒤에도 MobStatus=Battle · m_Target=PC 가 남는다. [PASS] `FindNextTarget(10000f)` 존재 — 「추적 범위(20 m)」와 무관하게 맵 어디의 PC 든 잡는다 원본 정지 API 접근성(발주서 §1-2 「StopMove_Imm 실측 · 없으면 NavMeshAgent」): Actor.cs:2146 `protected void StopMove_Imm` · Actor.cs:53 `protected bool IsStop` [PASS] 🔴 `StopMove_Imm` 은 **protected** — WL 코드에서 못 부른다(PCActor.WL_StopNavMove 는 PC 전용) [PASS] 대안 = Actor.cs:900 `public virtual NavMeshAgent Get_Agent()` 로 같은 본체 재현 [PASS] 공개 API 실측 — Actor.cs:957 `Del_Target(bool)` · Actor.cs:2245 `Change_MobStatus(eMobStatus)` 원인 ③ — RunDirector.cs:262 `NoteBossSpawned` 가 보스 Spawned 한 건에 게이트를 연다(AlreadySpawned) [PASS] RunDirector.cs:374 `OpenBossGate` — 813w5 가드 2줄이 들어간 자리 ── ③ 게이트 조기 개방 방지 진리표 (gateMinSeconds=60 · D-39 t≈19.6 개방) [PASS] 런이 한 번도 시작 안 됨(StartCount=0) → 차단 0 (C8 · 813d 그대로) StartCount=1 IsRunning=True Elapsed=0.0s [PASS] 🔴 reason=AlreadySpawned · 런 시작 직후(Elapsed≈0) → **차단**(D-39 의 그 경로) [PASS] GateMinBlocked 1 증가 · LastGateHeldElapsed=0.0 [PASS] reason=ZonesCleared → 통과(gateMinAllowsZonesCleared=1 · 런 축의 진짜 존 전멸은 막지 않는다) [PASS] reason=TimeLimit → 통과(openGateAtSec 170) [PASS] reason=External → 통과(QA·치트 버튼) [PASS] 🔴 reason=None(= BossArena 자체 `ZonesCleared` 판정) → **차단** — 지난 런에서 굳은 alive=0 으로 열리는 길을 막는다 [PASS] 런 밖(EndRun 뒤) → 차단 0 (런 안에서만 시간을 잰다) ── ④ 보스 홀드 (nextRunBossHoldSeconds=30 · 가짜 시각) [PASS] 초기 상태 → 홀드 아님 [PASS] arm 직후(t=1000) → 홀드 · BossHoldUntil=1030.0 [PASS] t=1029(29 s 경과) → **아직 홀드** [PASS] t=1031(31 s 경과) → **해제** [PASS] 재무장(다음 런에서 다시 30 s) → 홀드 · until=1130.0 [PASS] ClearBossHold() → 즉시 해제(QA·프로브) [PASS] C8 nextRunBossHoldSeconds=0 → 홀드 0(813w3 그대로) ── ⑤ RunEnded 구독 (813w5 신규 · 「런 종료 시 보스 상태 확정」) [PASS] RunEvents.RunEnded 구독 중 [PASS] 🔴 진짜 RunDirector.EndRun(Win) → BossArena 가 RunEnded 를 받았다(2회 · LastRunOutcome=Win) [PASS] 보스 없음 → ParkCount 불변(0) · 예외 0 [PASS] ParkBoss(보스 null) → false(안전) [PASS] 가짜 보스 IsDead()=true(비활성) [PASS] ParkBoss(죽은 보스) → false · ParkCount 불변(True) [PASS] RunEnded(Timeout · 죽은 보스) → 통지 1 · 고정 0 · 예외 0 [PASS] C8 parkBossOnRunEnd=0 → RunEnded 통지 0(813w3 그대로) ── ⑥ 런 밖 리쉬 = 거리 판정만 유지 (813w3 은 판정 자체를 껐다 → D-39 ②) 아레나 중심=(139.0, 0.8, -20.0) 반경=20 leashMargin=2 → 되돌림 경계 22m [PASS] RunActive=false 강제(결과창·다음 런 대기 상황) [PASS] 보스 없음 → LeashTick 이 보스 가드에서 먼저 끊긴다(카운터 불변) [PASS] 판정식 = XZ 거리 > 22m → 회복 없이 중심 워프(ResetBossNoHeal · LeashHealCount 불변) [PASS] 이번 틱 리셋 0(보스 없음) · 누적 0 [PASS] C8 leashOutsideRunDistanceOnly=0 → 런 밖 판정 0(813w3 그대로) ── ⑦ 실 경로 (진짜 RunDirector.StartRun/Restart + BossArena.NoteKill · 813p 계약 그대로) [PASS] HoldSpawn 전에는 무장 0(NoteSpawn 이 무시된다) — 813d 계약 런 1 시작 — StartCount=1 Phase=Zones Elapsed=0.0 [PASS] 🔴 OpenBossGate(AlreadySpawned) @Elapsed≈0 → **열리지 않는다**(D-39 수리) [PASS] GateMinBlocked +1 = 1 [PASS] OpenBossGate(External · QA 버튼) → 열린다 · reason=External [다음 런] Restart() — RestartCount=1 StartCount=2 Phase=Zones GateOpened=False [PASS] 두 번째 런에서 게이트가 다시 잠긴다 [PASS] 🔴 두 번째 런에서도 60 s 전 AlreadySpawned 개방 **차단**(Q8 R1n·R3n 의 t≈19.6 개방이 여기서 막힌다) [PASS] 같은 시점에도 **진짜 존 전멸**은 연다(reason=ZonesCleared) ── ⑧ GC (틱 경로 0 B) [PASS] GateHeldByMinSeconds ×100 = 0 B [PASS] BossHeld ×100 = 0 B (held=True) [PASS] 런 밖 LeashTick ×100 = 0 B ── ⑨ C8 롤백 (임시 SO · 실에셋 읽기만 · 끄면 813w3 동작 그대로) [PASS] gateMinSeconds=0 → 조기 개방 차단 0(813p/813w3 그대로) [PASS] gateMinAllowsZonesCleared=0 → 존 전멸도 60 s 전에는 막는다(스위치 방향 확인) [PASS] WLBossArenaSettings.RuntimeDisabled=1 → 게이트 차단 0(Active=false) [PASS] RuntimeDisabled=1 → RunEnded 통지 0(고정 0) 813w5 C8 스위치 정리: parkBossOnRunEnd=True nextRunBossHoldSeconds=30 nextRunWarpBeforeHeal=True nextRunClearsPlayerTarget=True leashOutsideRunDistanceOnly=True gateMinSeconds=60 [PASS] 6개를 전부 0 으로 두면 813w3 판(ResetGate 1회 리셋 · 런 밖 리쉬 정지 · 게이트 시간 제한 없음)으로 정확히 돌아간다 RESULT PASS