인벤토리 / 창고 작성완료구현밸런싱미완료
플레이어 자산을 담는 휴대 인벤토리·창고, 그리고 그 안에서 장비를 꺼내 입는 장착 슬롯의 구조와 운영을 정의한다. 익스트랙션 게임에서 “무엇을 들고 들어가고, 무엇을 두고 나오는가”의 의사결정 무대다.
플레이 흐름
섹션 제목: “플레이 흐름”flowchart LR
subgraph LOBBY [🏠 로비]
PREP[🎒 출정 전 준비<br/>창고 → 휴대 + 장착]
end
subgraph RUNZONE [⚔️ 런 중]
RUN[루팅 · 전투]
WEIGHT[⚖️ 무게 증가<br/>이동·구르기·질주 둔화]
end
subgraph RESULT [🎯 정산]
DECIDE{탈출 시도}
KEEP[✅ 휴대 보존<br/>로비에서 창고로]
LOSE[💀 휴대 전부 손실<br/>창고만 유지]
end
PREP --> RUN --> WEIGHT --> DECIDE
DECIDE -->|성공| KEEP
DECIDE -->|사망·시간 초과·포기| LOSE
classDef prep fill:#e0f2fe,stroke:#0284c7,stroke-width:2px,color:#075985
classDef run fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#78350f
classDef weight fill:#fed7aa,stroke:#ea580c,stroke-width:2px,color:#7c2d12
classDef decide fill:#e9d5ff,stroke:#9333ea,stroke-width:2.5px,color:#581c87
classDef ok fill:#bbf7d0,stroke:#16a34a,stroke-width:2.5px,color:#14532d
classDef ng fill:#fecaca,stroke:#dc2626,stroke-width:2.5px,color:#7f1d1d
class PREP prep
class RUN run
class WEIGHT weight
class DECIDE decide
class KEEP ok
class LOSE ng
linkStyle 3 stroke:#16a34a,stroke-width:3px
linkStyle 4 stroke:#dc2626,stroke-width:3px 핵심 원칙
섹션 제목: “핵심 원칙”| 원칙 | 규칙 | 의미 |
|---|---|---|
| 공간 관리가 선택을 만든다 | 행×열 격자, 아이템마다 sizeX × sizeY 점유 | 무엇을 가져갈지 매번 결정해야 한다 |
| 런 자산과 장기 자산을 분리한다 | 휴대(런용)와 창고(거점용)는 별개 컨테이너 | 탈출 성공/실패의 보상 차이를 만든다 |
| 배치 숙련도를 허용한다 | 90도 회전(isRotate)으로 칸 모양 변경 가능 | 잘 배치하면 같은 공간에 더 많이 담는다 |
| 장착 판단과 보관 판단을 분리한다 | 격자 칸과 장착 슬롯은 별도 영역 | 무기·방어구의 “지금 쓸 것”과 “들고 갈 것”을 따로 본다 |
| 많이 가져갈수록 행동 리스크가 커진다 | 휴대 무게가 이동·구르기·질주 성능에 영향 | 욕심과 생존 사이의 트레이드오프 |
손실 규칙 요약
섹션 제목: “손실 규칙 요약”| 사건 | 휴대 인벤토리 | 창고 |
|---|---|---|
| 탈출 성공 | 전부 보존 → 로비에서 창고로 옮길 수 있음 | 변동 없음 |
| 사망 | 전부 손실 (시작 빈 인벤토리로 복귀) | 변동 없음 |
| 탈출 실패 (시간 초과·자발적 포기 포함) | 전부 손실 | 변동 없음 |
장착 슬롯에 올라가 있던 아이템도 휴대 안에 있는 것으로 취급된다 — 사망 시 같이 손실.
휴대 인벤토리
섹션 제목: “휴대 인벤토리”런에 들고 들어가는 자산을 담는 그리드 컨테이너다. 플레이어는 제한된 칸 안에서 “무엇을 가져갈지 — 무엇을 더 줍고 무엇을 버릴지 — 지금 탈출할지”를 매 순간 판단한다.
| 항목 | 값 |
|---|---|
| 기본 격자 크기 | 6행 × 10열 = 60칸 |
| 운영 방식 | 시트로 관리. 캐릭터 클래스·메타 성장·미션으로 확장 가능. |
| 초기 화폐 | 캐릭터 생성 시 부여 (playerMoney). 화폐도 1칸 스택형 아이템으로 인벤토리에 함께 보관. |
| 보존 | 탈출 성공 → 유지 / 사망·실패 → 전부 손실 + 빈 인벤토리로 복귀 |
Bag 슬롯에 가방을 장착하면 격자가 추가로 늘어난다 (BagTableData.extraSlotRowColumn).
로비 거점에 두는 자산을 담는 영구 보관소다. 휴대보다 약 3배 넓다.
| 항목 | 값 |
|---|---|
| 기본 격자 크기 | 19행 × 10열 = 190칸 |
| 위치 | 로비의 주막 안 창고 (NPC: 주막 아줌마) |
| 접근 | Storage 오브젝트 상호작용 ([F]) — 로비에서만 |
| 보존 | 런 결과와 무관하게 항상 유지 |
격자 크기는 시트로 관리하며 클래스·메타 진행으로 확장 가능.
자산 흐름
섹션 제목: “자산 흐름”flowchart LR subgraph LOBBY [🏠 로비] L[로비 거점] S[📦 창고<br/>19×10=190칸] end subgraph CARRY [🎒 휴대 영역] P[휴대 인벤토리<br/>6×10=60칸] end subgraph RUNZONE [⚔️ 런] R[런] end subgraph RESULT [🎯 종료] K[✅ 자산 보존] X[💀 휴대 전체 손실] end L --> S L --> P S <-->|로비에서 자유 이동| P P -->|런 진입| R R -->|루팅으로 추가| P R -->|탈출 성공| K R -->|사망·실패| X K --> P X --> P classDef lobby fill:#e0f2fe,stroke:#0284c7,stroke-width:2px,color:#075985 classDef store fill:#dbeafe,stroke:#1d4ed8,stroke-width:2px,color:#1e3a8a classDef carry fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#78350f classDef run fill:#fed7aa,stroke:#ea580c,stroke-width:2px,color:#7c2d12 classDef ok fill:#bbf7d0,stroke:#16a34a,stroke-width:2.5px,color:#14532d classDef ng fill:#fecaca,stroke:#dc2626,stroke-width:2.5px,color:#7f1d1d class L lobby class S store class P carry class R run class K ok class X ng linkStyle 5 stroke:#16a34a,stroke-width:3px linkStyle 6 stroke:#dc2626,stroke-width:3px
- 로비에 있을 때 휴대 ↔ 창고 자유 이동.
- 런 중에는 휴대만 접근 가능. 창고는 닫혀 있음.
그리드 배치 규칙
섹션 제목: “그리드 배치 규칙”각 아이템은 다음 데이터로 격자에 배치된다.
| 필드 | 의미 |
|---|---|
sizeX, sizeY | 아이템 원본 칸 크기 |
coordinateX, coordinateY | 격자 위 좌상단 좌표 |
isRotate | 90도 회전 적용 여부 (모든 아이템 회전 가능) |
count | 동일 아이템 누적 개수 (스택형) |
stack | 한 칸이 담을 수 있는 최대 스택 |
운영 상태는 세 가지 리스트로 관리된다.
| 리스트 | 의미 |
|---|---|
ItemUIInfos | 격자에 확정된 아이템 |
DummyItemUIInfos | 드래그·임시 배치 중인 아이템 |
VirtualItemUIInfos | 빈칸 찾기 등 가상 계산용 |
드래그 시작 → Dummy 등록 → 드롭 위치 결정 → Settle → ItemUI로 이전.
장착 슬롯
섹션 제목: “장착 슬롯”장착 슬롯은 격자 칸과 분리된 부위별 슬롯이다. 14종.
| 슬롯 | 받는 아이템 | 동시 장착 수 |
|---|---|---|
Head | Head | 1 |
Torso | Torso | 1 |
Hands | Hands | 1 |
Legs | Legs | 1 |
Feet | Feet | 1 |
Belt | Belt | 1 |
Neck | Amulet | 1 |
Ring1 | Ring | 1 |
Ring2 | Ring | 1 |
RightHand | Weapon 또는 Shield | 1 |
LeftHand | Weapon 또는 Shield | 1 |
Bag | Bag | 1 |
Parts | Parts (Main/Sub) | 무기에 종속 |
Quick | Utility 위주 | Belt.slotCount만큼 |
양손 / 이도류
섹션 제목: “양손 / 이도류”양손 무기는 RightHand 한 슬롯만 점유하고 LeftHand는 비어 있는 상태로 표시된다. 이도류(좌우 무기 동시) 도입 여부는 추후 결정.
반지 두 개
섹션 제목: “반지 두 개”Ring1·Ring2 분리. 반지 2개 동시 장착 가능.
Quick 슬롯
섹션 제목: “Quick 슬롯”- 단축키로 빠르게 사용. 주 용도는 Utility(포션 등).
- 슬롯 수는 장착한 벨트(
BeltTableData.slotCount)가 결정. - 단축키 현재 매핑: 숫자키 1~5 (추후 돌리기형 휠 검토).
- 쿨다운: 공용 쿨다운(예: 0.5~1.0초 다른 Quick 사용 잠금) + 아이템 개별 쿨다운.
UtilityTableData.preDelay로 캐스팅 시간 별도 적용.
무게와 이동
섹션 제목: “무게와 이동”가져가는 양과 행동 자유도의 트레이드오프를 만드는 시스템.
무게가 영향을 주는 것
섹션 제목: “무게가 영향을 주는 것”| 영향 | 메커니즘 |
|---|---|
| 이동속도 | 최종 이동속도 = 기본속도 × Ml(r) × 지형감속 (r = 착용무게/최대중량) |
| 구르기 | 무게 증가 → 무적 시간 감소 / 앞뒤 시간 증가 |
| 질주 | 이동속도 기반이라 무게가 늦으면 질주도 느림 |
| 생존 자원 | 과적 상태에서 Hunger·Thirst가 더 빨리 감소 |
최대 중량 산식
섹션 제목: “최대 중량 산식”CW = CW_Base + F_dh(STR) + F_dh(VIT)| 항 | 의미 |
|---|---|
CW_Base | 기본 중량 한도 (기본 200) |
F_dh(STR) | 근력에 따른 한도 증가 (Δ-더블 힐) |
F_dh(VIT) | 체력에 따른 한도 증가 (Δ-더블 힐) |
무게 비율 → 이동속도 곡선
섹션 제목: “무게 비율 → 이동속도 곡선”| 구간 | 효과 |
|---|---|
r ≤ 1 (한도 이하) | 가벼울수록 보너스. 최대 ×1.10 |
r > 1 (한도 초과) | 무거울수록 감속. 바닥 ×0.35 |
코드 기본 파라미터: mMin = 0.35, mMax = 1.10, p = 6 (좌측 곡률), h = 12 (우측 곡률).
가벼우면 약간 빨라지고, 초과하면 빠르게 둔해진다. 한도 정확히 맞추기가 아니라 여유롭게 가져가는 쪽이 보너스가 있다는 의도.
거래 / 모루 / 미션 인벤토리 공유
섹션 제목: “거래 / 모루 / 미션 인벤토리 공유”같은 InventoryInfo 구조를 재사용해 여러 상호작용 UI에서 동일한 격자 조작을 제공한다.
| 용도 | 컨테이너 |
|---|---|
| 휴대 인벤토리 | PlayerInventoryInfo |
| 창고 | StorageInventoryInfo |
| 거래 (상인) | TradeInventoryInfo — NPC 제안 칸 + 플레이어 제안 칸 양측 |
| 모루 (파츠) | AnvilInventoryPopup이 PlayerInventoryInfo를 그대로 사용 |
| 미션 (반납·확인) | MissionPopup이 PlayerInventoryInfo를 그대로 사용 |
| 상자 / 시체 | 별도 컨테이너로 휴대와 양방향 이동 |
거래 인벤토리는 NPC 제안 영역과 플레이어 제안 영역으로 나뉘어 양측 칸 점유를 별도로 관리한다.
확정 필요
섹션 제목: “확정 필요”- 이도류 운용 정책 (좌우 무기 동시 / 한쪽 방패 전용).
- Quick 슬롯 공용 쿨다운·아이템 개별 쿨다운의 수치.
- 격자 확장의 클래스·메타·미션 트리거 기준.
- 회전 제약 아이템(예: 명괴 무기) 도입 여부.
연결 시스템
섹션 제목: “연결 시스템”| 시스템 | 연결 지점 |
|---|---|
| 런 구조 | 출정 전 준비 단계에서 휴대↔창고 정리. 런 종료 시 보존/손실 처리. |
| 아이템 / 루팅 / 드랍 | 루팅 결과(DropItemInfo)가 휴대에 적재. 아이템 칸 크기·스택은 아이템 마스터 종속. |
| 전투 | 휴대 무게가 이동·구르기·질주 성능에 영향. 장착 무기·방패가 전투 능력 결정. |
| 파츠 | 모루에서 휴대 무기에 파츠 결합. isAnvilSettled 플래그 연동. |
| 미션 / NPC / 상인 | 거래 인벤토리·미션 반납이 휴대 인벤토리를 직접 참조. |
| 캐릭터 스테이터스 | STR·VIT가 최대 중량을 결정. |
데이터 시트 매핑
섹션 제목: “데이터 시트 매핑”| 영역 | 시트 / DTO |
|---|---|
| 휴대 / 창고 격자 크기 | (코드 상수 — 시트화 예정) |
| 아이템 칸 크기·스택·무게 | 아이템 시트 ItemTableData (inventorySize, weight, stack) |
| 가방 확장 칸 | 아이템 시트 BagTableData.extraSlotRowColumn |
| 벨트 Quick 슬롯 수 | 아이템 시트 BeltTableData.slotCount |
| 무게 곡선 파라미터 | WeightMoveSpeedCalculator (ScriptableObject — 시트화 검토) |