분석 v2.1
This commit is contained in:
745
ARCHITECTURE.md
745
ARCHITECTURE.md
@ -722,6 +722,747 @@ if isinstance(val, float):
|
||||
|
||||
---
|
||||
|
||||
## 📊 12. v2 분석 프로세스 (4단계 파이프라인)
|
||||
|
||||
### 12.1 프로세스 개요
|
||||
|
||||
v2 분석 시스템은 JSON 원본 데이터에서 최종 밸런스 리포트까지 4단계 파이프라인으로 구성됩니다.
|
||||
|
||||
```
|
||||
[원본 JSON] → [01단계] → [02단계] → [03단계] → [04단계]
|
||||
기본데이터 DPS계산 역할비교 밸런스티어
|
||||
```
|
||||
|
||||
**출력 구조**:
|
||||
```
|
||||
분석결과/YYYYMMDD_HHMMSS_v2/
|
||||
├── 01_스토커별_기본데이터_v2.md # 01단계 출력
|
||||
├── 02_DPS_시나리오_비교분석_v2.md # 02단계 출력
|
||||
├── 03_역할별_차별화_v2.md # 03단계 출력
|
||||
├── 04_밸런스_티어_및_개선안_v2.md # 04단계 출력
|
||||
├── intermediate_data.json # 중간 데이터
|
||||
├── validated_data.json # 검증된 데이터
|
||||
└── 검증_리포트.md # 검증 리포트
|
||||
```
|
||||
|
||||
### 12.2 01단계: 스토커별 기본 데이터
|
||||
|
||||
#### 목적
|
||||
- JSON 원본에서 10명 스토커의 기본 정보 추출 및 검증
|
||||
- 평타, 스킬, 소환체 데이터 문서화
|
||||
|
||||
#### 입력
|
||||
- `원본데이터/DataTable.json`
|
||||
- `원본데이터/Blueprint.json`
|
||||
- `원본데이터/AnimMontage.json`
|
||||
|
||||
#### 출력
|
||||
- `01_스토커별_기본데이터_v2.md`
|
||||
- `validated_data.json`
|
||||
|
||||
#### 실행 스크립트
|
||||
```bash
|
||||
cd 분석도구/v2
|
||||
python extract_stalker_data_v2.py
|
||||
python validate_stalker_data.py
|
||||
python generate_stalker_docs_v2.py
|
||||
```
|
||||
|
||||
#### 핵심 알고리즘
|
||||
|
||||
**1. 공격 스킬 판정 (우선순위)**:
|
||||
```python
|
||||
# Priority 1: NotifyName 키워드
|
||||
if any(keyword in notify_name for keyword in ['AttackWithEquip', 'Projectile', 'SkillActive']):
|
||||
is_attack = True
|
||||
|
||||
# Priority 2: CustomProperties.NotifyName
|
||||
custom_notify_name = custom_props.get('NotifyName', '')
|
||||
if any(keyword in custom_notify_name for keyword in ATTACK_KEYWORDS):
|
||||
is_attack = True
|
||||
|
||||
# Priority 3: NotifyClass 키워드
|
||||
if any(keyword in notify_class for keyword in ATTACK_KEYWORDS):
|
||||
is_attack = True
|
||||
|
||||
# Priority 4: SimpleSendEvent Event Tag
|
||||
if 'SimpleSendEvent' in notify_class:
|
||||
event_tag = custom_props.get('Event Tag', '')
|
||||
if 'Event.SkillActivate' in event_tag or 'Event.SpawnProjectile' in event_tag:
|
||||
is_attack = True
|
||||
```
|
||||
|
||||
**2. 시퀀스 길이 계산**:
|
||||
```python
|
||||
def calculate_sequence_length(skill_id, montage_data):
|
||||
# 1. 키워드 제외 (Ready, Equipment)
|
||||
# 2. 특정 몽타주 제외 (exclude_montages 설정)
|
||||
# 3. 인덱스 제외 (exclude_montage_indices 설정)
|
||||
# 4. 평균 계산 (average_skills 설정)
|
||||
|
||||
if skill_id in average_skills:
|
||||
return sum(durations) / len(durations), True
|
||||
else:
|
||||
return sum(durations), False
|
||||
```
|
||||
|
||||
**3. 소환체 공격 사이클**:
|
||||
```python
|
||||
# 순차 루프 계산 (1→2→3→1→2→3...)
|
||||
total_cycle = sum(montage_durations)
|
||||
cycle_count = active_duration / total_cycle
|
||||
attack_count = cycle_count * len(montages)
|
||||
```
|
||||
|
||||
#### 검증 체크리스트
|
||||
- [ ] 10명 스토커 모두 추출됨
|
||||
- [ ] 모든 스토커 스탯 합계 = 75
|
||||
- [ ] 궁극기 10개 확인
|
||||
- [ ] 공격 스킬 vs 유틸리티 분류 정확성
|
||||
- [ ] 시퀀스 길이 0이 아닌 값
|
||||
- [ ] 소환체 데이터 (Ifrit, Shiva)
|
||||
- [ ] DoT 스킬 4개 (Poison, Burn, Bleed)
|
||||
|
||||
### 12.3 02단계: DPS 시나리오 비교분석
|
||||
|
||||
#### 목적
|
||||
- 3개 DPS 시나리오 계산 (평타, 로테이션, 버스트)
|
||||
- 특수 상황 분석 (DoT, 소환체, 패링)
|
||||
- 신규 스토커 중심 상세 분석
|
||||
|
||||
#### 입력
|
||||
- `validated_data.json` (01단계 출력)
|
||||
- `config.py` (BaseDamage 계산 설정)
|
||||
|
||||
#### 출력
|
||||
- `02_DPS_시나리오_비교분석_v2.md`
|
||||
|
||||
#### 실행 스크립트
|
||||
```bash
|
||||
cd 분석도구/v2
|
||||
python calculate_dps_scenarios_v2.py
|
||||
```
|
||||
|
||||
#### BaseDamage 계산식
|
||||
|
||||
**레벨 20, 기어스코어 400 기준**:
|
||||
|
||||
```python
|
||||
# 물리 딜러
|
||||
Physical_BaseDamage = (주스탯 + 80) × 1.20
|
||||
# 주스탯: STR or DEX
|
||||
# 80: 장비 보너스
|
||||
# 1.20: 룬 효과 (+10% 물리 + +10% 스킬)
|
||||
|
||||
# 마법 딜러
|
||||
Magical_BaseDamage = (INT + 80) × 1.10
|
||||
# 1.10: 룬 효과 (+10% 마법)
|
||||
|
||||
# 탱커/서포터
|
||||
Support_BaseDamage = (주스탯 + 80) × 1.00
|
||||
# 생존력 중심 (피해 증가 룬 없음)
|
||||
```
|
||||
|
||||
#### 시나리오 1: 평타 DPS
|
||||
|
||||
**목적**: 순수 평타만으로 지속 딜 측정
|
||||
|
||||
**계산식**:
|
||||
```python
|
||||
평타_DPS = (BaseDamage × 평타배율합계) / 콤보시간
|
||||
|
||||
# 예: Rio
|
||||
# BaseDamage = (25 + 80) × 1.20 = 126
|
||||
# 평타배율합계 = (1.0 - 0.3) + (1.0 - 0.2) + (1.0 - 0.15) = 2.15
|
||||
# 콤보시간 = 1.17 + 1.33 + 1.37 = 3.87초
|
||||
# 평타_DPS = (126 × 2.15) / 3.87 = 69.9
|
||||
```
|
||||
|
||||
**특수 처리**:
|
||||
```python
|
||||
# Urud, Lian: Reload
|
||||
평타_DPS_with_reload = 평타_DPS × (발사횟수 / (발사시간 + reload시간))
|
||||
|
||||
# Lian: Charging
|
||||
평타_DPS_charged = (BaseDamage × 1.5) / (충전시간 + 발사시간)
|
||||
```
|
||||
|
||||
#### 시나리오 2: 스킬 로테이션 DPS (30초)
|
||||
|
||||
**목적**: 스킬 + 평타 조합한 실전 DPS
|
||||
|
||||
**계산식**:
|
||||
```python
|
||||
로테이션_DPS = (30초간_총_피해량) / 30초
|
||||
|
||||
# 스킬 사용 횟수
|
||||
스킬_사용횟수 = floor((30초 - castingTime) / (coolTime + 시퀀스길이))
|
||||
|
||||
# 평타 필러 시간
|
||||
평타_필러_시간 = 30초 - sum(스킬_사용시간)
|
||||
```
|
||||
|
||||
**로테이션 규칙**:
|
||||
1. 유틸리티 스킬 제외 (isUtility=True)
|
||||
2. 쿨타임 짧은 순서로 우선 사용
|
||||
3. 마나 관리: 0.2/초 + 룬 +70% = 0.34/초
|
||||
4. 스킬 쿨타임 중 평타 사용
|
||||
|
||||
**DoT 피해 추가**:
|
||||
```python
|
||||
# Poison/Burn: 대상 MaxHP 비례
|
||||
DoT_피해 = 대상_MaxHP × DoT_rate × (30초 / DoT_duration)
|
||||
|
||||
# Bleed: 고정 피해
|
||||
DoT_피해 = 고정피해 × (30초 / DoT_duration)
|
||||
```
|
||||
|
||||
**소환체 피해 추가**:
|
||||
```python
|
||||
# Ifrit: 20초 지속, 8.29초 사이클
|
||||
Ifrit_공격횟수 = 20초 / 8.29초 × 3개 = ~7.2회
|
||||
Ifrit_피해 = 7.2 × BaseDamage × 1.2
|
||||
|
||||
# Shiva: 60초 지속, 2.32초 사이클
|
||||
Shiva_공격횟수 = 30초 / 2.32초 = ~12.9회
|
||||
Shiva_피해 = 12.9 × BaseDamage × 0.8
|
||||
```
|
||||
|
||||
#### 시나리오 3: 버스트 DPS (10초)
|
||||
|
||||
**목적**: 궁극기 포함 최대 화력
|
||||
|
||||
**계산식**:
|
||||
```python
|
||||
버스트_DPS = (궁극기_피해 + 모든_스킬_피해 + 평타_피해) / 10초
|
||||
```
|
||||
|
||||
**조건**:
|
||||
- 모든 스킬 쿨타임 완료 상태
|
||||
- 마나 제한 무시 (풀 마나 50 + 회복)
|
||||
- 최적 순서로 스킬 사용
|
||||
|
||||
**유틸리티 궁극기 처리**:
|
||||
```python
|
||||
# Lian: 폭우 (쿨타임 -50%, 15초)
|
||||
버스트기간 = 10초
|
||||
스킬_추가사용 = 쿨타임_50%_감소로_인한_추가_발동
|
||||
|
||||
# Hilda: 핏빛 달 (공격력 +15, 20초)
|
||||
버스트기간내_스킬피해 = (BaseDamage + 15) × 스킬배율
|
||||
```
|
||||
|
||||
#### 특수 상황 분석
|
||||
|
||||
**1. DoT DPS (대상 HP별)**:
|
||||
```python
|
||||
DoT_DPS_table = {
|
||||
'100HP': {
|
||||
'Poison': 100 × 0.20 / 5 = 4 DPS,
|
||||
'Burn': 100 × 0.10 / 3 = 3.33 DPS
|
||||
},
|
||||
'500HP': {
|
||||
'Poison': 500 × 0.20 / 5 = 20 DPS,
|
||||
'Burn': 500 × 0.10 / 3 = 16.67 DPS
|
||||
},
|
||||
'1000HP': {
|
||||
'Poison': 1000 × 0.20 / 5 = 40 DPS,
|
||||
'Burn': 1000 × 0.10 / 3 = 33.33 DPS
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**2. 소환체 독립 DPS**:
|
||||
```python
|
||||
# Ifrit (20초 지속)
|
||||
Ifrit_DPS = (BaseDamage × 1.2 × 7.2회) / 20초
|
||||
|
||||
# Shiva (60초 지속)
|
||||
Shiva_DPS = (BaseDamage × 0.8 × 25.9회) / 60초
|
||||
```
|
||||
|
||||
**3. 패링 시나리오 (Cazimord)**:
|
||||
```python
|
||||
# 패링 0%
|
||||
DPS_no_parry = 기본_로테이션_DPS
|
||||
|
||||
# 패링 50% (5회/10회 성공)
|
||||
쿨감_효과 = 섬광_3.8초 + 날개베기_3.8초 + 작열_6.8초
|
||||
추가_스킬사용 = 쿨감으로_인한_추가_발동
|
||||
DPS_50_parry = 기본_DPS + 추가_스킬_DPS
|
||||
|
||||
# 패링 100% (10회/10회 성공)
|
||||
DPS_100_parry = 기본_DPS + (추가_스킬_DPS × 2)
|
||||
```
|
||||
|
||||
#### 출력 구조
|
||||
|
||||
**시나리오별 비교표**:
|
||||
```markdown
|
||||
## 시나리오 1: 평타 DPS
|
||||
|
||||
| 순위 | 스토커 | BaseDamage | 평타 DPS | 특수 처리 |
|
||||
|------|--------|------------|----------|-----------|
|
||||
| 1 | Rio | 126 | 69.9 | Chain Score 3스택 |
|
||||
| ... |
|
||||
|
||||
## 시나리오 2: 스킬 로테이션 DPS (30초)
|
||||
|
||||
| 순위 | 스토커 | 로테이션 DPS | 주요 스킬 | DoT/소환체 |
|
||||
|------|--------|--------------|-----------|------------|
|
||||
| 1 | Cazimord | 221 | 섬광+날개베기+작열 | - |
|
||||
| ... |
|
||||
|
||||
## 시나리오 3: 버스트 DPS (10초)
|
||||
|
||||
| 순위 | 스토커 | 버스트 DPS | 궁극기 | 특징 |
|
||||
|------|--------|------------|--------|------|
|
||||
| 1 | Cazimord | 256 | 칼날폭풍 (10.0배) | 단일 최강 |
|
||||
| ... |
|
||||
```
|
||||
|
||||
**신규 스토커 상세 분석** (Cazimord):
|
||||
```markdown
|
||||
## 신규 스토커 상세 분석: Cazimord
|
||||
|
||||
### 평타 DPS
|
||||
- 3타 콤보: ...
|
||||
- 타임라인: 0초 1타 → 1.67초 2타 → 3.57초 3타 → 5.44초 반복
|
||||
|
||||
### 30초 로테이션
|
||||
**타임라인**:
|
||||
```
|
||||
0.0초: 작열 시전 (2초 casting + 2.43초)
|
||||
4.43초: 평타 콤보 시작
|
||||
9.87초: 섬광 (1.73초)
|
||||
11.6초: 날개베기 (2.00초)
|
||||
13.6초: 평타 콤보
|
||||
...
|
||||
```
|
||||
|
||||
**패링 영향**:
|
||||
- 패링 0%: 221 DPS
|
||||
- 패링 50%: 245 DPS (+10.9%)
|
||||
- 패링 100%: 268 DPS (+21.3%)
|
||||
|
||||
### 버스트 DPS (10초)
|
||||
**궁극기 칼날폭풍**:
|
||||
- 12연타: 80% × 10회 + 100% × 2회 = 10.0배
|
||||
- 타임라인: ...
|
||||
```
|
||||
|
||||
#### 검증 체크리스트
|
||||
- [ ] 10명 스토커 모두 3개 시나리오 계산됨
|
||||
- [ ] BaseDamage 계산 정확성
|
||||
- [ ] 평타 배율 합계 정확성
|
||||
- [ ] 스킬 로테이션 마나 부족 없음
|
||||
- [ ] DoT 피해 대상 HP별 표시
|
||||
- [ ] 소환체 공격 횟수 정확성
|
||||
- [ ] 신규 스토커 상세 타임라인 포함
|
||||
|
||||
### 12.4 03단계: 역할별 차별화
|
||||
|
||||
#### 목적
|
||||
- 5개 역할군 비교 (전사, 원거리, 마법사, 암살자, 서포터)
|
||||
- 동일 역할 내 차별화 포인트 분석
|
||||
|
||||
#### 입력
|
||||
- `02_DPS_시나리오_비교분석_v2.md` (DPS 데이터)
|
||||
- `validated_data.json` (스킬 데이터)
|
||||
|
||||
#### 출력
|
||||
- `03_역할별_차별화_v2.md`
|
||||
|
||||
#### 역할군 분류
|
||||
|
||||
| 역할군 | 스토커 | 인원 |
|
||||
|--------|--------|------|
|
||||
| **전사** | Hilda, Baran, Cazimord | 3명 |
|
||||
| **원거리** | Urud, Lian | 2명 |
|
||||
| **마법사** | Nave, Rene | 2명 |
|
||||
| **암살자** | Rio, Sinobu | 2명 |
|
||||
| **서포터** | Clad | 1명 |
|
||||
|
||||
#### 분석 항목
|
||||
|
||||
**각 역할군마다**:
|
||||
1. **공통점**: 무기, 공격타입, 룬효과, 평타콤보
|
||||
2. **스탯 비교**: STR/DEX/INT/CON/WIS, BaseDamage, DPS
|
||||
3. **스킬 구성 비교**: 쿨타임, 배율, 특수효과
|
||||
4. **차별화 포인트**: 핵심 시스템, 강점/약점, 플레이스타일
|
||||
|
||||
#### 출력 구조
|
||||
|
||||
```markdown
|
||||
## 1. 전사 (Warriors) - 3명 비교
|
||||
|
||||
### 공통점
|
||||
| 항목 | 공통 특성 |
|
||||
|------|----------|
|
||||
| **무기 타입** | 근접 무기 |
|
||||
| **공격 타입** | Physical 피해 |
|
||||
|
||||
### 스탯 비교
|
||||
| 스토커 | STR | DEX | BaseDamage | 평타 DPS | 로테이션 DPS |
|
||||
|--------|-----|-----|------------|----------|--------------|
|
||||
| Hilda | 20 | 15 | 120 | 69.9 | 117 |
|
||||
| Baran | 25 | 10 | 126 | 84.2 | 128 |
|
||||
| Cazimord | 15 | 25 | 126 | 91.5 | 221 |
|
||||
|
||||
### 차별화 포인트
|
||||
|
||||
#### Hilda - 방어형 탱커
|
||||
- **핵심 시스템**: Blocking
|
||||
- **강점**: 최고 생존력
|
||||
- **약점**: 낮은 DPS
|
||||
- **플레이스타일**: ...
|
||||
|
||||
#### Baran - CC 특화 전사
|
||||
...
|
||||
|
||||
#### Cazimord - 고숙련도 DPS 전사
|
||||
...
|
||||
```
|
||||
|
||||
#### 검증 체크리스트
|
||||
- [ ] 5개 역할군 모두 분석됨
|
||||
- [ ] 각 역할군 공통점 명시
|
||||
- [ ] 스탯/DPS 비교표 정확성
|
||||
- [ ] 차별화 포인트 명확함
|
||||
- [ ] 신규 스토커 역할 위치 명확
|
||||
|
||||
### 12.5 04단계: 밸런스 티어 및 개선안
|
||||
|
||||
#### 목적
|
||||
- 종합 티어 평가 (OP/S+/S/A/B)
|
||||
- DPS, 유틸리티별 티어
|
||||
- 밸런스 개선안 제시
|
||||
|
||||
#### 입력
|
||||
- `02_DPS_시나리오_비교분석_v2.md` (DPS 데이터)
|
||||
- `03_역할별_차별화_v2.md` (역할 분석)
|
||||
|
||||
#### 출력
|
||||
- `04_밸런스_티어_및_개선안_v2.md`
|
||||
|
||||
#### 티어 기준
|
||||
|
||||
**종합 티어** (DPS + 유틸리티):
|
||||
- **OP** (Overpowered): 과도한 성능, 즉시 조정 필요
|
||||
- **S+**: 최상위, 역할 모델
|
||||
- **S**: 상위, 경쟁력 우수
|
||||
- **A**: 중상위, 밸런스 양호
|
||||
- **B**: 중하위, 개선 필요
|
||||
|
||||
**평가 지표**:
|
||||
```python
|
||||
종합_점수 = (로테이션_DPS × 0.4) + (버스트_DPS × 0.3) + (유틸리티_점수 × 0.3)
|
||||
|
||||
# 유틸리티 점수 (0~20점)
|
||||
유틸리티_점수 = CC점수 + 생존력점수 + 기동성점수 + 팀기여점수
|
||||
```
|
||||
|
||||
#### 출력 구조
|
||||
|
||||
```markdown
|
||||
## 1. 종합 티어표
|
||||
|
||||
| 티어 | 스토커 | 로테이션 DPS | 유틸리티 | 주요 강점 | 밸런스 상태 |
|
||||
|------|--------|--------------|----------|-----------|-------------|
|
||||
| **OP** | Rio | 268 | 13점 | 압도적 DPS | ⚠️ 너프 필요 |
|
||||
| **S+** | Cazimord | 221 | 15점 | 버스트 1위 | ✅ 양호 |
|
||||
| ... |
|
||||
|
||||
## 2. DPS 티어별 분석
|
||||
|
||||
### OP 티어 (너프 필요)
|
||||
**Rio**:
|
||||
- 현재 DPS: 268
|
||||
- 문제점: 2위보다 +21% 과다
|
||||
- 개선안:
|
||||
1. Chain Score 배율 감소 (150% → 100%)
|
||||
2. 연속 찌르기 쿨타임 증가 (3.5초 → 5초)
|
||||
3. 예상 DPS: 220 (-18%)
|
||||
|
||||
### B 티어 (버프 필요)
|
||||
**Urud**:
|
||||
- 현재 DPS: 82
|
||||
- 문제점: Reload 페널티 과다
|
||||
- 개선안:
|
||||
1. 재장전 시간 감소 (2.0초 → 1.5초)
|
||||
2. 탄약 증가 (6발 → 8발)
|
||||
3. 예상 DPS: 105 (+28%)
|
||||
```
|
||||
|
||||
#### 검증 체크리스트
|
||||
- [ ] 10명 모두 티어 배정됨
|
||||
- [ ] 티어 기준 명확함
|
||||
- [ ] DPS 격차 분석 정확성
|
||||
- [ ] 개선안 구체적 (수치 포함)
|
||||
- [ ] 예상 DPS 재계산됨
|
||||
|
||||
### 12.6 전체 프로세스 검증
|
||||
|
||||
#### 일관성 체크
|
||||
- [ ] 01~04단계 스토커 순서 동일
|
||||
- [ ] 01단계 BaseDamage = 02단계 BaseDamage
|
||||
- [ ] 02단계 DPS = 03단계 DPS
|
||||
- [ ] 03단계 분석 = 04단계 티어 근거
|
||||
|
||||
#### 데이터 무결성
|
||||
- [ ] 중간 파일 존재 (intermediate_data.json, validated_data.json)
|
||||
- [ ] 모든 스킬 ID 일치
|
||||
- [ ] 소환체/DoT 데이터 누락 없음
|
||||
|
||||
#### 문서 품질
|
||||
- [ ] Markdown 형식 정확성
|
||||
- [ ] 표 정렬 일관성
|
||||
- [ ] 계산식 명시
|
||||
- [ ] 출처 표시
|
||||
|
||||
---
|
||||
|
||||
## 📊 13. v2.1 업데이트 - 콤보 캔슬 시스템 발견 (2025-10-28)
|
||||
|
||||
### 13.1 주요 발견사항
|
||||
|
||||
#### 13.1.1 콤보 캔슬 시스템 (Game Changer!)
|
||||
|
||||
**발견 배경**:
|
||||
- AnimMontage.json 분석 중 `ANS_DisableBlockingState_C` 노티파이 발견
|
||||
- 특정 스토커의 평타 모션에서 조기 캔슬이 가능함을 확인
|
||||
|
||||
**노티파이 구조**:
|
||||
```json
|
||||
{
|
||||
"NotifyName": "ANS_DisableBlockingState_C",
|
||||
"TriggerTime": 2.73,
|
||||
"Duration": 1.0,
|
||||
"NotifyType": "NotifyState",
|
||||
"NotifyStateClass": "ANS_DisableBlockingState_C"
|
||||
}
|
||||
```
|
||||
|
||||
**캔슬 가능 시점 계산**:
|
||||
```python
|
||||
cancellable_time = TriggerTime + Duration
|
||||
# 예: 2.73 + 1.0 = 3.73초
|
||||
|
||||
# 원본 actualDuration: 4.57초
|
||||
# 캔슬 시간: 3.73초
|
||||
# 시간 단축: (4.57 - 3.73) / 4.57 = 18.4% ≈ 19%
|
||||
```
|
||||
|
||||
**적용 대상 스토커**:
|
||||
|
||||
| 스토커 | 무기 타입 | 원본 시간 | 캔슬 시간 | 단축율 | DPS 변화 |
|
||||
|--------|-----------|-----------|-----------|--------|----------|
|
||||
| **클라드** | oneHandWeapon (Mace) | 4.17초 | 1.84초 | **56%** 🔥 | 52.9 → 125.5 (+137%) |
|
||||
| **힐다** | weaponShield | 4.57초 | 3.69초 | 19% | 87.3 → 107.3 (+23%) |
|
||||
| **바란** | twoHandWeapon | 5.53초 | 4.48초 | 19% | 79.0 → 90.4 (+14%) |
|
||||
|
||||
**영향도 분석**:
|
||||
- **클라드**: 서포터임에도 **평타 DPS 1위** 달성 (125.5)
|
||||
- **힐다**: 탱커 중 최고 DPS 달성 (107.3)
|
||||
- **바란**: 중상위권으로 상승 (90.4)
|
||||
|
||||
#### 13.1.2 바란 궁극기 시전시간 정정
|
||||
|
||||
**문제점**:
|
||||
- DT_Skill에서 castingTime: 10초로 표기
|
||||
- 실제로는 즉발이 아님
|
||||
|
||||
**해결**:
|
||||
AnimMontage.json의 `AN_SimpleSendEvent_C` 노티파이 확인
|
||||
```json
|
||||
{
|
||||
"NotifyClass": "AN_SimpleSendEvent_C",
|
||||
"TriggerTime": 1.2927,
|
||||
"CustomProperties": {
|
||||
"Event Tag": "(TagName=\"Ability.Attack.Ready\")"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**정정 내용**:
|
||||
- **실제 시전시간**: 1.29초 (AN_SimpleSendEvent TriggerTime)
|
||||
- **10초의 의미**: 최대 홀딩 시간 (대검을 들고 있으면서 타이밍 조절 가능)
|
||||
- **DPS 영향**: 버스트 DPS 128.5 → 123.3 (-4%)
|
||||
|
||||
**스크립트 자동 처리**:
|
||||
```python
|
||||
# extract_stalker_data_v2.py (line 669-679)
|
||||
if skill_id == 'SK130301': # 바란 궁극기
|
||||
for montage_data in skill_data['montageData']:
|
||||
for notify in montage_data.get('allNotifies', []):
|
||||
if 'SimpleSendEvent' in notify.get('NotifyClass', ''):
|
||||
event_tag = notify.get('CustomProperties', {}).get('Event Tag', '')
|
||||
if 'Ability.Attack.Ready' in event_tag:
|
||||
trigger_time = notify.get('TriggerTime', 0)
|
||||
skill_data['castingTime'] = round(trigger_time, 2)
|
||||
break
|
||||
```
|
||||
|
||||
#### 13.1.3 레네 궁극기 실전 필수화
|
||||
|
||||
**배경**:
|
||||
- 초기 분석: 궁극기 제외 (순수 DPS 우선)
|
||||
- 실제 플레이: 흡혈 50% 효과로 생존 필수
|
||||
|
||||
**궁극기 효과**:
|
||||
- 마석 '붉은 축제' (SK160301)
|
||||
- 시전시간: 1.5초
|
||||
- 지속시간: 20초
|
||||
- 효과: 자신과 아군 모든 공격에 흡혈 50%
|
||||
|
||||
**DPS 트레이드오프**:
|
||||
- **이전 (궁극기 제외)**: 186.4 DPS (15초 버스트 1위)
|
||||
- **현재 (궁극기 포함)**: 136.7 DPS (15초 버스트 4위)
|
||||
- **감소율**: -26.6%
|
||||
- **보상**: 생존력 확보 (실전 필수)
|
||||
|
||||
### 13.2 버스트 시나리오 확대 (10초 → 15초)
|
||||
|
||||
**변경 이유**:
|
||||
1. 궁극기 시전시간 포함 시 10초 부족
|
||||
2. 대부분 궁극기 지속시간 15초 이상
|
||||
3. 실전 버스트 상황에 더 부합
|
||||
|
||||
**새로운 버스트 DPS 순위** (15초):
|
||||
|
||||
| 순위 | 스토커 | 15초 DPS | 궁극기 | 주요 변화 |
|
||||
|------|--------|----------|--------|----------|
|
||||
| 1 | 카지모르드 | 165.1 | ✅ | 2위 → 1위 (Parrying + 궁극기) |
|
||||
| 2 | 리오 | 146.9 | ✅ | 변동 없음 |
|
||||
| 3 | 시노부 | 142.7 | ❌ | 변동 없음 (궁극기 제외) |
|
||||
| 4 | **레네** | 136.7 | ✅ | **1위 → 4위** (흡혈 생존력) |
|
||||
| 5 | 클라드 | 125.4 | ❌ | 변동 없음 (콤보 캔슬) |
|
||||
| 6 | **바란** | 123.3 | ✅ | **5위 → 6위** (시전시간 정정) |
|
||||
|
||||
### 13.3 config.py 업데이트 내용
|
||||
|
||||
**추가된 설정**:
|
||||
|
||||
```python
|
||||
# 콤보 캔슬 시스템 (v2.1)
|
||||
COMBO_CANCEL_STALKERS = {
|
||||
'hilda': {
|
||||
'weapons': ['weaponShield'],
|
||||
'patterns': ['AM_PC_Hilda_B_Attack_W01_'],
|
||||
'time_reduction': 0.19, # 19% 시간 단축
|
||||
'description': '3타 콤보 캔슬 (4.57s → 3.69s)'
|
||||
},
|
||||
'baran': {
|
||||
'weapons': ['twoHandWeapon'],
|
||||
'patterns': ['AM_PC_Baran_B_Attack_W01_'],
|
||||
'time_reduction': 0.19,
|
||||
'description': '평타 콤보 캔슬 (5.53s → 4.48s)'
|
||||
},
|
||||
'clad': {
|
||||
'weapons': ['oneHandWeapon'],
|
||||
'patterns': ['AM_PC_Clad_Base_Attack_Mace'],
|
||||
'time_reduction': 0.56, # 56% 시간 단축 (극적!)
|
||||
'description': '평타 콤보 캔슬 (4.17s → 1.84s)'
|
||||
}
|
||||
}
|
||||
|
||||
# 특수 궁극기 처리 (v2.1)
|
||||
SPECIAL_ULTIMATE_HANDLING = {
|
||||
'SK130301': { # 바란 - 일격분쇄
|
||||
'stalker': 'baran',
|
||||
'use_an_simplesendevent_time': True,
|
||||
'event_tag': 'Ability.Attack.Ready',
|
||||
'description': 'AN_SimpleSendEvent 시점(1.29초)이 실제 발동 시간'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 13.4 extract_stalker_data_v2.py 업데이트
|
||||
|
||||
**콤보 캔슬 추출 로직** (line 277-415):
|
||||
```python
|
||||
def extract_anim_montages(montages: List[Dict]) -> Dict[str, Dict]:
|
||||
# 콤보 캔슬 적용 대상 스토커 및 패턴
|
||||
CANCEL_TARGETS = {
|
||||
'hilda': ['AM_PC_Hilda_B_Attack_W01_'],
|
||||
'baran': ['AM_PC_Baran_B_Attack_W01_'],
|
||||
'clad': ['AM_PC_Clad_Base_Attack_Mace']
|
||||
}
|
||||
|
||||
for montage in pc_montages:
|
||||
# 콤보 캔슬 적용 대상 판별
|
||||
is_cancel_target = False
|
||||
for stalker_name, patterns in CANCEL_TARGETS.items():
|
||||
for pattern in patterns:
|
||||
if pattern in asset_name:
|
||||
is_cancel_target = True
|
||||
break
|
||||
|
||||
# ANS_DisableBlockingState_C에서 캔슬 시간 추출
|
||||
if is_cancel_target and 'ANS_DisableBlockingState' in notify_state_class:
|
||||
trigger_time = notify.get('TriggerTime', 0)
|
||||
duration = notify.get('Duration', 0)
|
||||
cancellable_time = trigger_time + duration
|
||||
```
|
||||
|
||||
**바란 궁극기 특수 처리** (line 669-679):
|
||||
```python
|
||||
# 바란 궁극기 특수 처리: AN_SimpleSendEvent 시점을 castingTime으로 사용
|
||||
if skill_id == 'SK130301': # 바란 궁극기 '일격분쇄'
|
||||
for montage_data in skill_data['montageData']:
|
||||
for notify in montage_data.get('allNotifies', []):
|
||||
if 'SimpleSendEvent' in notify.get('NotifyClass', ''):
|
||||
event_tag = notify.get('CustomProperties', {}).get('Event Tag', '')
|
||||
if 'Ability.Attack.Ready' in event_tag:
|
||||
trigger_time = notify.get('TriggerTime', 0)
|
||||
skill_data['castingTime'] = round(trigger_time, 2)
|
||||
print(f" [INFO] {skill_id}: castingTime 오버라이드 {skill_data['castingTime']}초")
|
||||
break
|
||||
```
|
||||
|
||||
### 13.5 02단계 문서 업데이트 내용
|
||||
|
||||
**시나리오 1 - 평타 DPS 순위 변화**:
|
||||
```markdown
|
||||
| 순위 | 스토커 | Raw DPS | 특징 |
|
||||
|------|--------|---------|------|
|
||||
| 1 | **클라드** | **125.5** | ⚡ 콤보 캔슬 (+137% DPS!) |
|
||||
| 2 | **힐다** | **107.3** | ⚡ 콤보 캔슬 (+23%) |
|
||||
| 3 | 시노부 | 97.83 | 표창 충전 시스템 |
|
||||
| 4 | **바란** | **90.4** | ⚡ 콤보 캔슬 (+14%) |
|
||||
```
|
||||
|
||||
**시나리오 2 - 30초 로테이션 변화**:
|
||||
- 클라드: 60.1 → 133.6 DPS (+122%, **7위 → 3위**)
|
||||
- 힐다: 92.1 → 114.1 DPS (+24%)
|
||||
- 바란: 97.9 → 111.4 DPS (+14%)
|
||||
|
||||
**시나리오 3 - 15초 버스트 (신설)**:
|
||||
- 기존 10초 → 15초로 확대
|
||||
- 궁극기 사용 정책 명확화:
|
||||
- 기본: 0초 시점 사용
|
||||
- 예외: 클라드/시노부 (방어 궁극기 제외)
|
||||
- 특수: 카지모르드 (작열 → 섬광 → 궁극기)
|
||||
|
||||
**중간 결론 섹션 신설**:
|
||||
- DPS 기준 종합 티어표 (3개 시나리오 통합 평가)
|
||||
- 밸런스 개선 제안 (C/B티어 수치 조정안)
|
||||
|
||||
### 13.6 검증 체크리스트
|
||||
|
||||
**v2.1 검증 항목**:
|
||||
- [x] 콤보 캔슬 시스템 config.py 추가
|
||||
- [x] 바란 궁극기 특수 처리 스크립트 반영
|
||||
- [x] extract_stalker_data_v2.py 업데이트
|
||||
- [x] 01 문서 바란 궁극기 시전시간 정정
|
||||
- [x] 02 문서 3개 시나리오 콤보 캔슬 반영
|
||||
- [x] 02 문서 15초 버스트 시나리오 재작성
|
||||
- [x] 02 문서 중간 결론 섹션 작성
|
||||
- [x] 종합 티어표 3개 시나리오 통합 평가
|
||||
- [x] 밸런스 개선 제안 (리안, 우르드, 네이브)
|
||||
|
||||
---
|
||||
|
||||
**작성자**: AI-assisted Analysis Team
|
||||
**최종 업데이트**: 2025-10-27
|
||||
**버전**: 1.0
|
||||
**최종 업데이트**: 2025-10-28
|
||||
**버전**: 2.1
|
||||
|
||||
Reference in New Issue
Block a user