144 lines
5.4 KiB
Python
144 lines
5.4 KiB
Python
"""v2.3 개선사항 검증 스크립트"""
|
|
import json
|
|
from pathlib import Path
|
|
|
|
# 최신 출력 디렉토리 찾기
|
|
result_base = Path(__file__).parent.parent.parent / "분석결과"
|
|
v2_dirs = sorted([d for d in result_base.iterdir() if d.is_dir() and d.name.endswith('_v2')],
|
|
key=lambda d: d.stat().st_mtime)
|
|
latest_dir = v2_dirs[-1]
|
|
|
|
print(f"검증 디렉토리: {latest_dir.name}\n")
|
|
|
|
# validated_data.json 로드
|
|
with open(latest_dir / 'validated_data.json', 'r', encoding='utf-8') as f:
|
|
data = json.load(f)
|
|
|
|
print("=" * 70)
|
|
print("v2.3 개선사항 검증")
|
|
print("=" * 70)
|
|
|
|
# 1. 우르드/리옌 평타 effectiveAttackTime 검증
|
|
print("\n[1] 우르드/리옌 평타 effectiveAttackTime (Projectile TriggerTime)")
|
|
print("-" * 70)
|
|
|
|
for stalker_id in ['urud', 'lian']:
|
|
stalker = data.get(stalker_id, {})
|
|
basic_attacks = stalker.get('basicAttacks', {})
|
|
|
|
for weapon_type, attacks in basic_attacks.items():
|
|
for attack in attacks:
|
|
montage_name = attack['montageName']
|
|
actual_duration = attack['actualDuration']
|
|
effective_time = attack.get('effectiveAttackTime', actual_duration)
|
|
projectile_triggers = attack.get('projectileTriggerTimes', [])
|
|
|
|
if projectile_triggers:
|
|
saved_time = actual_duration - effective_time
|
|
print(f"{stalker_id}/{weapon_type} 평타:")
|
|
print(f" Montage: {montage_name}")
|
|
print(f" ActualDuration: {actual_duration:.2f}초")
|
|
print(f" EffectiveAttackTime: {effective_time:.2f}초")
|
|
print(f" ProjectileTriggers: {projectile_triggers}")
|
|
print(f" => {saved_time:.2f}초 빠름!")
|
|
|
|
# 2. 공격 스킬 판정 검증
|
|
print("\n[2] 공격 스킬 판정 (SimpleSendEvent Event Tag)")
|
|
print("-" * 70)
|
|
|
|
test_skills = {
|
|
'SK130301': '바란 일격분쇄 (Event.SkillActivate)',
|
|
'SK150201': '클라드 다시 흙으로 (Event.SkillActivate)',
|
|
'SK190201': '리옌 연화 (Event.SpawnProjectile)',
|
|
'SK190101': '리옌 정조준 (ProjectileShot)',
|
|
}
|
|
|
|
for skill_id, expected_desc in test_skills.items():
|
|
found = False
|
|
for stalker_id, stalker in data.items():
|
|
all_skills = (stalker.get('defaultSkills', []) +
|
|
[stalker.get('subSkill')] +
|
|
[stalker.get('ultimateSkill')])
|
|
|
|
for skill in all_skills:
|
|
if skill and skill.get('skillId') == skill_id:
|
|
is_attack = len(skill.get('montageData', [])) > 0 and skill['montageData'][0].get('hasAttack', False)
|
|
status = "공격 스킬" if is_attack else "유틸리티"
|
|
print(f"{skill_id}: {skill.get('name')} => {status}")
|
|
print(f" Expected: {expected_desc}")
|
|
|
|
# 몽타주 데이터 확인
|
|
if skill.get('montageData'):
|
|
montage = skill['montageData'][0]
|
|
attack_notifies = montage.get('attackNotifies', [])
|
|
print(f" AttackNotifies: {len(attack_notifies)}개")
|
|
|
|
# SimpleSendEvent 확인
|
|
for notify in attack_notifies:
|
|
if 'SimpleSendEvent' in notify.get('notifyClass', ''):
|
|
event_tag = notify.get('customProperties', {}).get('Event Tag', '')
|
|
print(f" - SimpleSendEvent: {event_tag}")
|
|
|
|
found = True
|
|
break
|
|
if found:
|
|
break
|
|
|
|
if not found:
|
|
print(f"{skill_id}: NOT FOUND")
|
|
|
|
# 3. 유틸리티 스킬 확인 (공격 노티파이 없음)
|
|
print("\n[3] 유틸리티 스킬 (공격 노티파이 없음)")
|
|
print("-" * 70)
|
|
|
|
utility_skills = {
|
|
'SK110207': '우르드 Reload',
|
|
'SK190209': '리옌 재장전'
|
|
}
|
|
|
|
for skill_id, expected_name in utility_skills.items():
|
|
found = False
|
|
for stalker_id, stalker in data.items():
|
|
all_skills = (stalker.get('defaultSkills', []) +
|
|
[stalker.get('subSkill')] +
|
|
[stalker.get('ultimateSkill')])
|
|
|
|
for skill in all_skills:
|
|
if skill and skill.get('skillId') == skill_id:
|
|
has_attack = len(skill.get('montageData', [])) > 0 and skill['montageData'][0].get('hasAttack', False)
|
|
status = "공격" if has_attack else "유틸리티"
|
|
print(f"{skill_id}: {skill.get('name')} => {status}")
|
|
|
|
if skill.get('montageData'):
|
|
montage = skill['montageData'][0]
|
|
attack_notifies_count = len(montage.get('attackNotifies', []))
|
|
print(f" AttackNotifies: {attack_notifies_count}개")
|
|
|
|
found = True
|
|
break
|
|
if found:
|
|
break
|
|
|
|
# 4. 레네 소환체 섹션 확인
|
|
print("\n[4] 레네 소환체 섹션")
|
|
print("-" * 70)
|
|
|
|
rene = data.get('rene', {})
|
|
summons = rene.get('summons', {})
|
|
|
|
if summons:
|
|
print(f"레네 소환체: {len(summons)}개")
|
|
for summon_name, summon_data in summons.items():
|
|
print(f"\n {summon_name}:")
|
|
print(f" SummonSkillId: {summon_data.get('summonSkillId')}")
|
|
print(f" SummonSkillName: {summon_data.get('summonSkillName')}")
|
|
print(f" SkillDamageRate: {summon_data.get('skillDamageRate')}")
|
|
print(f" AttackInterval: {summon_data.get('attackInterval')}초")
|
|
print(f" DotType: {summon_data.get('dotType', 'None')}")
|
|
else:
|
|
print("레네 소환체 데이터 없음!")
|
|
|
|
print("\n" + "=" * 70)
|
|
print("검증 완료!")
|
|
print("=" * 70)
|