# DS-전투시스템-데이터수집

## 분석 대상 스토커 11명

- Hilda (힐다)
- Urud (우르드)
- Nave (네이브)
- Baran (바란)
- Rio (리오)
- Clad (클라드)
- Rene (레네)
- Sinobu (시노부)
- Lian (리옌)
- Cazimord (카지모르드)
- Blackmaria (블랙마리아)

## 1. Asset Export to JSON 소개

언리얼 엔진 에셋은 기본적으로 바이너리 형식으로 저장되어 LLM이나 외부 분석 도구가 직접 접근할 수 없습니다. 이를 해결하기 위해 **Asset Export to JSON** 에디터 확장 기능을 개발하였습니다.

**참고 문서**: `DS-전투분석_저장소\분석참고자료\DS-Asset_Export_to_JSON.md`

### 1.1 주요 내용

- **지원 에셋 타입**: DataTable, Blueprint, AnimMontage, CurveTable
- **프로젝트 설정 통합**: `편집 → 프로젝트 설정 → 플러그인 → Asset Export to JSON`
- **타임스탬프 익스포트**: 익스포트 히스토리 보관을 위한 타임스탬프 폴더 생성
- **완전한 데이터 추출**:
  - DataTable: 모든 행/열 데이터
  - Blueprint: 변수, 함수, 컴포넌트, 이벤트 그래프 노드 구조
  - AnimMontage: 섹션, 노티파이, 커스텀 프로퍼티, 슬롯 애니메이션
  - CurveTable: RichCurves 및 SimpleCurves 키 데이터

### 1.2 JSON 참조 규칙

**중요**: JSON 파일은 에디터에서 익스포트한 결과물로, 소스 코드처럼 고정된 라인 번호가 없습니다.

#### 올바른 참조 방법

✅ **Asset 이름으로 참조**
```
DT_CharacterStat 어셋의 "hilda" 행
AM_PC_Hilda_B_Skill_SwordStrike 몽타주
GA_Skill_Hilda_SwordStrike_C 블루프린트
```

❌ **라인 번호로 참조하지 않음**
```
DataTable.json:358143-358192  (X)
```

#### JSON 구조 예시

**DataTable.json**:
```json
{
  "AssetName": "DT_CharacterStat",
  "RowStructure": "CharacterStatData",
  "Rows": [
    {
      "RowName": "hilda",
      "Data": {
        "name": "힐다",
        "defaultSkills": ["SK100201", "SK100202", "SK100204"],
        "subSkill": "SK100101",
        "ultimateSkill": "SK100301"
      }
    }
  ]
}
```

**AnimMontage.json**:
```json
{
  "AssetName": "AM_PC_Hilda_B_Skill_SwordStrike",
  "SequenceLength": 1.8,
  "AnimNotifies": [
    {
      "NotifyStateClass": "ANS_SkillCancel_C",
      "TriggerTime": 1.3,
      "Duration": 0.5
    }
  ]
}
```

## 2. JSON 전투 데이터 수집

익스포트된 JSON 데이터에서 어떤 정보를 수집하는지 설명.

### 2.1 DataTable 어셋

언리얼의 데이터 테이블 어셋이 DataTable.json 형태로 익스포트 되어 있으며 주로 스토커의 밸런스 데이터가 있다.

- DT_CharacterStat 필드 정보
  - 기본 스탯 값: Str, Dex, Int, Con, Wis, HP, MP, Mana Regen, Stamina, criticalPer // 소수점 2째자리 까지만 수집
  - 전체 스탯 합계는 75로써 모든 스토커가 동일하다
  - 스킬 ID 목록
    - 기본 스킬 ID 정보: defaultSkills
    - 보조 스킬 ID 정보: subSkill
    - 궁극기 스킬 ID 정보: ultimateSkill
    - 장착 가능 장비 타입: equipableTypes
    - 궁극기 발동 필요 포인트: ultimatePoint
- DT_CharacterAbility 필드 정보
  - 기본 공격(평타) 몽타주 정보: attackMontageMap > {무기정보} > montageArray
- DT_Skill 필드 정보
  - 스킬 ID: RowName
  - 스킬 이름: name
  - 스킬 설명: desc // {} 안의 정보는 변수
  - 스킬 설명에 포함된 변수 값: descValues // 유저에게 텍스트로 전달하기 위한 정보일 뿐 실제 데이터 값은 아니다
  - 스킬의 공격 타입: skillAttackType
  - 스킬의 원소 타입: skillElementType
  - 스킬의 피해 배율: skillDamageRate
  - 스킬 시전 중 걸음 속도 배율: walkSpeedMultiplier // 0이면 원래 속도로 걸어감
  - 스킬 시전 시간: castingTime // 0이면 시전시간 없음
  - 스킬의 마나 비용: manaCost
  - 스킬 재사용 대기시간(초): coolTime
  - 스킬에 지정된 몽타주 정보: useMontages
    - 지정된 몽타주가 2개 이상일 경우 제외할 몽타주: ready, Equip, Equipment, _E, // 몽타주 이름에 해당 키워드가 있다면 수집, 분석에서 제외
  - 스킬 스택 여부: bIsStackable
  - 스킬의 최대 스택 수: maxStackCount // 0이면 스택 기능 없음
  - 스킬의 궁극기 여부: bIsUltimate
  - 스킬 시전(캐스팅포함) 결과에 따른 BP 정보: abilityClass
  - 스킬의 캐스팅 결과에 따른 BP: activeAbilityClass // 즉, 캐스팅 로직을 탄 스킬은 이 BP까지 실행 된다
  - 스킬 효과 유지 시간(초): activeDuration // 발동 효과가 특정 시간 동안 유지되는 경우에 사용
  - 스킬에 적용할 GameplayEffect 목록: gameplayEffectSet

### 2.2 AnimMontage 어셋

언리얼의 애니메이션 몽타주 어셋이 AnimMontage.json 형태로 익스포트 되어 있으며, 스토커의 실질적인 모션 타이밍 데이터가 있다.
- 기본 공격 몽타주: `DT_CharacterAbility` 데이터 테이블에서 지정 된다.
- 스킬 공격 몽타주: `DT_Skill` 데이터 테이블에서 지정 된다.

#### 2.2.1 공통 수집 필드

- 어셋 이름: AssetName
- 시퀀스 길이(초): SequenceLength 
- 재생 속도: RateScale
- 섹션 목록: Sections
  - 섹션 이름: SectionName
  - 섹션 시작 시간: StartTime 
- 주요 AnimNotifies 정보: 모든 AnimNotifies를 수집하는 것이 아니라 지정한 AnimNotifies에 대해서만 정보를 수집 한다.

#### 2.2.2 수집 할 주요 AnimNotifies 및 CustomProperties

해당 AnimNotifies가 AnimMontage 내에 있을 경우 정보를 수집한다.

- ANS_AttackState_C: 공격 상태 및 피해 배율
  - TriggerTime: 시작 시간 (초)
  - Duration: 지속 시간 (초)
  - AddNormalAttackPer: 피해 배율 증감 (%)
- AnimNotifyState_AttackWithEquip: 히트 판정 타이밍
  - TriggerTime: 시작 시간 (초)
  - Duration: 지속 시간 (초)
  - AttackTag: 공격 타입 태그
- ANS_SkillCancel_C: 스킬 캔슬 윈도우
  - TriggerTime: 시작 시간 (초)
  - Duration: 지속 시간 (초)
- AN_Trigger_Projectile_Shot_C: 발사체 발사
  - TriggerTime: 시작 시간 (초)
  - EventTag