Files
maplecontest/docs/superpowers/specs/2026-06-12-job-advancement-design.md

65 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P9 — 전직 시스템 코어 + 전사 2차 설계
날짜: 2026-06-12 (사용자 승인 완료 — P9/P10/P11 3단계 중 1단계)
브랜치: `feature/p9-job-advancement`
## 범위
1. **클래스 모델** — 카드 `class` 필드, 클래스별 카드 풀 필터 (보상·상점)
2. **전직 선택 흐름** — 보스 클리어 시 1차 상태면 [유물] vs [2차 전직] 선택, 전직 시 파이터/페이지/스피어맨 3택
3. **전사 2차 전용 카드 9종** + 신규 메커니즘: 다단히트(`hits`)·방어 무시(`pierce`)·자가 디버프(`selfVuln`)·파워 2종(`energyPerTurn`/`blockPerTurn`)
4. 플레이어 패널·캐릭터 선택의 직업명 표기
비범위: 법사(P10), 승천(P11), 3차 전직.
## 데이터 (data/cards.json)
- 모든 카드에 `class` 필드. 기존 9종 → `"warrior"`.
- 신규 필드: `hits`(타격 횟수), `pierce`(true=방어 무시), `selfVuln`(사용 시 자신에게 취약 N), powerEffect 추가값 `energyPerTurn`/`blockPerTurn`.
신규 카드 9종 (메이플 2차 스킬명 × StS 효과):
| id | 직업 | 이름 | 코스트 | 효과 | StS 참조 |
|----|------|------|--------|------|----------|
| ComboAttack | fighter | 콤보 어택 | 1 | 피해 5 × 2회 | Twin Strike |
| Berserk | fighter | 버서크 | 2 | Power: 매턴 에너지 +1, 사용 시 취약 1 자가 | Berserk |
| RisingAttack | fighter | 라이징 어택 | 2 | 피해 12 | Carnage(경량) |
| ThunderCharge | page | 썬더 차지 | 1 | 피해 7, 약화 1 | Clothesline(경량) |
| BlizzardCharge | page | 블리자드 차지 | 1 | 피해 7, 취약 1 | Bash(경량) |
| PowerGuard | page | 파워 가드 | 1 | 방어도 10 | Shrug It Off(경량) |
| Pierce | spearman | 피어스 | 1 | 피해 9, **방어 무시** | — |
| IronWall | spearman | 아이언 월 | 2 | 방어도 12 | Impervious(경량) |
| HyperBody | spearman | 하이퍼 바디 | 1 | Power: 매턴 방어도 +3 | Metallicize |
전직 시 대표 카드 1장 즉시 지급: fighter→콤보 어택, page→썬더 차지, spearman→피어스.
## 전투 규칙 확장 (Lua + sim 동기화)
- **다단히트**: `total = Σ CalcPlayerAttack(c.damage)` (hits회 반복 — 힘이 타격마다 적용, 펜닙 카운터도 타격마다 증가), 이펙트·팝업은 합산 1회. 취약 배수는 합산값에 적용(단순화 명시).
- **방어 무시**: `DealDamageToTarget(amount, pierce)` — pierce면 block 차감 생략. `PlayAttackFx`에 pierce 전달.
- **selfVuln**: 카드 사용 시 `PlayerVuln += selfVuln`.
- **파워 확장**: StartPlayerTurn 파워 루프에 `energyPerTurn`(Energy +v) · `blockPerTurn`(PlayerBlock +v — 블록 리셋·점토 처리 후).
## 전직 흐름
- 컨트롤러 prop: `PlayerJob`(string, ""=1차). StartRun에서 리셋.
- **카드 풀 필터** (`CardPool` 헬퍼 신설): `c.class == self.SelectedClass or (PlayerJob ~= "" and c.class == PlayerJob)`. OfferReward·ShowShop이 사용.
- **보스 클리어 분기** (CheckCombatEnd): 보스 진행 로직을 `ContinueAfterBoss()`로 추출.
- `PlayerJob == "" and Floor < RunLength``ShowJobChoice()` (선택 후 ContinueAfterBoss)
- 그 외 → 기존 유물 지급 + ContinueAfterBoss (최종 막 클리어 시 전직 무의미 — 생략)
- **JobChoiceHud**: "보스 보상 선택" — [유물 획득](PickNewRelic+AddRelic) / [2차 전직] 버튼 2개.
- **JobSelectHud**: 파이터/페이지/스피어맨 3패널 (직업명·설명·대표 카드명). 선택 → `SetJob(jobId)`: PlayerJob 설정, 대표 카드 RunDeck 추가, 토스트, 패널 닫고 ContinueAfterBoss.
- guid 네임스페이스 `'job'` = 0xe4 (JobChoiceHud·JobSelectHud).
- **직업명 표기**: PlayerPanel/Name = "전사" → 전직 후 "파이터/페이지/스피어맨" (`JobLabel` 헬퍼, StartCombat·SetJob에서 갱신).
## 검증
1. sim-balance: hits/pierce/selfVuln/energyPerTurn/blockPerTurn 재현 + 신규 테스트 5건. rogue-map 9건·기존 21건 유지.
2. 메이커: 빌드 0에러 + 플레이테스트 — 보스 클리어→선택 화면→전직→전용 카드 보상 풀 편입·패널 직업명, 유물 선택 경로, 다단히트/방어무시 동작.
## 결정 사항
- 전직은 런당 1회 (PlayerJob 비가역), 최종 막 보스에선 선택 생략
- 카드 이미지 9종: 공식 maplestory 리소스 메이커 선별 (기존 절차)
- 클래스 필터로 "해당 클래스만 획득" 충족 — 사용 제한은 별도 불요 (얻을 수 없으면 못 씀)