전투 밸런스 심층 분석
This commit is contained in:
106
분석도구/extract_ge_from_ultimates.py
Normal file
106
분석도구/extract_ge_from_ultimates.py
Normal file
@ -0,0 +1,106 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
궁극기에서 사용하는 GameplayEffect 추출
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
STALKERS = ['hilda', 'urud', 'nave', 'baran', 'rio', 'clad', 'rene', 'sinobu', 'lian', 'cazimord']
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
print("사용법: python extract_ge_from_ultimates.py <DataTable.json 경로>")
|
||||
sys.exit(1)
|
||||
|
||||
json_path = Path(sys.argv[1])
|
||||
|
||||
with open(json_path, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
assets = data.get('Assets', [])
|
||||
|
||||
# DT_CharacterStat에서 궁극기 ID 추출
|
||||
dt_char_stat = next((dt for dt in assets if dt.get('AssetName') == 'DT_CharacterStat'), None)
|
||||
stalker_ultimates = {}
|
||||
for row in dt_char_stat.get('Rows', []):
|
||||
row_name = row['RowName']
|
||||
if row_name in STALKERS:
|
||||
stalker_ultimates[row_name] = row['Data'].get('ultimateSkill', '')
|
||||
|
||||
# DT_Skill에서 궁극기 gameplayEffectSet 추출
|
||||
dt_skill = next((dt for dt in assets if dt.get('AssetName') == 'DT_Skill'), None)
|
||||
|
||||
all_ge_classes = set()
|
||||
stalker_ges = {}
|
||||
|
||||
print("=" * 100)
|
||||
print("궁극기에서 사용하는 GameplayEffect 목록")
|
||||
print("=" * 100)
|
||||
|
||||
for stalker in STALKERS:
|
||||
ult_id = stalker_ultimates.get(stalker, '')
|
||||
if not ult_id:
|
||||
continue
|
||||
|
||||
skill_row = next((row for row in dt_skill['Rows'] if row['RowName'] == ult_id), None)
|
||||
if not skill_row:
|
||||
continue
|
||||
|
||||
data_field = skill_row['Data']
|
||||
effect_set = data_field.get('gameplayEffectSet', [])
|
||||
|
||||
stalker_ges[stalker] = []
|
||||
|
||||
print(f"\n【{stalker.upper()}】 {ult_id} - {data_field.get('name', 'N/A')}")
|
||||
|
||||
if not effect_set:
|
||||
print(f" → gameplayEffectSet 비어있음")
|
||||
continue
|
||||
|
||||
for effect in effect_set:
|
||||
ge_class = effect.get('gEClass', '')
|
||||
trigger = effect.get('trigger', '')
|
||||
tag_values = effect.get('gETagValues', [])
|
||||
|
||||
# Ignore 효과는 스킵
|
||||
if 'Ignore' in ge_class:
|
||||
continue
|
||||
|
||||
# GE 클래스 이름 추출
|
||||
if ge_class:
|
||||
ge_name = ge_class.split('/')[-1].replace('.', '_').replace('_C', '')
|
||||
all_ge_classes.add(ge_class)
|
||||
stalker_ges[stalker].append({
|
||||
'name': ge_name,
|
||||
'class': ge_class,
|
||||
'trigger': trigger,
|
||||
'tagValues': tag_values
|
||||
})
|
||||
|
||||
print(f" [{trigger}] {ge_name}")
|
||||
if tag_values:
|
||||
for tv in tag_values:
|
||||
tag_name = tv.get('tag', {}).get('tagName', 'Unknown')
|
||||
value = tv.get('value', 0)
|
||||
print(f" - {tag_name}: {value}")
|
||||
|
||||
print(f"\n\n총 {len(all_ge_classes)}개의 고유한 GE 클래스 발견")
|
||||
print("\nGE 클래스 목록:")
|
||||
for ge in sorted(all_ge_classes):
|
||||
ge_name = ge.split('/')[-1].replace('.', '_').replace('_C', '')
|
||||
print(f" - {ge_name}")
|
||||
|
||||
# JSON 파일로 저장
|
||||
output_file = Path(sys.argv[1]).parent / "ultimate_ge_list.json"
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
json.dump({
|
||||
'stalker_ges': stalker_ges,
|
||||
'all_ge_classes': list(all_ge_classes)
|
||||
}, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print(f"\n\n결과 저장: {output_file}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user