feat(ascension): 승천 시스템 A1~A10 + UserDataStorage 개인 저장 (배포 퀄리티 P11) #46
23
docs/superpowers/plans/2026-06-12-ascension.md
Normal file
23
docs/superpowers/plans/2026-06-12-ascension.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# P11 — 승천 + UserDataStorage 구현 계획
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: superpowers:executing-plans. 설계: `2026-06-12-ascension-design.md`
|
||||
|
||||
### Task 1: 생성기 — ExecSpace 보존 + 서버 RPC 3종
|
||||
- [ ] `for m of Methods: m.ExecSpace = 6` → `if (m.ExecSpace === 0) m.ExecSpace = 6;` (명시값 보존)
|
||||
- [ ] props: `AscensionLevel`(number 0)·`AscensionUnlocked`(number 0)
|
||||
- [ ] `ReqLoadAscension(userId)`[ExecSpace 1]·`RecvAscension(n, userId)`[2]·`SaveAscension(n, userId)`[1] — 설계 코드 그대로, OnBeginPlay(6)에서 LocalPlayer.UserId로 ReqLoad
|
||||
- [ ] 커밋
|
||||
|
||||
### Task 2: 생성기 — 모디파이어·해금·메뉴 UI
|
||||
- [ ] 헬퍼 5종(AscHpMult/AscAtkMult/AscEliteBonus/AscGoldMult/AscStartHpPenalty) + StartRun/BuildMonsters/CheckCombatEnd/RenderRun 적용
|
||||
- [ ] EndRun 클리어 분기: 해금+1·SaveAscension·"런 클리어! 승천 N 해금!"
|
||||
- [ ] MainMenu `AscMinus/AscLabel/AscPlus` + `AdjustAscension`/`RenderAscension` + BindMenuButtons 연결
|
||||
- [ ] 커밋
|
||||
|
||||
### Task 3: 재생성·메이커 검증·PR
|
||||
- [ ] 재생성·테스트 44건 유지·grep -c 카운트 → 커밋
|
||||
- [ ] 메이커: 메뉴 승천 라벨/[-][+]·승천2로 런 시작(HP·적 배율 로그 확인)·강제 클리어→해금+1·재플레이 로드 → 스크린샷
|
||||
- [ ] push → gitea-pr.mjs PR·머지 → main pull → 메모리 갱신
|
||||
|
||||
## Self-Review
|
||||
- RPC 파라미터 any 금지(허용 타입: string/number) 준수 ✓ / RecvAscension 마지막 인자 userId(특정 클라 응답) ✓ / 시뮬 비대상 명시 ✓
|
||||
47
docs/superpowers/specs/2026-06-12-ascension-design.md
Normal file
47
docs/superpowers/specs/2026-06-12-ascension-design.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# P11 — 승천 시스템 + UserDataStorage 설계
|
||||
|
||||
날짜: 2026-06-12 (사용자 승인 — P9/P10/P11 중 3단계)
|
||||
브랜치: `feature/p11-ascension`
|
||||
|
||||
## 범위
|
||||
|
||||
1. **개인별 승천 저장** — `_DataStorageService:GetUserDataStorage(userId)` (유저별 영구, 메이커↔배포 분리). 이 프로젝트 첫 서버-클라 RPC.
|
||||
2. **승천 선택 UI** — 메인 메뉴에서 0~해금치 선택([-]/[+]), 런 클리어 시 해금 +1 (최대 10), 클리어 문구 "승천 N 해금!"
|
||||
3. **승천 모디파이어 A1~A10** (누적):
|
||||
|
||||
| 단계 | 효과 | 단계 | 효과 |
|
||||
|---|---|---|---|
|
||||
| A1 | 적 HP +10% | A6 | 적 HP 추가 +10% |
|
||||
| A2 | 적 피해 +10% | A7 | 적 피해 추가 +10% |
|
||||
| A3 | 시작 HP -10 | A8 | 시작 HP 추가 -10 |
|
||||
| A4 | 정예·보스 배율 +0.2 | A9 | 정예·보스 배율 추가 +0.2 |
|
||||
| A5 | 승리 메소 -25% | A10 | 승리 메소 추가 -25% |
|
||||
|
||||
4. TopBar에 `· 승천N` 표시 (0이면 생략)
|
||||
|
||||
## 서버-클라 구조 (ExecSpace)
|
||||
|
||||
codeblock JSON ExecSpace는 플래그 (실측: Server=1·Client=2·ClientOnly=6 — Monster(1)·UIToast/MapCamera(6) 부합):
|
||||
|
||||
- `ReqLoadAscension(userId)` **[Server=1]** — 클라 OnBeginPlay에서 호출 → 서버에서 `GetAndWait("ascensionUnlocked")` → `RecvAscension(n, userId)` 호출
|
||||
- `RecvAscension(n, userId)` **[Client=2]** — 마지막 파라미터 userId로 **요청한 클라이언트에만** 응답 (MSW 공식 패턴) → `AscensionUnlocked` 갱신·메뉴 렌더
|
||||
- `SaveAscension(n, userId)` **[Server=1]** — `SetAndWait`
|
||||
- 생성기의 `m.ExecSpace = 6` 일괄 적용을 "명시값(≠0)은 보존"으로 수정
|
||||
|
||||
## 적용 지점
|
||||
|
||||
- `StartRun`: 시작 HP에서 A3/A8 차감, `AscensionLevel`은 메뉴 선택값 유지
|
||||
- `BuildMonsters`: maxHp ×(1+A1/A6), Attack 인텐트 ×(1+A2/A7), elite/boss 그룹이면 막 배율 +A4/A9
|
||||
- `CheckCombatEnd`: 승리 메소 ×(1-A5/A10) floor
|
||||
- `EndRun("런 클리어!")`: `AscensionLevel >= AscensionUnlocked and Unlocked < 10`이면 해금+1·저장·결과 문구 교체
|
||||
- 헬퍼: `AscHpMult`/`AscAtkMult`/`AscEliteBonus`/`AscGoldMult`/`AscStartHpPenalty`
|
||||
|
||||
## UI (MainMenu)
|
||||
|
||||
- `AscRow`: `AscMinus`[-] · `AscLabel`("승천 L / 해금 U") · `AscPlus`[+] — 새 게임 버튼 아래
|
||||
- `AdjustAscension(delta)` clamp 0..Unlocked, `RenderAscension`
|
||||
|
||||
## 검증
|
||||
|
||||
1. 시뮬: 모디파이어는 Lua 전용(런 메타) — 시뮬 비대상 명시. 기존 44건 유지
|
||||
2. 메이커: 로드(첫 0)→승천 2 선택→적 HP/피해 배율·시작 HP 확인→클리어→해금+1·저장→재시작 후 로드 확인(메이커 스토리지), 빌드·런타임 0에러
|
||||
Reference in New Issue
Block a user