# 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|Storage]]`에 자연스럽게 추가되는지 확인한다.
