# 장기 과제: 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
