# WL813o2 Probe 2026-09-09 19:01:19 (edit mode · Play 0 · 로그인 0) playMode=False ── ⓪ 값(SO) — 코드 상수 0 (C45) [PASS] WLZonePickupSettings.asset 로드 [PASS] WLErrorGuardSettings.asset 로드 validatePool=True runtimeKeyCheck=True maxRedraws=6 logExclusion=True cardCount=3 excludeSkillIds = [3, 11, 14] noPrefabEffects(10) = Select_DoubleShot, Select_TripleShot, Select_Bounce, Select_Bounce2, Select_LeafFairy2, Select_FrostFairy2, Select_WindFairy2, Select_HikikomoriFairy2, Select_Heal, Select_Shield extraKeys[0] Select_Star → Assets/Res_Addr/Projectile/ProjectileStar.prefab (Select_Star.cs:27 Shoot_Projectile("ProjectileStar")) extraKeys[1] Select_SwordSlash → Assets/Res_Addr/Projectile/SwordSlash.prefab (Select_SwordSlash.cs:29 Shoot_Projectile("SwordSlash")) extraKeys[2] Select_Shield → Assets/Res_Addr/Skill/Skill_Shield.prefab (InGameInfo2.cs:46 Set_Skill_ToPet(eEffect.Skill_Shield)) 경로형식: select=Assets/Res_Addr/SelectSkill/{0}.prefab · skill=Assets/Res_Addr/Skill/{0}.prefab · effect=Assets/Res_Addr/Effect/{0}.prefab [813x2] suppressErrorModalInRun=True suppressOnlyWhileRunning=True suppressUntilNextRunStart=True [PASS] validatePool=1(풀 검증 켜짐) [PASS] excludeSkillIds 비어 있지 않음 [PASS] extraKeys(코드 문자열 키) 채워짐 [PASS] suppressUntilNextRunStart=1(D-42 연장 켜짐) [PASS] 카드 3장(기획안 F-3) ── ① Addressables 그룹 실측 — 키 존재 ⟺ 그 경로의 에셋 존재 Projectile 그룹 m_Address = Assets/Res_Addr/Projectile (엔트리 1개) [PASS] Projectile = 폴더 엔트리 1개(자식 주소 = 에셋 경로) Skill 그룹 m_Address = Assets/Res_Addr/Skill (엔트리 1개) [PASS] Skill = 폴더 엔트리 1개(자식 주소 = 에셋 경로) Effect 그룹 m_Address = Assets/Res_Addr/Effect (엔트리 1개) [PASS] Effect = 폴더 엔트리 1개(자식 주소 = 에셋 경로) SelectSkill 그룹 m_Address = Assets/Res_Addr/SelectSkill (엔트리 1개) [PASS] SelectSkill = 폴더 엔트리 1개(자식 주소 = 에셋 경로) ── ② 원본 데이터 경로 — table_selectskill.Awake 를 그대로 태운다 [PASS] 테이블 TextAsset Assets/ResWork/Table/table_selectskill.txt [PASS] table_selectskill.Ins 설정(원본 Awake) [PASS] InGameInfo.Ins · ActorInfo.Ins 설정 테이블 행 수 실측 = 58 (발주서 「기획안 42행」과 다르다 → 실측값을 쓴다) [PASS] 행 파싱 성공 ── ③ 원본 효과 클래스 grep — `Shoot_Projectile("…")` 코드 문자열 (읽기만 · 수정 0) [PASS] 원본 폴더 Assets/Script/Character/Projectile/SelectSkill 파일 16개 (주석) Select_LeafFairy.cs:44 키="LeafBullet" Select_Star.cs:27 키="ProjectileStar" Select_SwordSlash.cs:29 키="SwordSlash" [PASS] 살아 있는 Shoot_Projectile 문자열 2건 [PASS] SO extraKeys 가 Select_Star → Assets/Res_Addr/Projectile/ProjectileStar.prefab 를 덮는다 [PASS] SO extraKeys 가 Select_SwordSlash → Assets/Res_Addr/Projectile/SwordSlash.prefab 를 덮는다 ── ④ 🔴 풀 검증 표 — 전 행 × 참조 키 × 실존 (에디트 모드 · AssetDatabase) | ID | SkillEffect | Stg | 뽑기가능 | 1차 키 | 실존 | 추가 키 | 실존 | 판정 | |---|---|---|---|---|---|---|---|---| | 1 | Select_DoubleShot | 2 | - | (없음) | - | - | - | 사용 | | 2 | Select_Bounce | 4 | - | (없음) | - | - | - | 사용 | | 3 | Select_Shield | 1 | O | (없음) | - | Skill/Skill_Shield.prefab | 🔴X | 🔴 제외 | | 4 | Select_FireCircle | 1 | O | SelectSkill/Select_FireCircle.prefab | O | - | - | 사용 | | 5 | Select_BarrelCircle | 1 | O | SelectSkill/Select_BarrelCircle.prefab | O | - | - | 사용 | | 6 | Select_TripleShot | 5 | - | (없음) | - | - | - | 사용 | | 7 | Select_Heal | 5 | - | (없음) | - | - | - | 사용 | | 8 | Select_Bottle | 3 | - | SelectSkill/Select_Bottle.prefab | O | - | - | 사용 | | 9 | Select_BodyonFire | 1 | O | SelectSkill/Select_BodyonFire.prefab | O | - | - | 사용 | | 10 | Select_LeafFairy | 1 | O | SelectSkill/Select_LeafFairy.prefab | O | - | - | 사용 | | 11 | Select_SwordSlash | 7 | - | SelectSkill/Select_SwordSlash.prefab | O | Projectile/SwordSlash.prefab | 🔴X | 🔴 제외 | | 12 | Select_FrostFairy | 1 | O | SelectSkill/Select_FrostFairy.prefab | O | - | - | 사용 | | 13 | Select_WindFairy | 1 | O | SelectSkill/Select_WindFairy.prefab | O | - | - | 사용 | | 14 | Select_Star | 1 | O | SelectSkill/Select_Star.prefab | O | Projectile/ProjectileStar.prefab | 🔴X | 🔴 제외 | | 15 | Select_MoveSpeedUp | 1 | O | SelectSkill/Select_MoveSpeedUp.prefab | O | - | - | 사용 | | 16 | Select_MoveSpeedUp | 4 | - | SelectSkill/Select_MoveSpeedUp.prefab | O | - | - | 사용 | | 17 | Select_HikikomoriFairy | 1 | O | SelectSkill/Select_HikikomoriFairy.prefab | O | - | - | 사용 | | 18 | Select_LeafFairy2 | 4 | - | (없음) | - | - | - | 사용 | | 19 | Select_FrostFairy2 | 3 | - | (없음) | - | - | - | 사용 | | 20 | Select_WindFairy2 | 3 | - | (없음) | - | - | - | 사용 | | 21 | Select_HikikomoriFairy2 | 2 | - | (없음) | - | - | - | 사용 | | 22 | Select_Bounce2 | 5 | - | (없음) | - | - | - | 사용 | | 101 | None | 1 | O | (없음) | - | - | - | 사용 | | 102 | None | 1 | O | (없음) | - | - | - | 사용 | | 103 | None | 1 | O | (없음) | - | - | - | 사용 | | 104 | None | 1 | O | (없음) | - | - | - | 사용 | | 105 | None | 1 | O | (없음) | - | - | - | 사용 | | 106 | None | 1 | O | (없음) | - | - | - | 사용 | | 107 | None | 1 | O | (없음) | - | - | - | 사용 | | 108 | None | 1 | O | (없음) | - | - | - | 사용 | | 109 | None | 1 | O | (없음) | - | - | - | 사용 | | 110 | None | 1 | O | (없음) | - | - | - | 사용 | | 111 | None | 1 | O | (없음) | - | - | - | 사용 | | 112 | None | 1 | O | (없음) | - | - | - | 사용 | | 113 | None | 3 | - | (없음) | - | - | - | 사용 | | 114 | None | 3 | - | (없음) | - | - | - | 사용 | | 115 | None | 3 | - | (없음) | - | - | - | 사용 | | 116 | None | 3 | - | (없음) | - | - | - | 사용 | | 117 | None | 3 | - | (없음) | - | - | - | 사용 | | 118 | None | 3 | - | (없음) | - | - | - | 사용 | | 119 | None | 3 | - | (없음) | - | - | - | 사용 | | 120 | None | 3 | - | (없음) | - | - | - | 사용 | | 121 | None | 3 | - | (없음) | - | - | - | 사용 | | 122 | None | 3 | - | (없음) | - | - | - | 사용 | | 123 | None | 3 | - | (없음) | - | - | - | 사용 | | 124 | None | 3 | - | (없음) | - | - | - | 사용 | | 125 | None | 6 | - | (없음) | - | - | - | 사용 | | 126 | None | 6 | - | (없음) | - | - | - | 사용 | | 127 | None | 6 | - | (없음) | - | - | - | 사용 | | 128 | None | 6 | - | (없음) | - | - | - | 사용 | | 129 | None | 6 | - | (없음) | - | - | - | 사용 | | 130 | None | 6 | - | (없음) | - | - | - | 사용 | | 131 | None | 6 | - | (없음) | - | - | - | 사용 | | 132 | None | 6 | - | (없음) | - | - | - | 사용 | | 133 | None | 6 | - | (없음) | - | - | - | 사용 | | 134 | None | 6 | - | (없음) | - | - | - | 사용 | | 135 | None | 6 | - | (없음) | - | - | - | 사용 | | 136 | None | 6 | - | (없음) | - | - | - | 사용 | 전체 58행 · 부재 키 행 3건 🔴 행 3 Select_Shield (Stage 1 · 지금 뽑힘) — 부재 키 Assets/Res_Addr/Skill/Skill_Shield.prefab 🔴 행 11 Select_SwordSlash (Stage 7 · 지금은 안 뽑힘) — 부재 키 Assets/Res_Addr/Projectile/SwordSlash.prefab 🔴 행 14 Select_Star (Stage 1 · 지금 뽑힘) — 부재 키 Assets/Res_Addr/Projectile/ProjectileStar.prefab [PASS] 부재 키 행 3(Select_Shield)이 SO excludeSkillIds 에 있다 [PASS] 부재 키 행 11(Select_SwordSlash)이 SO excludeSkillIds 에 있다 [PASS] 부재 키 행 14(Select_Star)이 SO excludeSkillIds 에 있다 [PASS] SO excludeSkillIds[3] 는 실측 부재 행이다(과잉 제외 0) [PASS] SO excludeSkillIds[11] 는 실측 부재 행이다(과잉 제외 0) [PASS] SO excludeSkillIds[14] 는 실측 부재 행이다(과잉 제외 0) [PASS] D-41 재현 — 부재 키 행이 실제로 있다 ── ⑤ 런타임 검사 — 게임 코드 `ZonePickupPool` 이 같은 결론을 내는가 [PASS] 에디트 모드 표와 런타임 판정 완전 일치(58행 · 불일치 0) [PASS] 행 3 제외 판정 — 사유 "SO 제외 목록" [PASS] 행 11 제외 판정 — 사유 "SO 제외 목록" [PASS] 행 14 제외 판정 — 사유 "SO 제외 목록" 카운터: checked=3 staticExclude=3 missingKey=0 skipped=0 정적 목록 없이 키 검사만으로 제외된 행 = [3, 11, 14] [PASS] 키 검사만으로도 같은 수(3)가 걸린다 = 목록은 캐시일 뿐 ── ⑥ 3장 뽑기 100회 — 제외 행이 한 번도 안 나오는가 [PASS] 100회 전부 성공 — 실측 100 [PASS] 카드 수 3장 미달 0 — 실측 0 [PASS] 한 뽑기 안 ID 중복 0 — 실측 0 나온 ID 분포(300장): 4×12 5×12 9×18 10×15 12×22 13×12 15×19 17×13 101×11 102×15 103×7 104×16 105×18 106×15 107×15 108×21 109×6 110×18 111×16 112×19 [PASS] 🔴 제외 행 3 등장 0회 — 실측 0회 [PASS] 🔴 제외 행 11 등장 0회 — 실측 0회 [PASS] 🔴 제외 행 14 등장 0회 — 실측 0회 ExcludedCount=32 RedrawCount=27 last="행 14 — SO 제외 목록" [PASS] 실제로 제외가 걸렸다(후필터가 살아 있다) — 32건 ── ⑦ 대조군 — validatePool=0 (813o 동작) 이면 제외 행이 다시 뽑힌다 validatePool=0 에서 제외 대상 등장 = 27장 / 300장 [PASS] 대조군에서는 실제로 나온다 = ⑥의 0회가 필터 덕분임을 증명 [PASS] validatePool=0 이면 제외 0 · 재뽑기 0(813o 동작 그대로) [PASS] 재뽑기 0회 ── ⑧ GC — 검증 코드 자체의 할당(캐시가 선 뒤) 판정 6,000회(캐시 히트) Δ = 0 B [PASS] 🔴 캐시가 선 뒤 판정 할당 = 0 B — 실측 0 [PASS] 판정은 ID 당 1회 — 58행×51회 뒤에도 누적 58회(=행 수) 검증 ON 뽑기 200회 Δ = 0 B · 원본 Get_DataList 호출 246회(재뽑기 46) 검증 OFF 뽑기 200회 Δ = 0 B · 원본 Get_DataList 호출 200회 원본 호출 1회당 = ON 0 B · OFF 0 B → 차이는 검증 코드가 아니라 **원본 LINQ 셔플을 몇 번 더 부르느냐**다 [PASS] 호출 1회당 할당이 대조군의 2배를 넘지 않는다(검증 코드 몫 ≈ 0) 🔴 실사용 빈도 = 존 클리어 1회당 뽑기 1회(런당 최대 3장×존 수) — 매 프레임 경로 아님 ── ⑨ C8 — 스위치 하나로 813o 이전 100% [PASS] validatePool=0 → 검증 축 off [PASS] 제외 0 · 재뽑기 0 [PASS] RuntimeDisabled → 픽업 축 전체 off(813o C8 그대로) [PASS] 복구 [PASS] suppressUntilNextRunStart=0 → 813x2 원래 동작으로 되돌린다 ── ⑩ 🔴 D-42 — RunEnded 뒤 결과창~다음 런 시작까지 모달 0 [PASS] 813p WLRunSettings.Enabled(StartRun 전제) — 실측 True 초기 Phase=Idle IsRunning=False [PASS] Idle(런 밖 · 시작 전) → 차단 안 함 = 원본 모달 살아 있음 [PASS] 훅 enabled=True StartRun → Phase=Zones IsRunning=True [PASS] 런 중 → 차단(813x2 그대로) [PASS] 런 중 훅 enabled=False(원본 OnDisable 이 구독을 끊는다) EndRun → Phase=Ended IsRunning=False [PASS] 🔴 런 종료 뒤(결과창)에도 차단 유지 = D-42 해소 [PASS] 🔴 결과창에서 훅 enabled=False 유지(모달 0) 가짜 오류 1건 → captured=1 suppressed=1 written=1 [PASS] 🔴 결과창 예외가 「모달차단」으로 기록된다(모달 0) [PASS] 훅은 우리가 내려둔 상태 로그 파일 = E:\NerdNavis\WL_wt\ui\Screenshots_WL/WL813x2\errors_190120.txt [PASS] 연장 off → 결과창에서 차단 해제(= Q9 가 본 D-42 상태 재현) [PASS] 연장 off 면 결과창에서 훅 enabled=True(원본 모달 부활) [PASS] 연장 on 으로 되돌리면 다시 내려간다 다음 StartRun → Phase=Zones [PASS] Phase=Zones(Ended 를 벗어났다 = 연장 래치 해제) [PASS] 연장분 없이도 런 중이라 차단 = 복원 뒤 곧바로 다시 off [PASS] Phase=Idle(로비/타이틀) → 차단 해제 = 원본 모달 복귀 [PASS] 훅 enabled=True 복원 · HookDisabledByUs=False ── ⑪ 정리 임시 오브젝트 제거 · 구독 해제 · 디스크 SO 무변경(값은 메모리 인스턴스만 손댔다) [PASS] 픽업 노드 0 [PASS] 정리 완료 RESULT PASS — pass=67 fail=0