feat: batch wikification of Skybound balance pass and scalable frontend architectures
Processed 80+ files including Skybound playtest feedback, Monorepo strategies, and Modern Component Patterns.
This commit is contained in:
+133
@@ -0,0 +1,133 @@
|
||||
# Skybound Invasion Response Stage Difficulty Curve
|
||||
|
||||
작성일: 2026-04-26 13:08 KST
|
||||
|
||||
## 요청 요약
|
||||
|
||||
- Stage 8 보스가 지구를 침략한 핵심 적이라는 스토리 구조를 난이도 곡선에 반영한다.
|
||||
- 초반에는 플레이어를 얕보고 소수의 적기만 보내는 느낌으로 시작한다.
|
||||
- 스테이지를 클리어할수록 보스가 플레이어를 점점 더 위험하게 판단하고, 단계적으로 더 많은 적기를 투입한다.
|
||||
- 적기의 수가 줄어든 구간은 너무 쉬워질 수 있으므로 적기의 공격력을 비례해서 보정한다.
|
||||
|
||||
## 핵심 방향
|
||||
|
||||
이번 패스는 단순히 숫자를 올리는 밸런스가 아니라 “침공군의 대응 수위”를 만드는 작업이다.
|
||||
|
||||
설계 기준은 다음과 같다.
|
||||
|
||||
1. Stage 1: 정찰대. 적 수는 적지만 한 발은 무시할 수 없다.
|
||||
2. Stage 2: 빠른 대응기 투입. 아직 소규모지만 반응 속도가 오른다.
|
||||
3. Stage 3: 혼합 편대. 보스가 플레이어를 실제 변수로 인식한다.
|
||||
4. Stage 4: 제압 작전. 십자/라인 압박이 본격화된다.
|
||||
5. Stage 5: 전면 공격 승인. 적 수가 확실히 늘어난다.
|
||||
6. Stage 6: 제거 함대. 빌드 완성도를 검증한다.
|
||||
7. Stage 7: 예비 전력 투입. 물량과 엘리트 압박이 커진다.
|
||||
8. Stage 8: 지구 침공 본대. 최대 물량과 최대 화력으로 압박한다.
|
||||
|
||||
## 적용한 변경
|
||||
|
||||
### Stage Profile 재정렬
|
||||
|
||||
`SURVIVOR_STAGE_PROFILES`를 8단계 침공 대응 곡선으로 재배치했다.
|
||||
|
||||
변경된 주요 축:
|
||||
|
||||
- `diffBase`
|
||||
- `capBase`
|
||||
- `spawnTempo`
|
||||
- opening wave density
|
||||
- swarm density
|
||||
- climax elite density
|
||||
- comms 문구
|
||||
|
||||
### 초반 적 수 감소
|
||||
|
||||
Stage 1과 Stage 2는 보스가 플레이어를 얕보는 단계로 설정했다.
|
||||
|
||||
Stage 1 변경:
|
||||
|
||||
- `capBase: 18` → `12`
|
||||
- `spawnTempo: 1.0` → `1.18`
|
||||
- opening density: `8` → `4`
|
||||
- swarm density: `18` → `12`
|
||||
- climax elite density: `3` → `2`
|
||||
|
||||
Stage 2 변경:
|
||||
|
||||
- `capBase: 28` → `16`
|
||||
- `spawnTempo: 0.86` → `1.02`
|
||||
- opening density: `14` → `7`
|
||||
- swarm density: `24` → `16`
|
||||
- climax elite density: `4` → `3`
|
||||
|
||||
초반에는 화면을 적으로 가득 채우기보다, 각 적기의 진입과 탄환을 플레이어가 인식할 수 있게 만들었다.
|
||||
|
||||
### 중후반 적 수 증가 곡선 강화
|
||||
|
||||
Stage 5부터는 침공군이 실제로 플레이어 제거를 목표로 움직이는 느낌을 강화했다.
|
||||
|
||||
후반 주요 변화:
|
||||
|
||||
- Stage 5 `capBase: 40` → `34`, 대신 `diffBase: 1.42` → `1.54`
|
||||
- Stage 6 `capBase: 46` → `42`, `diffBase: 1.58` → `1.74`
|
||||
- Stage 7 `capBase: 52` → `50`, `diffBase: 1.76` → `1.96`
|
||||
- Stage 8 `capBase: 58` → `60`, `diffBase: 1.96` → `2.22`
|
||||
- Stage 8 swarm density: `60` → `68`
|
||||
- Stage 8 climax elite density: `10` → `12`
|
||||
|
||||
Stage 5-7은 성능과 가독성을 고려해 단순 물량만 폭증시키지 않고, 공격 위협을 함께 올렸다.
|
||||
|
||||
### 공격력 보정
|
||||
|
||||
적 수가 줄어든 스테이지가 너무 쉬워지는 것을 방지하기 위해 `DAMAGE_CURVE`를 상향했다.
|
||||
|
||||
변경 전:
|
||||
|
||||
- `[0.95, 1.08, 1.24, 1.44, 1.68, 1.96, 2.28, 2.65]`
|
||||
|
||||
변경 후:
|
||||
|
||||
- `[1.08, 1.16, 1.32, 1.52, 1.78, 2.08, 2.44, 2.88]`
|
||||
|
||||
의도는 “적 수가 적으면 회피 기회가 많아지는 만큼, 맞았을 때는 실수로 느껴지게 하는 것”이다.
|
||||
|
||||
### Comms 서사 반영
|
||||
|
||||
스테이지 시작/주요 웨이브 문구를 침공 대응 서사에 맞게 수정했다.
|
||||
|
||||
예시:
|
||||
|
||||
- Stage 1: `Scout flight detected. The invader is probing our response.`
|
||||
- Stage 2: `Stage 2: the invader is testing faster response craft.`
|
||||
- Stage 4: `Stage 4: the invader is no longer probing. Suppression grid active.`
|
||||
- Stage 8: `Stage 8: planetary invasion force confirmed. Survive the crush.`
|
||||
|
||||
## 설계 의도
|
||||
|
||||
이번 변경의 핵심은 플레이어가 난이도 상승을 “게임이 갑자기 어려워졌다”가 아니라 “보스가 나를 점점 더 심각한 위협으로 보고 있다”라고 받아들이게 만드는 것이다.
|
||||
|
||||
초반은 적 수가 줄어들었기 때문에 회피와 학습의 여유가 있다.
|
||||
|
||||
하지만 공격력은 낮추지 않고 오히려 보정했기 때문에, 가만히 있어도 쉽게 깨지는 구조는 피한다.
|
||||
|
||||
후반은 플레이어 빌드가 강해지는 것을 전제로, 적 수와 공격력이 함께 올라간다.
|
||||
|
||||
## 수정 파일
|
||||
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/CombatTimeline.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/balance.ts`
|
||||
|
||||
## 검증
|
||||
|
||||
- `npm run build` 성공
|
||||
- `/sprites/player.png` 경고 없음
|
||||
- 출력 디렉터리: `dist/25`
|
||||
|
||||
## 후속 플레이테스트 체크 포인트
|
||||
|
||||
- Stage 1 초반이 “적이 적어서 심심한지” 또는 “소수지만 긴장감이 있는지” 확인한다.
|
||||
- Stage 1에서 맞았을 때 피격이 의미 있게 느껴지는지 확인한다.
|
||||
- Stage 2가 Stage 1보다 확실히 대응 수위가 올라간 것처럼 느껴지는지 확인한다.
|
||||
- Stage 3-4에서 혼합 편대/제압 작전으로 플레이 양상이 달라지는지 확인한다.
|
||||
- Stage 5 이후부터 물량 증가가 명확하게 느껴지는지 확인한다.
|
||||
- Stage 8이 최종 침공군답게 가장 강한 물량과 화력을 보여주는지 확인한다.
|
||||
+111
@@ -0,0 +1,111 @@
|
||||
# Skybound Low Level First Upgrade Offer Balance
|
||||
|
||||
작성일: 2026-04-26 13:16 KST
|
||||
|
||||
## 요청 요약
|
||||
|
||||
- 게임 플레이 중 Tactical Level Up으로 무기/스킬 업그레이드 후보가 나온다.
|
||||
- 이미 많이 레벨업한 무기가 계속 후보에 자주 나오면 특정 무기 몰빵이 쉬워진다.
|
||||
- 레벨이 낮은 무기/스킬이 다음 후보에 포함될 확률을 더 높인다.
|
||||
- 레벨이 높은 무기/스킬은 낮은 레벨 스킬 대비 후보 포함 확률을 낮춘다.
|
||||
|
||||
## 핵심 문제
|
||||
|
||||
기존 `ProgressionSystem.generateSkillCards()`는 이미 보유한 스킬과 near-max 스킬에 보너스를 주는 구조였다.
|
||||
|
||||
기존 구조의 문제:
|
||||
|
||||
1. 한 무기가 빠르게 고레벨까지 몰릴 수 있다.
|
||||
2. Lv4 → Lv5 직전 스킬이 자주 후보에 떠서 성장 속도가 급격해진다.
|
||||
3. 다양한 무기를 경험하기보다 가장 강한 무기 하나가 빠르게 완성된다.
|
||||
4. Stage 1-2 중반부터 빌드가 너무 빨리 안정화될 수 있다.
|
||||
|
||||
## 적용한 변경
|
||||
|
||||
### 후보 선택 방식 변경
|
||||
|
||||
기존에는 카테고리별로 후보를 고르고, 보유/시너지/near-max에 가중치를 더했다.
|
||||
|
||||
변경 후에는 각 스킬마다 `offer weight`를 계산한다.
|
||||
|
||||
가중치 기준:
|
||||
|
||||
- 남은 레벨이 많을수록 가중치 증가
|
||||
- Lv0/Lv1 스킬은 상대적으로 더 자주 등장
|
||||
- Lv3 이상 스킬은 가중치 감소
|
||||
- max 직전 스킬은 강하게 가중치 감소
|
||||
- 시너지/EVO 보너스는 유지하되, 고레벨 스킬을 압도적으로 밀어주지는 않음
|
||||
|
||||
### 고레벨 몰빵 완화
|
||||
|
||||
Near-max 스킬은 기존에 오히려 보너스를 받았지만, 이제는 낮은 확률로만 나온다.
|
||||
|
||||
적용 규칙:
|
||||
|
||||
- `currentLevel >= maxLevel - 1`: 가중치 35%로 감소
|
||||
- `currentLevel >= maxLevel * 0.6`: 가중치 58%로 감소
|
||||
|
||||
예시:
|
||||
|
||||
- Lv0/Lv1 스킬: 목록에 더 잘 등장
|
||||
- Lv3/Lv4 스킬: 등장 가능하지만 낮은 빈도
|
||||
- Lv4 → Lv5 완성: 운이 좋아야 뜨는 마무리 선택으로 변경
|
||||
|
||||
### 첫 선택 보정
|
||||
|
||||
아직 아무 스킬도 없는 첫 Tactical Level Up에서는 새 무기 후보를 우선 제공한다.
|
||||
|
||||
목표는 첫 선택이 빌드 방향을 정하는 순간으로 작동하게 하는 것이다.
|
||||
|
||||
### 새 무기 확장 선택 유지
|
||||
|
||||
이미 스킬을 보유한 이후에도 새 무기 후보가 완전히 사라지지는 않는다.
|
||||
|
||||
변경 후:
|
||||
|
||||
- 슬롯 여유가 있고 새 무기가 있으면 65% 확률로 하나의 build-expanding option을 제공한다.
|
||||
- 나머지 후보는 전체 가중치 풀에서 선택한다.
|
||||
|
||||
### Mini-boss Reward Cache 보정
|
||||
|
||||
미니보스 보상 카드도 가장 높은 레벨 무기를 무조건 우선하지 않도록 변경했다.
|
||||
|
||||
변경 후에는 보유 무기 중에서도 낮은 레벨/남은 성장 여지가 큰 무기가 더 잘 선택된다.
|
||||
|
||||
### UI fallback 보정
|
||||
|
||||
일반적으로 카드 후보는 엔진에서 생성되지만, 예외적으로 `LevelUpModal`에서 fallback 랜덤이 동작할 수 있다.
|
||||
|
||||
이 fallback도 동일한 low-level-first 가중치 규칙을 따르도록 변경했다.
|
||||
|
||||
## 설계 의도
|
||||
|
||||
이번 변경의 목표는 성장 속도를 늦추는 것만이 아니다.
|
||||
|
||||
플레이어가 한 무기를 빠르게 완성해 “이미 빌드가 끝났다”라고 느끼는 시점을 뒤로 미루고, 여러 선택지 사이에서 더 오래 고민하게 만드는 것이 핵심이다.
|
||||
|
||||
원하는 플레이 감각:
|
||||
|
||||
1. 초반에는 새 무기와 낮은 레벨 무기가 자주 보인다.
|
||||
2. 중반에는 빌드 방향을 넓히거나 약한 축을 보완하게 된다.
|
||||
3. 고레벨 완성 선택은 자주 뜨지 않지만, 떴을 때 반갑다.
|
||||
4. 특정 무기 하나가 너무 빨리 완성되어 난이도를 붕괴시키는 일이 줄어든다.
|
||||
|
||||
## 수정 파일
|
||||
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ProgressionSystem.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/LevelUpModal.tsx`
|
||||
|
||||
## 검증
|
||||
|
||||
- `npm run build` 성공
|
||||
- `/sprites/player.png` 경고 없음
|
||||
- 출력 디렉터리: `dist/26`
|
||||
|
||||
## 후속 플레이테스트 체크 포인트
|
||||
|
||||
- Stage 1에서 같은 무기가 너무 빠르게 Lv4/Lv5까지 올라가지 않는지 확인한다.
|
||||
- 낮은 레벨 무기/패시브가 기존보다 자주 후보에 뜨는지 확인한다.
|
||||
- 고레벨 완성 선택이 너무 안 떠서 답답하지 않은지 확인한다.
|
||||
- EVO 경로가 완전히 막힌 느낌이 들지 않는지 확인한다.
|
||||
- 미니보스 보상 카드가 여전히 보상답게 느껴지는지 확인한다.
|
||||
+205
@@ -0,0 +1,205 @@
|
||||
# Skybound Stage 1 to 3 Playtest Balance Bomb and Visual Diversity Pass
|
||||
|
||||
작성일: 2026-04-26 12:35 KST
|
||||
|
||||
## 요청 요약
|
||||
|
||||
- Stage 1부터 Stage 3까지 실제 플레이 후 느낀 문제를 개선한다.
|
||||
- Stage 1 초반 적 탄속이 부담스럽고, 중반 이후 성장하면 너무 쉬워지는 문제를 조정한다.
|
||||
- Stage 2 시작 시 이미 Tac Level 6 정도로 강해져 적이 화면에 들어오기 전에 사망하는 문제를 완화한다.
|
||||
- Space/X 폭탄의 비주얼 이펙트가 약하므로 톤앤매너에 맞는 폭탄 연출을 강화한다.
|
||||
- 일반 적, 엘리트, 미니보스, 보스 외형 다양성을 확보한다.
|
||||
|
||||
## 핵심 문제
|
||||
|
||||
플레이 피드백 기준으로 Skybound의 현재 문제는 초반과 중반의 난이도 감각이 반대로 작동한다는 점이었다.
|
||||
|
||||
1. Stage 1 초반은 적 탄속이 빠르게 느껴져 부담스럽다.
|
||||
2. Stage 1 중반부터 스킬이 붙으면 플레이어 화력이 너무 급격히 상승한다.
|
||||
3. Stage 2에서는 적이 화면에 들어오기 전에 사망해 긴장감이 사라진다.
|
||||
4. Tac Level 성장 속도와 무기 효율이 합쳐져 “이미 완성된 빌드”처럼 느껴진다.
|
||||
5. 보스/적기 외형 반복으로 스테이지 진행감이 약하다.
|
||||
|
||||
## 적용한 변경
|
||||
|
||||
### Stage 1 적 탄속 완화
|
||||
|
||||
`balance.ts`의 적 탄환 기본 속도와 스테이지별 탄속 커브를 낮췄다.
|
||||
|
||||
변경 전:
|
||||
|
||||
- `BULLET_BASE_SPEED: 3.75`
|
||||
- `BULLET_SPEED_CURVE: [1.1, 1.28, 1.48, ...]`
|
||||
|
||||
변경 후:
|
||||
|
||||
- `BULLET_BASE_SPEED: 3.25`
|
||||
- `BULLET_SPEED_CURVE: [0.82, 0.96, 1.12, ...]`
|
||||
|
||||
Stage 1은 회피를 학습할 수 있는 속도로 낮추고, Stage 4 이후부터 탄속이 본격적으로 올라가도록 재배치했다.
|
||||
|
||||
### 적 사격 템포 완화
|
||||
|
||||
초반 탄막 부담을 줄이기 위해 `FIRE_RATE_CURVE`도 조정했다.
|
||||
|
||||
변경 후:
|
||||
|
||||
- `[280, 248, 222, 198, 176, 154, 134, 116]`
|
||||
|
||||
Stage 1-2는 더 읽을 수 있게 만들고, 후반 스테이지는 기존처럼 빠르게 압박하도록 유지했다.
|
||||
|
||||
### Tac Level 성장 속도 완화
|
||||
|
||||
Tac Level이 Stage 1 중반에 너무 빨리 누적되지 않도록 조정했다.
|
||||
|
||||
- 시작 요구 EXP: `80` → `100`
|
||||
- 레벨업 후 초과 EXP carryover: `25%` → `15%`
|
||||
- 레벨업 lockout: `360프레임` → `480프레임`
|
||||
- 일반 적 Tac EXP: `2` → `1`
|
||||
- 엘리트 Tac EXP: `10` → `8`
|
||||
- 미니보스 Tac EXP: `30` → `24`
|
||||
|
||||
목표는 Stage 2 시작 시 플레이어가 강해졌다는 느낌은 가지되, 이미 완성된 상태는 아니게 만드는 것이다.
|
||||
|
||||
### 플레이어 무기 초중반 효율 완화
|
||||
|
||||
무기 업그레이드가 의미는 있지만, Lv1-3에서 화면 전체를 지우지 않도록 주요 피해량을 조정했다.
|
||||
|
||||
- Gatling Gun 피해와 발사 효율 하향
|
||||
- Hyper Laser 피해 하향
|
||||
- Nova Burst 피해 하향
|
||||
- Missile Pod, Rocket Launcher, Ion Storm, Gravity Mine, Blade Orbit 등 데이터 기반 무기 피해 하향
|
||||
- EVO 무기도 일부 피해를 낮춰 Stage 2-3을 통째로 삭제하지 않게 조정
|
||||
|
||||
### 화면 밖 적 선삭제 방지
|
||||
|
||||
Stage 2에서 적이 화면에 나오기도 전에 사망하는 가장 큰 원인은 자동 조준/유도/빔/드론/오비트 무기가 `y < 0`에 있는 적까지 타겟팅하거나 피해를 주는 것이었다.
|
||||
|
||||
그래서 플레이어 무기 타겟팅과 충돌 판정에 `TARGETABLE_Y = -35` 기준을 추가했다.
|
||||
|
||||
적이 화면에 거의 진입하기 전까지는 다음 무기가 타겟팅하지 않는다.
|
||||
|
||||
- 유도탄
|
||||
- 자동 조준 무기
|
||||
- 빔
|
||||
- 오비트 무기
|
||||
- 드론
|
||||
- 설치/장판 무기
|
||||
- 일반 플레이어 탄환 충돌
|
||||
|
||||
이제 적이 화면에 들어와 위협을 보여준 뒤 처치되는 흐름이 만들어진다.
|
||||
|
||||
### Stage 2-3 압박 보강
|
||||
|
||||
Stage 2와 Stage 3은 이미 성장한 플레이어를 전제로 난이도를 다시 올렸다.
|
||||
|
||||
Stage 2:
|
||||
|
||||
- `diffBase: 1.02` → `1.12`
|
||||
- `capBase: 23` → `28`
|
||||
- `spawnTempo: 0.94` → `0.86`
|
||||
- opening density: `10` → `14`
|
||||
|
||||
Stage 3:
|
||||
|
||||
- `diffBase: 1.14` → `1.28`
|
||||
- `capBase: 28` → `34`
|
||||
- `spawnTempo: 0.88` → `0.78`
|
||||
- opening density: `12` → `16`
|
||||
|
||||
### 적 HP 스케일링 보강
|
||||
|
||||
일반/엘리트 적이 스킬 몇 개에 바로 삭제되지 않도록 기본 HP 공식을 조정했다.
|
||||
|
||||
추가 요소:
|
||||
|
||||
- 스테이지별 HP 증가
|
||||
- 플레이어가 예상보다 높은 Tac Level일 때 적 HP 보정
|
||||
- 엘리트 HP 배율 상향
|
||||
|
||||
이 보정은 플레이어가 잘 성장했을 때도 적이 최소한 화면에 들어와 압박을 만들도록 하기 위한 안전장치다.
|
||||
|
||||
### 폭탄 비주얼 개선
|
||||
|
||||
기존 폭탄은 얇은 원형 렌더링에 가까워 비주얼 피드백이 약했다. 이제 폭탄 사용 시 발동 위치를 저장하고, 그 지점에서 Magitech shockwave가 확장된다.
|
||||
|
||||
추가된 연출:
|
||||
|
||||
- 고정된 폭발 원점
|
||||
- 시안/라임/골드 3중 마법공학 링
|
||||
- 점선 링 회전
|
||||
- 중심 코어 플래시
|
||||
- 방사형 에너지 라인
|
||||
- 밝은 라디얼 플래시
|
||||
|
||||
Space/X를 눌렀을 때 “화면을 정리하는 기술”이라는 감각이 더 강해지도록 했다.
|
||||
|
||||
### 적기 외형 다양성 개선
|
||||
|
||||
기존 적기 스프라이트 선택은 역할별 고정값이 많아 반복감이 컸다. 이제 역할과 스테이지, 약간의 랜덤 salt를 반영해 더 다양한 스프라이트를 선택한다.
|
||||
|
||||
적용 대상:
|
||||
|
||||
- 일반 적
|
||||
- 엘리트 적
|
||||
- 미니보스
|
||||
|
||||
미니보스는 패턴별로 크기와 발광색도 달라져 작은 보스전처럼 보이게 했다.
|
||||
|
||||
### 보스 외형 다양성 개선
|
||||
|
||||
보스는 `spriteIdx`가 명시되지 않아 사실상 같은 보스 타일만 반복 사용되는 문제가 있었다. 이제 스테이지별 보스 비주얼 프로필을 갖는다.
|
||||
|
||||
프로필 요소:
|
||||
|
||||
- 보스 스프라이트 인덱스
|
||||
- 보스 크기
|
||||
- 보스 가로/세로 비율
|
||||
- 날개 포탑 위치
|
||||
- 하단 포탑 위치
|
||||
- 발광 액센트 색상
|
||||
|
||||
이제 Stage 1-8 보스는 같은 시스템을 쓰더라도 외형, 크기, 포탑 배치가 다르게 보인다.
|
||||
|
||||
## 설계 의도
|
||||
|
||||
이번 패스의 핵심은 “초반은 읽기 쉽게, 중반은 무적감이 너무 빨리 오지 않게” 만드는 것이다.
|
||||
|
||||
원하는 플레이 감각은 다음과 같다.
|
||||
|
||||
1. Stage 1 초반: 탄을 보고 피하는 법을 배운다.
|
||||
2. Stage 1 중반: 첫 빌드가 강해지는 재미를 느낀다.
|
||||
3. Stage 1 후반: 미니보스와 보스로 빌드 검증을 한다.
|
||||
4. Stage 2: 성장한 상태지만 적도 더 빨리/많이 들어와 다시 긴장감이 생긴다.
|
||||
5. Stage 3: 단일 무기 강화만으로는 부족하고 광역/방어/관통 선택의 의미가 생긴다.
|
||||
|
||||
## 수정 파일
|
||||
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/CombatTimeline.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/balance.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/weaponBehaviors.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/store/useGameStore.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/CombatSystem.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/GameRenderer.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ModularWeaponSystem.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/PlayerSystem.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ProgressionSystem.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/SpawnerSystem.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/StageDirectorSystem.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/WeaponBehaviorEngine.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/types.ts`
|
||||
|
||||
## 검증
|
||||
|
||||
- `npm run build` 성공
|
||||
- `/sprites/player.png` 경고 없음
|
||||
- 출력 디렉터리: `dist/22`
|
||||
|
||||
## 후속 플레이테스트 체크 포인트
|
||||
|
||||
- Stage 1 첫 60초 탄속이 “부담스럽지만 불공정하지 않은지” 확인한다.
|
||||
- Stage 1 후반 Tac Level이 대략 3-5 사이인지 확인한다.
|
||||
- Stage 2 시작 시 적이 화면 안에 들어오기 전에 삭제되는 현상이 줄었는지 확인한다.
|
||||
- Space/X 폭탄 사용 시 충분히 강한 시각 피드백이 있는지 확인한다.
|
||||
- Stage 1-3 보스가 서로 다른 외형과 크기로 인식되는지 확인한다.
|
||||
- Stage 2-3에서 피격 압박은 생겼지만, 갑자기 불합리하게 어려워지지는 않았는지 확인한다.
|
||||
+111
@@ -0,0 +1,111 @@
|
||||
# Skybound Low Level First Upgrade Offer Balance
|
||||
|
||||
작성일: 2026-04-26 13:16 KST
|
||||
|
||||
## 요청 요약
|
||||
|
||||
- 게임 플레이 중 Tactical Level Up으로 무기/스킬 업그레이드 후보가 나온다.
|
||||
- 이미 많이 레벨업한 무기가 계속 후보에 자주 나오면 특정 무기 몰빵이 쉬워진다.
|
||||
- 레벨이 낮은 무기/스킬이 다음 후보에 포함될 확률을 더 높인다.
|
||||
- 레벨이 높은 무기/스킬은 낮은 레벨 스킬 대비 후보 포함 확률을 낮춘다.
|
||||
|
||||
## 핵심 문제
|
||||
|
||||
기존 `ProgressionSystem.generateSkillCards()`는 이미 보유한 스킬과 near-max 스킬에 보너스를 주는 구조였다.
|
||||
|
||||
기존 구조의 문제:
|
||||
|
||||
1. 한 무기가 빠르게 고레벨까지 몰릴 수 있다.
|
||||
2. Lv4 → Lv5 직전 스킬이 자주 후보에 떠서 성장 속도가 급격해진다.
|
||||
3. 다양한 무기를 경험하기보다 가장 강한 무기 하나가 빠르게 완성된다.
|
||||
4. Stage 1-2 중반부터 빌드가 너무 빨리 안정화될 수 있다.
|
||||
|
||||
## 적용한 변경
|
||||
|
||||
### 후보 선택 방식 변경
|
||||
|
||||
기존에는 카테고리별로 후보를 고르고, 보유/시너지/near-max에 가중치를 더했다.
|
||||
|
||||
변경 후에는 각 스킬마다 `offer weight`를 계산한다.
|
||||
|
||||
가중치 기준:
|
||||
|
||||
- 남은 레벨이 많을수록 가중치 증가
|
||||
- Lv0/Lv1 스킬은 상대적으로 더 자주 등장
|
||||
- Lv3 이상 스킬은 가중치 감소
|
||||
- max 직전 스킬은 강하게 가중치 감소
|
||||
- 시너지/EVO 보너스는 유지하되, 고레벨 스킬을 압도적으로 밀어주지는 않음
|
||||
|
||||
### 고레벨 몰빵 완화
|
||||
|
||||
Near-max 스킬은 기존에 오히려 보너스를 받았지만, 이제는 낮은 확률로만 나온다.
|
||||
|
||||
적용 규칙:
|
||||
|
||||
- `currentLevel >= maxLevel - 1`: 가중치 35%로 감소
|
||||
- `currentLevel >= maxLevel * 0.6`: 가중치 58%로 감소
|
||||
|
||||
예시:
|
||||
|
||||
- Lv0/Lv1 스킬: 목록에 더 잘 등장
|
||||
- Lv3/Lv4 스킬: 등장 가능하지만 낮은 빈도
|
||||
- Lv4 → Lv5 완성: 운이 좋아야 뜨는 마무리 선택으로 변경
|
||||
|
||||
### 첫 선택 보정
|
||||
|
||||
아직 아무 스킬도 없는 첫 Tactical Level Up에서는 새 무기 후보를 우선 제공한다.
|
||||
|
||||
목표는 첫 선택이 빌드 방향을 정하는 순간으로 작동하게 하는 것이다.
|
||||
|
||||
### 새 무기 확장 선택 유지
|
||||
|
||||
이미 스킬을 보유한 이후에도 새 무기 후보가 완전히 사라지지는 않는다.
|
||||
|
||||
변경 후:
|
||||
|
||||
- 슬롯 여유가 있고 새 무기가 있으면 65% 확률로 하나의 build-expanding option을 제공한다.
|
||||
- 나머지 후보는 전체 가중치 풀에서 선택한다.
|
||||
|
||||
### Mini-boss Reward Cache 보정
|
||||
|
||||
미니보스 보상 카드도 가장 높은 레벨 무기를 무조건 우선하지 않도록 변경했다.
|
||||
|
||||
변경 후에는 보유 무기 중에서도 낮은 레벨/남은 성장 여지가 큰 무기가 더 잘 선택된다.
|
||||
|
||||
### UI fallback 보정
|
||||
|
||||
일반적으로 카드 후보는 엔진에서 생성되지만, 예외적으로 `LevelUpModal`에서 fallback 랜덤이 동작할 수 있다.
|
||||
|
||||
이 fallback도 동일한 low-level-first 가중치 규칙을 따르도록 변경했다.
|
||||
|
||||
## 설계 의도
|
||||
|
||||
이번 변경의 목표는 성장 속도를 늦추는 것만이 아니다.
|
||||
|
||||
플레이어가 한 무기를 빠르게 완성해 “이미 빌드가 끝났다”라고 느끼는 시점을 뒤로 미루고, 여러 선택지 사이에서 더 오래 고민하게 만드는 것이 핵심이다.
|
||||
|
||||
원하는 플레이 감각:
|
||||
|
||||
1. 초반에는 새 무기와 낮은 레벨 무기가 자주 보인다.
|
||||
2. 중반에는 빌드 방향을 넓히거나 약한 축을 보완하게 된다.
|
||||
3. 고레벨 완성 선택은 자주 뜨지 않지만, 떴을 때 반갑다.
|
||||
4. 특정 무기 하나가 너무 빨리 완성되어 난이도를 붕괴시키는 일이 줄어든다.
|
||||
|
||||
## 수정 파일
|
||||
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ProgressionSystem.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/LevelUpModal.tsx`
|
||||
|
||||
## 검증
|
||||
|
||||
- `npm run build` 성공
|
||||
- `/sprites/player.png` 경고 없음
|
||||
- 출력 디렉터리: `dist/26`
|
||||
|
||||
## 후속 플레이테스트 체크 포인트
|
||||
|
||||
- Stage 1에서 같은 무기가 너무 빠르게 Lv4/Lv5까지 올라가지 않는지 확인한다.
|
||||
- 낮은 레벨 무기/패시브가 기존보다 자주 후보에 뜨는지 확인한다.
|
||||
- 고레벨 완성 선택이 너무 안 떠서 답답하지 않은지 확인한다.
|
||||
- EVO 경로가 완전히 막힌 느낌이 들지 않는지 확인한다.
|
||||
- 미니보스 보상 카드가 여전히 보상답게 느껴지는지 확인한다.
|
||||
+136
@@ -0,0 +1,136 @@
|
||||
# Skybound Skill Slot Limit Weapon 5 Passive 5
|
||||
|
||||
작성일: 2026-04-26 13:29 KST
|
||||
|
||||
## 요청 요약
|
||||
|
||||
- 사용자가 획득할 수 있는 스킬 수량에 제한을 둔다.
|
||||
- 총 10개 스킬을 보유할 수 있게 한다.
|
||||
- 10개 중 5개는 무기, 5개는 패시브로 분리한다.
|
||||
- 슬롯이 부족한 상태에서 새 스킬을 선택하려 하면 `슬롯이 부족합니다`에 해당하는 노티가 필요하다.
|
||||
- 슬롯 제한 때문에 사용하지 못하는 스킬이 목록에 나올 수 있으므로 `Skip Upgrade` 선택지도 계속 필요하다.
|
||||
- 5/5 구조가 적절한지 검토한다.
|
||||
|
||||
## 판단
|
||||
|
||||
현재 Skybound에는 무기와 패시브 풀이 이미 넓고, 8스테이지까지 성장해야 한다.
|
||||
|
||||
따라서 지금 시점에서는 `무기 5개 + 패시브 5개`가 적절하다.
|
||||
|
||||
더 줄이는 선택지도 가능하지만, 아직은 권장하지 않는다.
|
||||
|
||||
- 4/4는 빌드 정체성이 더 강해지는 대신 초반 선택 운 영향이 커진다.
|
||||
- 5/5는 Survivor.io/Vampire Survivors류의 성장 폭과 전략성을 적당히 유지한다.
|
||||
- 6/6 이상은 사용자가 거의 모든 것을 들고 가는 느낌이 강해져 빌드 선택 의미가 약해진다.
|
||||
|
||||
그래서 이번 패스에서는 5/5를 기본값으로 적용했다.
|
||||
|
||||
## 적용한 변경
|
||||
|
||||
### Skill Slot Limit 추가
|
||||
|
||||
`skills.ts`에 슬롯 제한 상수를 추가했다.
|
||||
|
||||
```ts
|
||||
export const SKILL_SLOT_LIMITS = {
|
||||
WEAPON: 5,
|
||||
PASSIVE: 5,
|
||||
}
|
||||
```
|
||||
|
||||
이제 시스템 전반에서 동일한 기준을 사용한다.
|
||||
|
||||
### 후보 생성 필터링
|
||||
|
||||
`ProgressionSystem.generateSkillCards()`와 `generateMiniBossRewardCards()`에서 슬롯 제한을 반영했다.
|
||||
|
||||
규칙:
|
||||
|
||||
- 이미 보유한 스킬은 계속 레벨업 가능하다.
|
||||
- 새 무기 획득은 무기 슬롯이 5개 미만일 때만 가능하다.
|
||||
- 새 패시브 획득은 패시브 슬롯이 5개 미만일 때만 가능하다.
|
||||
- 슬롯이 꽉 찬 타입의 새 스킬은 정상 후보 생성에서 제외한다.
|
||||
|
||||
### 선택 시 슬롯 부족 방어
|
||||
|
||||
혹시 예외 경로로 선택 불가 카드가 들어오거나, UI/엔진 동기화 타이밍 문제로 새 스킬 선택이 들어올 수 있다.
|
||||
|
||||
그래서 `ProgressionSystem.applySkillSelection()`에도 최종 방어를 추가했다.
|
||||
|
||||
슬롯이 부족하면:
|
||||
|
||||
- 스킬을 추가하지 않는다.
|
||||
- 게임을 재개한다.
|
||||
- 전투 화면에 `WEAPON SLOTS FULL` 또는 `PASSIVE SLOTS FULL` 텍스트를 띄운다.
|
||||
- 보조 텍스트로 `Choose another module or skip`을 띄운다.
|
||||
|
||||
### Store 레벨 방어
|
||||
|
||||
`useGameStore.addSkill()`에도 동일한 슬롯 제한 방어를 추가했다.
|
||||
|
||||
이유:
|
||||
|
||||
- UI나 엔진 외부에서 `addSkill()`이 호출되더라도 잘못된 스킬이 저장되지 않게 하기 위함이다.
|
||||
- `__skip__`도 기존처럼 저장되지 않는다.
|
||||
|
||||
### Level Up UI 슬롯 상태 표시
|
||||
|
||||
`LevelUpModal` 상단에 현재 슬롯 상태를 표시한다.
|
||||
|
||||
표시:
|
||||
|
||||
- `Weapons 0/5`
|
||||
- `Passives 0/5`
|
||||
|
||||
슬롯이 가득 차면 해당 배지가 붉은 톤으로 바뀐다.
|
||||
|
||||
### SLOT FULL 카드 표시
|
||||
|
||||
정상 후보 생성에서는 사용 불가 카드가 거의 나오지 않지만, 예외적으로 pre-generated cards나 fallback 상태에서 들어올 수 있다.
|
||||
|
||||
이 경우 카드에 다음 표시를 추가했다.
|
||||
|
||||
- `SLOT FULL` 태그
|
||||
- `No empty weapon/passive slot` 설명
|
||||
- `WEAPON slots are full` 또는 `PASSIVE slots are full`
|
||||
|
||||
사용자는 이때 새로 추가된 `Skip Upgrade`를 선택해 넘길 수 있다.
|
||||
|
||||
## 설계 의도
|
||||
|
||||
슬롯 제한의 핵심은 빌드 선택을 더 전략적으로 만드는 것이다.
|
||||
|
||||
제한이 없으면 사용자는 결국 대부분의 무기와 패시브를 다 들고 가게 되고, 선택의 의미가 약해진다.
|
||||
|
||||
5/5 구조에서는 다음 판단이 생긴다.
|
||||
|
||||
1. 무기 슬롯 하나를 새 무기에 쓸 것인가?
|
||||
2. 기존 무기 레벨업을 기다릴 것인가?
|
||||
3. 패시브 슬롯을 EVO 재료에 쓸 것인가?
|
||||
4. 생존 패시브를 포기하고 공격 패시브를 가져갈 것인가?
|
||||
5. 지금 후보가 별로면 스킵할 것인가?
|
||||
|
||||
이번 변경은 `Skip Upgrade`의 존재 이유도 더 명확하게 만든다.
|
||||
|
||||
## 수정 파일
|
||||
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/skills.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/store/useGameStore.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ProgressionSystem.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/LevelUpModal.tsx`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/LevelUpModal.css`
|
||||
|
||||
## 검증
|
||||
|
||||
- `npm run build` 성공
|
||||
- `/sprites/player.png` 경고 없음
|
||||
- 출력 디렉터리: `dist/28`
|
||||
|
||||
## 후속 플레이테스트 체크 포인트
|
||||
|
||||
- 무기 5개를 보유한 상태에서 새 무기 후보가 정상 레벨업 목록에서 제외되는지 확인한다.
|
||||
- 패시브 5개를 보유한 상태에서 새 패시브 후보가 정상 레벨업 목록에서 제외되는지 확인한다.
|
||||
- 이미 보유한 무기/패시브는 슬롯이 가득 차도 레벨업 가능한지 확인한다.
|
||||
- 예외적으로 `SLOT FULL` 카드가 보일 때 선택하면 슬롯 부족 노티가 뜨는지 확인한다.
|
||||
- `Skip Upgrade`가 슬롯 제한 상황에서 자연스러운 탈출구로 작동하는지 확인한다.
|
||||
- 5/5가 너무 넉넉하거나 너무 답답하지 않은지 확인한다.
|
||||
+150
@@ -0,0 +1,150 @@
|
||||
# Skybound Skip Upgrade and Weapon Transform Reconfiguration
|
||||
|
||||
작성일: 2026-04-26 13:25 KST
|
||||
|
||||
## 요청 요약
|
||||
|
||||
- Tactical Level Up 화면에서 마음에 들지 않는 업그레이드만 나올 수 있다.
|
||||
- 이 경우 사용자가 강제로 원하지 않는 업그레이드를 고르지 않도록 `업글 안하기` 선택지를 추가한다.
|
||||
- 새로운 무기가 장착되었을 때 사용자의 기체 외형도 그에 맞춰 변화해야 한다.
|
||||
- 연출적으로는 트랜스포머처럼 기체가 재구성되고 무장이 전개되는 느낌을 표현한다.
|
||||
|
||||
## 핵심 문제
|
||||
|
||||
기존 레벨업 화면은 반드시 하나의 스킬을 선택해야 했다.
|
||||
|
||||
이 구조의 문제:
|
||||
|
||||
1. 현재 빌드와 맞지 않는 선택지만 나와도 강제로 선택해야 한다.
|
||||
2. 낮은 레벨 우선 후보 확률을 적용한 뒤에는 사용자가 원치 않는 저레벨/새 무기가 뜰 가능성도 생긴다.
|
||||
3. 새 무기를 획득해도 기체가 실제로 바뀌는 느낌이 약하다.
|
||||
4. 무기가 생긴 순간의 시각적 보상이 부족하다.
|
||||
|
||||
## 적용한 변경
|
||||
|
||||
### Skip Upgrade 선택지 추가
|
||||
|
||||
`LevelUpModal`에 `Skip Upgrade` 카드를 추가했다.
|
||||
|
||||
동작:
|
||||
|
||||
- STARTER 첫 무기 선택에서는 스킵이 나오지 않는다.
|
||||
- 일반 Tactical Upgrade, Supply, Command Cache에서는 스킵 가능하다.
|
||||
- 스킵을 선택하면 스킬/무기 레벨이 증가하지 않고 전투로 복귀한다.
|
||||
|
||||
표시 문구:
|
||||
|
||||
- `HOLD UPGRADE`
|
||||
- `Skip Upgrade`
|
||||
- `No change this time`
|
||||
|
||||
### Skip 안전 처리
|
||||
|
||||
`__skip__`이 실제 스킬처럼 저장되지 않도록 여러 지점에 방어를 추가했다.
|
||||
|
||||
적용 지점:
|
||||
|
||||
- `GameSceneRenderer`
|
||||
- `ProgressionSystem`
|
||||
- `useGameStore.addSkill`
|
||||
|
||||
`__skip__`이 선택되면:
|
||||
|
||||
- Zustand `skills`에 추가하지 않는다.
|
||||
- 엔진 스킬 상태에도 추가하지 않는다.
|
||||
- `TACTICAL UPGRADE HELD` 텍스트를 띄운다.
|
||||
- 게임 pause를 해제하고 전투를 재개한다.
|
||||
|
||||
### 새 무기 장착 감지
|
||||
|
||||
`ProgressionSystem.applySkillSelection()`에서 선택 직전 스킬 레벨을 확인한다.
|
||||
|
||||
조건:
|
||||
|
||||
- 선택한 스킬이 `WEAPON` 타입
|
||||
- 선택 직전 레벨이 0
|
||||
|
||||
이 조건을 만족할 때만 새 무기 장착 연출을 발동한다.
|
||||
|
||||
기존 무기 레벨업이나 패시브 선택은 변신 연출을 발동하지 않는다.
|
||||
|
||||
### Airframe Reconfiguration 상태 추가
|
||||
|
||||
`GameState`에 새 무기 장착 연출용 상태를 추가했다.
|
||||
|
||||
추가 필드:
|
||||
|
||||
- `weaponTransformStartFrame`
|
||||
- `weaponTransformDuration`
|
||||
- `weaponTransformSkillId`
|
||||
|
||||
이 값은 렌더러가 현재 프레임 기준으로 변신 진행도를 계산하는 데 사용한다.
|
||||
|
||||
### 기체 변신/무장 전개 연출 추가
|
||||
|
||||
`GameRenderer.renderPlayer()`에 새 무기 장착 연출을 추가했다.
|
||||
|
||||
연출 요소:
|
||||
|
||||
- 기체 중심에서 확장되는 아케인 스캔 링
|
||||
- 무기 색상별 발광
|
||||
- 좌우 장갑 패널이 바깥으로 접히듯 전개
|
||||
- 전방 무장 레일이 앞으로 돌출
|
||||
- 작은 locking spark
|
||||
- `WEAPON LINK: 무기명`
|
||||
- `AIRFRAME RECONFIGURING`
|
||||
- 화면 흔들림과 파티클
|
||||
|
||||
무기별 액센트 컬러:
|
||||
|
||||
- Gatling Gun: 골드
|
||||
- Missile Pod: 핑크/레드
|
||||
- Nova Burst: 시안
|
||||
- Energy Shield: 라임
|
||||
- Sweep Laser: 화이트/시안
|
||||
- Plasma Torpedo: 오렌지
|
||||
- Ion Storm: 전기 시안
|
||||
- Attack Drone: 라임
|
||||
- Gravity Mine: 퍼플
|
||||
- Plasma Fire: 오렌지/레드
|
||||
- Plasma Blade: 시안
|
||||
|
||||
## 설계 의도
|
||||
|
||||
이번 변경은 업그레이드 UX에 “선택하지 않을 권리”를 추가하는 작업이다.
|
||||
|
||||
업그레이드는 항상 이득처럼 보여야 하지만, 빌드 방향과 맞지 않는 선택을 강제하면 사용자는 선택권을 잃었다고 느낄 수 있다.
|
||||
|
||||
스킵 선택지는 다음 의미를 가진다.
|
||||
|
||||
1. 원하지 않는 업그레이드를 강제로 먹지 않는다.
|
||||
2. 빌드 순도를 유지할 수 있다.
|
||||
3. 낮은 레벨 우선 후보 시스템의 부작용을 완화한다.
|
||||
4. 선택 화면에서 사용자 판단 여지를 높인다.
|
||||
|
||||
새 무기 변신 연출은 “새 기능이 생겼다”를 UI 문구가 아니라 기체 자체 변화로 전달하기 위한 장치다.
|
||||
|
||||
## 수정 파일
|
||||
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/store/useGameStore.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ProgressionSystem.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/GameRenderer.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/types.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/GameSceneRenderer.tsx`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/LevelUpModal.tsx`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/LevelUpModal.css`
|
||||
|
||||
## 검증
|
||||
|
||||
- `npm run build` 성공
|
||||
- `/sprites/player.png` 경고 없음
|
||||
- 출력 디렉터리: `dist/27`
|
||||
|
||||
## 후속 플레이테스트 체크 포인트
|
||||
|
||||
- 일반 레벨업 화면에서 `Skip Upgrade`가 명확하게 보이는지 확인한다.
|
||||
- STARTER 첫 무기 선택에서는 스킵이 나오지 않는지 확인한다.
|
||||
- 스킵 선택 시 게임이 정상 재개되는지 확인한다.
|
||||
- 스킵 선택 후 `skills.__skip__` 같은 잘못된 값이 저장되지 않는지 확인한다.
|
||||
- 새 무기를 처음 선택했을 때 기체 변신 연출이 충분히 눈에 띄는지 확인한다.
|
||||
- 기존 무기 레벨업/패시브 선택 시 변신 연출이 과하게 반복되지 않는지 확인한다.
|
||||
Reference in New Issue
Block a user