Files
DS-Combat_analy/분석도구/v2/archive/investigate_projectile.py

134 lines
5.1 KiB
Python
Raw Normal View History

2025-10-27 17:04:37 +09:00
#!/usr/bin/env python3
"""Projectile 노티파이 조사 스크립트"""
import json
from pathlib import Path
from collections import defaultdict
# AnimMontage.json 로드
montage_file = Path("D:/Work/WorldStalker/DS-전투분석_저장소/원본데이터/AnimMontage.json")
with open(montage_file, 'r', encoding='utf-8') as f:
montage_data = json.load(f)
# validated_data.json 로드 (유틸리티 스킬 확인용)
val_file = Path("D:/Work/WorldStalker/DS-전투분석_저장소/분석결과/20251024_210822_v2/validated_data.json")
with open(val_file, 'r', encoding='utf-8') as f:
val_data = json.load(f)
print("=" * 80)
print("Projectile 노티파이 조사")
print("=" * 80)
# 1. 우르드 다발 화살 몽타주 확인
print("\n=== 예시: Urud 다발 화살 (SK110205) ===")
assets = montage_data.get('Assets', [])
multi_arrow = [a for a in assets if a.get('AssetName') == 'AM_PC_Urud_Base_B_Skill_MultiArrow']
if multi_arrow:
m = multi_arrow[0]
notifies = m.get('AnimNotifies', [])
print(f"Montage: {m.get('AssetName')}")
print(f"Total notifies: {len(notifies)}")
print("\nNotify Classes:")
for n in notifies:
notify_class = n.get('NotifyClass', 'N/A')
notify_state = n.get('NotifyStateClass', 'N/A')
if notify_class != 'N/A':
print(f" - NotifyClass: {notify_class}")
if notify_state != 'N/A':
print(f" - NotifyStateClass: {notify_state}")
else:
print("몽타주를 찾을 수 없음!")
# 2. 모든 PC 스킬 몽타주에서 Projectile 관련 노티파이 패턴 수집
print("\n" + "=" * 80)
print("모든 PC 스킬 몽타주에서 Projectile 패턴 조사")
print("=" * 80)
projectile_patterns = defaultdict(int)
pc_skill_montages = [a for a in assets if 'PC' in a.get('AssetPath', '') and 'Skill' in a.get('AssetPath', '')]
print(f"\n총 PC 스킬 몽타주: {len(pc_skill_montages)}")
for montage in pc_skill_montages:
notifies = montage.get('AnimNotifies', [])
for notify in notifies:
notify_class = notify.get('NotifyClass', '')
notify_state = notify.get('NotifyStateClass', '')
# Projectile 또는 관련 키워드 포함
keywords = ['Projectile', 'projectile', 'Shot', 'shot', 'Fire', 'Spawn', 'Arrow', 'Bullet']
for keyword in keywords:
if keyword in notify_class:
projectile_patterns[notify_class] += 1
if keyword in notify_state:
projectile_patterns[notify_state] += 1
print(f"\nProjectile 관련 노티파이 패턴 발견: {len(projectile_patterns)}")
for pattern, count in sorted(projectile_patterns.items(), key=lambda x: x[1], reverse=True):
print(f" {pattern}: {count}")
# 3. 유틸리티로 판정된 스킬 중 Projectile 노티파이가 있는 스킬 찾기
print("\n" + "=" * 80)
print("유틸리티 판정 스킬 중 Projectile 노티파이 보유 스킬")
print("=" * 80)
utility_with_projectile = []
for stalker_id, stalker_data in val_data.items():
skills = stalker_data.get('skills', {})
for skill_id, skill in skills.items():
is_utility = skill.get('isUtility', False)
if is_utility:
# 몽타주 데이터 확인
montage_data_list = skill.get('montageData', [])
for montage_info in montage_data_list:
all_notifies = montage_info.get('allNotifies', [])
has_projectile = False
projectile_notifies = []
for notify in all_notifies:
notify_class = notify.get('NotifyClass', '')
notify_state = notify.get('NotifyStateClass', '')
for keyword in keywords:
if keyword in notify_class or keyword in notify_state:
has_projectile = True
projectile_notifies.append(notify_class or notify_state)
if has_projectile:
utility_with_projectile.append({
'stalker': stalker_id,
'skillId': skill_id,
'skillName': skill.get('name', 'N/A'),
'montage': montage_info.get('assetName', 'N/A'),
'projectileNotifies': projectile_notifies,
'damageRate': skill.get('skillDamageRate', 0)
})
print(f"\n유틸리티로 잘못 판정된 가능성이 있는 스킬: {len(utility_with_projectile)}\n")
for item in utility_with_projectile:
print(f"[{item['stalker']}] {item['skillId']} - {item['skillName']}")
print(f" Damage Rate: {item['damageRate']}")
print(f" Montage: {item['montage']}")
print(f" Projectile Notifies: {', '.join(set(item['projectileNotifies']))}")
print()
# 4. 권장 ATTACK_NOTIFY_CLASSES 업데이트
print("=" * 80)
print("권장 ATTACK_NOTIFY_CLASSES 추가 키워드")
print("=" * 80)
# 빈도가 높은 패턴 추출 (5회 이상)
high_frequency = [p for p, c in projectile_patterns.items() if c >= 3]
print("\n추가 권장 키워드 (빈도 3회 이상):")
for pattern in high_frequency[:10]:
print(f" - '{pattern.split('_')[-1] if '_' in pattern else pattern}'")