리뉴얼

This commit is contained in:
Gnill82
2025-10-27 17:04:37 +09:00
parent faef6ce8bd
commit af7de76bc0
57 changed files with 479079 additions and 633159 deletions

View File

@ -0,0 +1,143 @@
"""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)