Files
DS-Combat_analy/legacy/분석도구/v2/장기과제_Blueprint변수검증.md

205 lines
6.9 KiB
Markdown
Raw Permalink Normal View History

2025-10-27 17:04:37 +09:00
# 장기 과제: Blueprint 변수 검증
## 과제 개요
DT_Skill의 스킬 설명(desc)에 사용된 {0}, {1} 등의 변수가 실제 게임 로직(Blueprint, 몽타주 등)의 값과 일치하는지 검증하는 작업
## 현재 상태
### ✅ 완료된 부분
- DT_Skill의 `desc` (원본 설명 문자열) 추출
- DT_Skill의 `descValues` (UI 표시용 값 배열) 추출
- `descFormatted` (변수 치환된 최종 설명) 생성
- 문서에 완전한 스킬 설명 표시
### ⚠️ 제한 사항
**descValues는 유저에게 보여주기 위한 텍스트 정보일 뿐, 실제 게임 로직에서는 사용되지 않음**
- 실제 스킬 효과는 Blueprint, AnimMontage, GameplayEffect 등에 정의됨
- descValues와 실제 게임 로직 값이 다를 가능성 존재
- 각 변수가 어느 Blueprint/몽타주의 어떤 변수와 연결되는지 case-by-case 분석 필요
## 검증 대상 예시
### 예시 1: Hilda 반격 (SK100202)
**DT_Skill 정보**:
```
desc: "방패를 들어 {0}초 동안 반격 자세를 취합니다. 반격 성공 시 {1}%만큼 물리 피해를 줍니다."
descValues: [5, 80]
abilityClass: /Game/Blueprints/Abilities/GA_Skill_Knight_Counter.GA_Skill_Knight_Counter_C
```
**검증 필요 사항**:
- {0} = 5초 → GA_Skill_Knight_Counter의 어느 변수? (activeDuration? blockingDuration?)
- {1} = 80% → GA_Skill_Knight_Counter의 어느 변수? (counterDamageMultiplier?)
**현재 문제**:
- Blueprint.json에서 GA_Skill_Knight_Counter 추출 시 모든 VarName이 `None`으로 나타남
- 변수 이름 없이는 매칭 불가능
### 예시 2: Urud 다발 화살 (SK110205)
**DT_Skill 정보**:
```
desc: "{0}발의 화살을 동시에 발사하여 각각 {1}%만큼 물리 피해를 입힙니다."
descValues: [3, 90]
abilityClass: /Game/Blueprints/Characters/Urud/GA_Skill_Urud_MultiShot_Quick.GA_Skill_Urud_MultiShot_Quick_C
```
**검증 필요 사항**:
- {0} = 3발 → Blueprint의 ProjectileCount? 또는 몽타주의 AN_Trigger_Projectile_Shot_C 호출 횟수?
- {1} = 90% → 이미 DT_Skill.skillDamageRate=0.9로 검증됨 ✅
## 작업 범위
### 1단계: 정보 수집 (필수)
Blueprint 변수 이름을 얻기 위한 방법 선택:
#### 옵션 A: Blueprint.json 재추출
- FModel 또는 다른 추출 도구 설정 변경
- VarName 필드가 포함되도록 추출 옵션 조정
- 또는 Unreal Editor에서 직접 Blueprint을 JSON으로 Export
#### 옵션 B: 수동 조사
- Unreal Editor에서 각 GA_Skill Blueprint 열기
- 변수 목록과 기본값을 수동으로 기록
- config.py에 수동으로 정의
#### 옵션 C: 코드 분석
- C++ 소스 코드에서 WSGameplayAbility 클래스 분석
- 각 GA_Skill의 부모 클래스 변수 확인
- .h/.cpp 파일에서 변수 정의 추출
### 2단계: 변수 매칭 규칙 정의
각 스킬 타입별 변수 매칭 패턴 정의:
```python
# 예시 매칭 규칙
SKILL_VAR_MAPPING = {
'counter_skills': {
# 반격 스킬 계열
'{0}': 'blockingDuration', # 반격 지속 시간
'{1}': 'counterDamageRate' # 반격 피해 배율
},
'projectile_skills': {
# 발사체 스킬 계열
'{0}': 'projectileCount', # 발사체 개수
'{1}': 'skillDamageRate' # 피해 배율 (DT_Skill에서 검증 가능)
},
'summon_skills': {
# 소환 스킬 계열
'{0}': 'activeDuration', # 소환 지속 시간 (DT_Skill에서 검증 가능)
'{1}': 'summonDamageRate' # 소환수 피해 배율
}
}
```
### 3단계: 자동 검증 스크립트 작성
```python
def verify_skill_desc_values(skill_id: str, skill_data: Dict) -> Dict:
"""
스킬 설명의 변수가 실제 Blueprint/몽타주 값과 일치하는지 검증
Returns:
{
'verified': bool,
'mismatches': [],
'sources': {
'{0}': {'expected': 5, 'actual': 5, 'source': 'Blueprint.activeDuration'},
'{1}': {'expected': 80, 'actual': 75, 'source': 'Blueprint.counterDamageRate'}
}
}
"""
pass
```
### 4단계: 검증 리포트 생성
각 스킬별 검증 상태를 마크다운으로 출력:
```markdown
## SK100202 - 반격 (Hilda)
**Desc**: 방패를 들어 {0}초 동안 반격 자세를 취합니다. 반격 성공 시 {1}%만큼 물리 피해를 줍니다.
| 변수 | descValues | 실제 값 | 출처 | 상태 |
|------|------------|---------|------|------|
| {0} | 5 | 5 | GA_Skill_Knight_Counter.blockingDuration | ✅ 일치 |
| {1} | 80 | 75 | GA_Skill_Knight_Counter.counterDamageRate | ❌ 불일치 |
**결론**: descValues가 실제 로직과 다를 수 있음 (UI 표시용 값)
```
## 우선순위 스킬 목록
다음 스킬들을 우선적으로 검증:
### High Priority (복잡한 변수 사용)
1. SK100202 (Hilda 반격) - 지속시간, 피해량
2. SK110205 (Urud 다발 화살) - 발사체 개수, 피해량
3. SK160202 (Rene Ifrit 소환) - 지속시간, 공격력
4. SK160206 (Rene Shiva 소환) - 지속시간, 공격 주기
5. SK120202 (Nave 화염벽) - 지속시간, 틱 피해
### Medium Priority (1-2개 변수)
6. SK100201 (Hilda 칼날 격돌) - 피해량, 경직 시간
7. SK130204 (Baran 강제 끌어오기) - 피해량
8. SK180202 (Sinobu 부적폭탄) - 폭발 범위, 피해량
### Low Priority (변수 없거나 단순)
- 대부분의 유틸리티 스킬
- 변수가 없는 스킬
## 예상 결과물
1. **검증 스크립트**: `verify_blueprint_variables.py`
2. **변수 매칭 정의**: `config.py``SKILL_VAR_MAPPING` 추가
3. **검증 리포트**: `Blueprint변수검증_리포트.md`
4. **업데이트된 문서**: 각 스킬에 실제 값 vs descValues 비교 추가
## 예상 소요 시간
- **옵션 A** (Blueprint 재추출): 1-2시간 (추출 설정 + 재실행)
- **옵션 B** (수동 조사): 10-15시간 (91개 스킬 × 평균 10분)
- **옵션 C** (코드 분석): 3-5시간 (C++ 코드 리뷰 + 자동화)
## 권장 접근 방법
1. **단기 (1-2시간)**:
- Blueprint.json 재추출 시도 (FModel 설정 변경)
- 성공 시 자동 검증 스크립트 작성
2. **중기 (3-5시간)**:
- C++ 소스 코드 분석으로 변수 패턴 파악
- 우선순위 High 스킬 5개만 수동 검증
3. **장기 (필요 시)**:
- 모든 스킬 완전 검증
- 자동화 스크립트 완성
- CI/CD 파이프라인에 검증 단계 추가
## 참고 사항
- **descValues는 UI 표시용이므로 실제 로직과 다를 수 있음을 명심**
- 밸런스 패치 시 Blueprint는 업데이트되지만 descValues는 업데이트 안 될 수 있음
- 이 검증은 "문서의 정확성"보다 "게임 로직의 일관성"을 위한 것
- 실제 DPS 계산에는 Blueprint/몽타주의 실제 값을 사용해야 함
## 연락처 및 진행 상황
- **담당자**: (추후 할당)
- **시작일**: 2025-10-24
- **목표 완료일**: (TBD)
- **현재 상태**: 계획 단계
- **진행률**: 0% (정보 수집 대기 중)
---
**생성일**: 2025-10-24 21:34
**버전**: v1.0
**작성자**: Claude Code