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:
Antigravity Agent
2026-04-26 13:53:50 +09:00
parent cfafbdbc36
commit f541717fe1
156 changed files with 6543 additions and 243 deletions
@@ -0,0 +1,123 @@
# Skybound Enemy Motion Damage Pressure and Projectile Visual Pass
작성일: 2026-04-26 12:46 KST
## 요청 요약
- Stage 1 적기의 이동이 어디에 낀 것처럼 바들바들 떨리는 문제를 개선한다.
- 적 공격 데미지가 사용자 Tac Level에 정비례해서 오르는 느낌이 아니라, 소폭만 상승하도록 조정한다.
- 사용자 기체의 일반 공격 탄환과 Gatling 탄환이 단순 렌더링 도형처럼 보여 아쉬운 문제를 개선한다.
- 스킬과 탄환의 비주얼을 Skybound의 Stylized Casual Magitech 톤앤매너에 맞춰 더 상품성 있게 다듬는다.
## 핵심 문제
### 적 이동 떨림
Stage 1에서 보이는 적기의 떨림은 주로 추적형 AI가 플레이어 근처에서 목표점을 매 프레임 다시 계산하면서 발생했다. 목표를 향해 직선 이동하다가 너무 가까워지면 다음 프레임에 방향이 반대로 튀고, 여기에 회전값도 즉시 플레이어를 향해 바뀌면서 시각적으로 “끼어서 떠는” 것처럼 보였다.
### 적 데미지 상승
적 데미지는 스테이지와 페이즈 압박에 따라 올라가야 하지만, 사용자 Tac Level과 동일한 폭으로 오르면 성장 보상이 무효화된다. 따라서 Tac Level은 적 데미지에 아주 작은 압박 보정만 주는 것이 맞다.
### 플레이어 탄환 비주얼
기본 공격과 Gatling 탄환은 기존 Canvas 사각형/막대 형태가 남아 있어, 현재 게임의 마법공학 기체와 스킬 아이콘 퀄리티에 비해 완성도가 낮게 보였다.
## 적용한 변경
### 적 회전 안정화
적기의 회전을 즉시 목표 각도로 바꾸지 않고 `smoothEnemyRotation`을 통해 보간한다.
이제 적은 플레이어를 향해 부드럽게 회전하며, 근거리에서 회전값이 프레임마다 튀는 현상이 줄어든다.
### 추적형 적 이동 안정화
`chase` 패턴에 속도 보간과 근거리 감속을 추가했다.
- 목표점으로 바로 이동하지 않고 `vx`, `vy`를 보간한다.
- 플레이어와 너무 가까워지면 속도를 줄인다.
- 일정 거리 안으로 들어오면 살짝 밀려나며 겹침을 완화한다.
### 적끼리 겹침 완화
`applyEnemySeparation`을 추가했다. 적이 서로 너무 가까이 붙으면 약하게 밀어내어, 여러 적이 한 점에 몰려 떨리는 문제를 줄인다.
적 종류별 최소 거리도 다르게 적용한다.
- 일반 적: 작은 거리
- 엘리트: 중간 거리
- 미니보스: 더 큰 거리
### 적 데미지 보정 완만화
기존에는 페이즈 난이도 배율이 탄속/데미지에 직접적으로 강하게 반영될 수 있었다. 이제 아래처럼 완만하게 조정했다.
- 탄속은 페이즈 배율을 직접 곱하지 않고 작은 `phaseSpeedPressure`만 반영한다.
- 데미지는 스테이지 커브를 기본으로 하되 `phaseDamagePressure`를 제한적으로 적용한다.
- 사용자 Tac Level은 최대 `+18%`까지만 적 데미지에 반영한다.
의도는 다음과 같다.
- 플레이어가 성장해도 적이 완전히 무력해지지는 않는다.
- 하지만 플레이어 레벨이 올랐다고 적 데미지가 같은 폭으로 따라오지는 않는다.
- 성장 보상은 유지하고, 긴장감만 조금 보강한다.
### 플레이어 탄환 비주얼 개선
기본 탄환, Gatling 탄환, Rayce 탄환, 드론 탄환에 `visualKind`를 부여했다.
추가된 visualKind:
- `arc_bolt`
- `gatling_round`
- `rayce_lance`
- `micro_missile`
- `arc_vulcan`
- `drone_shot`
### Magitech Projectile Renderer 추가
`GameRenderer``renderMagitechProjectile`을 추가했다. 기존 사각형 탄환 대신 아래 요소를 가진 발사체로 렌더링된다.
- 밝은 코어
- 마법공학 외곽 라인
- 발사 방향 꼬리광
- 글로우
- 작은 룬/핀 라인
- 기체/무기별 색상 차이
Gatling은 골드빛 짧은 고속탄, 기본 Falcon 탄은 시안 아크 볼트, Rayce는 마젠타 랜스형 탄환으로 보이게 했다.
## 설계 의도
이번 변경은 조작감과 시각 품질을 동시에 개선하는 작업이다.
적 이동은 “불안정한 버그처럼 보이는 흔들림”이 아니라, 의도된 추적/회피 압박처럼 보여야 한다. 또한 적 데미지는 플레이어 성장과 같은 폭으로 따라오면 안 된다. 플레이어는 강해져야 하고, 적은 그 강함을 무효화하지 않는 선에서 압박을 유지해야 한다.
탄환 비주얼은 Skybound의 가장 자주 보는 이펙트이므로, 단순 도형이 남아 있으면 전체 완성도를 낮춘다. 이번 변경으로 기본 공격도 스킬과 같은 톤의 Magitech 무장처럼 보이게 했다.
## 수정 파일
- `/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/SpawnerSystem.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/23`
## 후속 플레이테스트 체크 포인트
- Stage 1 일반 적이 플레이어 근처에서 바들바들 떨지 않는지 확인한다.
- 적이 겹칠 때 자연스럽게 분산되는지 확인한다.
- Tac Level이 올라가도 적 데미지가 과하게 따라오지 않는지 확인한다.
- Falcon 기본탄과 Gatling 탄환이 사각형 도형이 아니라 마법공학 발사체처럼 보이는지 확인한다.
- Rayce 탄환이 Falcon과 충분히 구분되는지 확인한다.
- 이후 스킬별 전용 Canvas/PNG 이펙트를 더 세분화할지 결정한다.
@@ -0,0 +1,172 @@
# Skybound HP Scarcity and Module Cache Rewards
작성일: 2026-04-26 13:01 KST
## 요청 요약
- Stage 1 플레이 중 하트 HP 회복 아이템이 너무 자주 드롭되어 위기감이 사라지는 문제를 개선한다.
- 초반에는 어느 정도 회복을 주되, 항상 충분하게 주기보다 “조금 아쉬운” 수준으로 조정한다.
- 전투 중 모듈이 자동 지급되어 획득 재미가 떨어지는 문제를 개선한다.
- 보물 상자 혹은 모듈 상자 이미지를 만들고, 사용자 인벤토리에 stacking되게 한다.
- 상자를 열었을 때 모듈 획득 이펙트와 연출을 추가한다.
- 일반 등급은 기본 연출, 상급 이상은 개봉 중 기대감을 줄 수 있는 힌트 연출을 제공한다.
## 핵심 문제
기존 보상 구조는 적 처치 시 장비가 곧바로 `inventory`에 추가되는 방식이었다.
이 구조는 기능적으로는 빠르지만, 사용자가 다음 감각을 느끼기 어렵다.
1. 내가 무언가를 얻었다는 소유감
2. 전투 후 보상을 확인하는 기대감
3. 상자를 열 때 “이번에는 뭐가 나올까” 하는 가챠/루팅 재미
4. 등급별 보상의 차이
또한 하트 드롭은 대량의 적 처치 수와 결합되면서 체력 결핍이 거의 발생하지 않는 상태를 만들었다.
## 적용한 변경
### HP 회복 아이템 희소화
기존에는 적 처치 시 25% 확률로 필드 아이템이 나오고, 그중 일부가 HP 회복 아이템이었다.
변경 후에는 체력 상태와 쿨다운을 기반으로 HP 드롭을 계산한다.
- HP가 82% 이상이면 하트 드롭이 거의 발생하지 않는다.
- HP가 60% 미만일 때부터 하트 확률이 의미 있게 상승한다.
- HP가 35% 미만이면 긴급 회복 가능성을 열어둔다.
- 하트 드롭 후에는 기본 900프레임 쿨다운을 둔다.
- 위기 상황에서는 쿨다운을 480프레임으로 낮춰 완전한 운빨 사망은 줄인다.
- 엘리트와 미니보스는 회복/보상 드롭 가능성이 조금 더 높다.
### 회복량 조정
하트 하나가 체력을 너무 크게 회복하지 않도록 회복량을 낮췄다.
변경 전:
- 필드 하트: 최대 HP의 20%
- 회복 에어드롭: 최대 HP의 40%
변경 후:
- 필드 하트: 최대 HP의 14%
- 회복 에어드롭: 최대 HP의 32%
목표는 “살았다”는 안도감은 주되, 바로 100% 안정권으로 돌아가지 않게 만드는 것이다.
### 자동 모듈 지급 제거
일반 적 처치 시 장비가 직접 지급되는 흐름을 제거했다.
변경 후:
- 일반 적은 장비/모듈 캐시를 지급하지 않는다.
- 엘리트, 미니보스, 보스 보상은 즉시 장비 지급이 아니라 `Module Cache`로 전환된다.
- 캐시는 격납고 인벤토리에 stacking된다.
- 실제 장비는 사용자가 캐시를 열 때 생성된다.
이제 전투 중에는 “보상 상자를 회수했다”는 흐름이 되고, 장비 획득은 격납고에서 별도 개봉 경험으로 분리된다.
### Module Cache 인벤토리 추가
`useGameStore``moduleCaches` 상태와 액션을 추가했다.
추가된 액션:
- `addModuleCache(cache)`
- `openModuleCache(cacheId)`
`openModuleCache`는 캐시의 등급과 클래스 정보를 기반으로 장비를 생성하고, 해당 장비를 `inventory``isNew` 상태로 추가한다.
### Module Cache 이미지 추가
톤앤매너에 맞춘 Stylized Casual Magitech 상자 SVG를 추가했다.
특징:
- 굵은 외곽선
- 시안/라임 마력 코어
- 블루 메탈 케이스
- 골드 띠 장식
- 상자 개봉 UI에서 재사용 가능한 벡터 에셋
추가 파일:
- `/Volumes/Data/project/Antigravity/Skybound/public/sprites/module_cache.svg`
### 격납고 Module Cache UI 추가
`HangarOverlay`의 Loadout 탭에 `Module Caches` 섹션을 추가했다.
UI 동작:
- 같은 등급/클래스/출처의 캐시는 하나의 카드로 stacking 표시된다.
- 카드에는 `xN` 카운트가 표시된다.
- Elite Cache, Command Cache, Boss Cache 출처가 표시된다.
- 클릭하면 해당 캐시 1개를 개봉한다.
### 등급별 개봉 연출 추가
캐시 개봉 시 별도 오버레이가 뜨도록 했다.
연출 구성:
- 어두운 배경 블러
- 캐시 중심 이미지
- 등급 색상 기반 발광
- 회전하는 아케인 링
- 작은 마력 스파크
- 개봉 중 힌트 텍스트
- 최종 모듈 이름/타입/스탯 공개
일반 등급은 짧은 기본 개봉으로 처리하고, GOOD 이상은 개봉 중 다음 힌트를 보여준다.
- 모듈 타입 신호
- 보상 출처
- 등급 신호 안정화 문구
이를 통해 상급 이상 상자는 결과 공개 전 기대감을 주는 구조로 만들었다.
## 설계 의도
이번 패스의 목표는 Stage 1의 생존 긴장감과 보상 기대감을 동시에 살리는 것이다.
하트는 플레이어를 완전히 방치하지 않되, 항상 충분하게 주지 않는다.
모듈은 자동 지급에서 상자 개봉으로 바꿔 다음 루프를 만든다.
1. 전투에서 엘리트/보스 처치
2. 모듈 캐시 획득
3. 격납고로 복귀
4. 캐시 stack 확인
5. 캐시 개봉
6. 모듈 획득
7. 장착/합성/분해 선택
이 구조는 Vampire Survivors류의 런 성장과 Survivor.io류의 메타 보상 사이를 이어주는 역할을 한다.
## 수정 파일
- `/Volumes/Data/project/Antigravity/Skybound/public/sprites/module_cache.svg`
- `/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/StageDirectorSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/types.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/HangarOverlay.tsx`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/HangarOverlay.css`
## 검증
- `npm run build` 성공
- `/sprites/player.png` 경고 없음
- 출력 디렉터리: `dist/24`
## 후속 플레이테스트 체크 포인트
- Stage 1 초반 하트가 너무 부족해서 불합리하게 느껴지지 않는지 확인한다.
- Stage 1 중반 이후 체력이 즉시 100%로 복구되는 빈도가 줄었는지 확인한다.
- 엘리트/보스 처치 후 캐시 획득 문구가 보상처럼 느껴지는지 확인한다.
- 격납고에서 캐시 stack UI가 충분히 명확한지 확인한다.
- GOOD 이상 캐시 개봉 시 “뭐가 나올까” 하는 기대감이 생기는지 확인한다.
- 캐시 개봉 후 모듈이 `Module Storage`에 자연스럽게 추가되는지 확인한다.
@@ -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이 최종 침공군답게 가장 강한 물량과 화력을 보여주는지 확인한다.
@@ -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 경로가 완전히 막힌 느낌이 들지 않는지 확인한다.
- 미니보스 보상 카드가 여전히 보상답게 느껴지는지 확인한다.
@@ -0,0 +1,63 @@
# Skybound Player Sprite Path Warning Fix
작성일: 2026-04-26 12:11 KST
## 요청 요약
- `npm run build` 시 반복되던 `/sprites/player.png referenced in /sprites/player.png didn't resolve at build time` 경고를 해결한다.
- 필요하다면 Skybound의 Stylized Casual Magitech 톤앤매너에 맞는 플레이어 기체 이미지를 새로 준비한다.
## 원인
경고의 원인은 실제 플레이 중 사용되는 Canvas 렌더링이 아니라, 선택 화면 CSS에서 존재하지 않는 `/sprites/player.png`를 참조하고 있었기 때문이다.
문제 위치는 `src/App.css`의 아래 클래스였다.
- `.plane-preview.falcon`
- `.plane-preview.rayce`
현재 프로젝트에는 `/sprites/player.png`가 없고, 실제 준비된 기체 에셋은 아래 파일이다.
- `/sprites/Falcon.png`
- `/sprites/rayce.png`
따라서 새 이미지를 생성하기보다, 이미 톤앤매너에 맞춰 준비된 실제 기체 에셋으로 경로를 정리하는 것이 적절했다.
## 적용한 변경
### Falcon 미리보기 경로 수정
`/sprites/player.png``/sprites/Falcon.png`로 교체했다.
### Rayce 미리보기 경로 수정
Rayce도 같은 `player.png``hue-rotate`를 걸어 임시로 표현하고 있었기 때문에, 실제 `/sprites/rayce.png`를 직접 사용하도록 바꿨다.
또한 임시 색상 변환 필터를 제거했다.
## 설계 의도
선택 화면은 사용자가 처음 기체의 정체성을 보는 곳이기 때문에, 존재하지 않는 공용 `player.png`나 임시 색상 변환보다 실제 기체별 에셋을 보여주는 편이 상품성 측면에서 낫다.
이번 수정으로 다음 효과가 있다.
- Vite 빌드 경고 제거
- Falcon/Rayce 선택 화면 미리보기 정확도 개선
- 임시 에셋 참조 제거
- 기존 Stylized Casual Magitech 기체 에셋 재사용
## 수정 파일
- `/Volumes/Data/project/Antigravity/Skybound/src/App.css`
## 검증
- `npm run build` 성공
- 기존 `/sprites/player.png` Vite 경고 사라짐
- 출력 디렉터리: `dist/21`
## 후속 작업 제안
- 선택 화면의 기체 미리보기를 정적 배경 이미지가 아니라, Canvas 렌더러와 동일한 축소 프리뷰 컴포넌트로 통일한다.
- Falcon/Rayce의 실제 플레이 성능 차이가 UI 문구와 정확히 대응되는지 점검한다.
- 선택 화면도 현재 게임 HUD/UI 톤과 완전히 맞도록 한 번 더 정리한다.
@@ -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가 너무 넉넉하거나 너무 답답하지 않은지 확인한다.
@@ -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__` 같은 잘못된 값이 저장되지 않는지 확인한다.
- 새 무기를 처음 선택했을 때 기체 변신 연출이 충분히 눈에 띄는지 확인한다.
- 기존 무기 레벨업/패시브 선택 시 변신 연출이 과하게 반복되지 않는지 확인한다.
@@ -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에서 피격 압박은 생겼지만, 갑자기 불합리하게 어려워지지는 않았는지 확인한다.