아이템 / 루팅 / 드랍 작성완료구현밸런싱미완료
본 문서는 익스트랙션의 핵심 보상 구조인 아이템 생성·드랍·루팅 흐름을 정의한다. 카테고리·등급 같은 분류 기준은 아이템 분류 정책에 두고, 본 문서는 어디서 생성되어 어떻게 결정·획득되는가를 다룬다.
플레이 흐름
섹션 제목: “플레이 흐름”flowchart TD subgraph GEN [맵 생성 시점] M[인게임 진입] A[드랍 후보 확정<br/>몹 착용 · 상자 내용물] end subgraph RUNZONE [런 진행] R[탐색 · 전투] end subgraph LOOT [루팅 행위] L[시체 루팅] C[상자 루팅] I[낱개 획득] end subgraph CORRECT [시점 보정] D[수량 · 등급 보정<br/>행운 · 수량 스탯] end subgraph DONE [결과] P[인벤토리 적재] end M --> A --> R R -->|몹 처치| L R -->|상자 상호작용| C R -->|낱개 줍기| I L --> D C --> D D --> P I --> P classDef gen fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#4c1d95 classDef run fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#78350f classDef loot fill:#fed7aa,stroke:#ea580c,stroke-width:2px,color:#7c2d12 classDef correct fill:#e9d5ff,stroke:#9333ea,stroke-width:2.5px,color:#581c87 classDef done fill:#bbf7d0,stroke:#16a34a,stroke-width:2.5px,color:#14532d class M,A gen class R run class L,C,I loot class D correct class P done
핵심 원칙
섹션 제목: “핵심 원칙”| 원칙 | 규칙 | 의미 |
|---|---|---|
| 맵 생성 시 확정 | 몹 착용 아이템, 상자 내용물 후보는 인게임 진입 시점에 결정 | 런 중간에 재추첨하지 않는다 |
| 루팅 시 확정 | 실제 획득 등급·수량은 루팅 행위 시점에 보정 | 행운·수량 스탯이 그 시점에 적용된다 |
| 100% 드랍 아님 | 몹이 가진 아이템이 그대로 다 드러나지 않는다 | 수량 수치로 노출 비율을 결정한다 |
| 카테고리 중복 회피 | 한 몹/상자에서 같은 세부 카테고리(예: 신발)는 두 번 부여되지 않는다 | 장비 조합 다양성 유지 |
| 무기는 별개 처리 | 무기는 0개 또는 1개. 일반 장비 카테고리 카운트와 분리 | 무기 과다 드랍 방지 |
드랍 소스
섹션 제목: “드랍 소스”플레이어가 런 중 아이템을 얻는 소스는 세 가지다.
| 소스 | 정의 | 핵심 클래스 |
|---|---|---|
| 몬스터 시체 | 처치한 몬스터를 시체 상호작용으로 루팅 | MonsterGenerator, MonsterInfoTableData |
| 상자 | 맵에 배치된 상자 (ChestGroup 단위 관리) | ChestGroup, ChestGroupTableData |
| 낱개 아이템 | 맵에 직접 배치된 단일 아이템 | ItemGroup, MapDropItemInfo |
상자 종류
섹션 제목: “상자 종류”코드(DropTierTableData.woodChestValue / jewelChestValue / lockedChestValue) 기준 상자는 3종.
| 종류 | 코드 키 | 의도 |
|---|---|---|
| 나무 상자 | WoodChest | 일반 상자, 등급 보상 낮음 |
| 보석 상자 | JewelChest | 고급 상자, 등급 보상 상승 |
| 잠긴 상자 | LockedChest | 해제 행위 필요. 보상 더 큼 (추정) |
1. 맵 생성 시 (인게임 진입 시점)
섹션 제목: “1. 맵 생성 시 (인게임 진입 시점)”플레이어가 진입하면 다음이 한 번에 결정된다.
1.1 몹별 드랍 후보 확정 절차
섹션 제목: “1.1 몹별 드랍 후보 확정 절차”각 스폰된 몬스터마다 다음 절차를 거친다. 기준 테이블은 몬스터의 tier로 조회한 DropTier 테이블 한 행.
| 단계 | 입력 | 결정 내용 | 관련 컬럼 |
|---|---|---|---|
| 1 | 몬스터 tier | 무기 장착 여부 (0/1) | weaponKinds0Value, weaponKinds1Value |
| 2 | 무기 장착 시 | 가능한 무기 후보 리스트 — 몹의 weaponQueryTags로 의미 필터 (태그 시스템) | 몹 테이블 + 아이템 태그 |
| 3 | 후보 안에서 | 가치(WorthRarity) 가중치 기반 1개 선택 — 몹의 DropWorth 이하만 후보 | 아이템 테이블 |
| 4 | 선택된 무기 | 파츠 부착 비율 결정 | partsRate20Value 등 5단계 |
| 5 | 몹 tier | 방어구 장착 개수 (0~4) | armorKinds0Value ~ armorKinds4Value |
| 6 | 개수만큼 | 방어구 후보 리스팅 → 가치 가중치 추첨, 세부 카테고리 중복 금지 | |
| 7 | 몹 tier | 잡템(Misc) 개수 (0~6) | miscKinds0Value ~ miscKinds6Value |
| 8 | 개수만큼 | 잡템 후보 리스팅 → 가치 가중치 추첨, 세부 카테고리 중복 금지 | |
| 9 | 잡템마다 | 스택 개수 결정 | DropStackCount (스택 α 함수) |
| 10 | 몹 tier | 골드 드랍 여부·최대값 | noneMoneyRate, minMoney, maxMoney |
이렇게 정해진 결과가 **몹의 “착용 아이템”**이며 시체 루팅의 풀이 된다.
1.2 상자 내용물 확정 절차
섹션 제목: “1.2 상자 내용물 확정 절차”ChestGroup은 그룹 단위로 묶인 상자들이며, 각 그룹은 ChestGroupTableData로 카테고리별 의미 태그 쿼리를 가진다 (매칭 규칙은 태그 시스템 §4).
weaponQueryTags— 무기 의미 태그 쿼리mainPartsQueryTags— Main 파츠 의미 태그 쿼리subPartsQueryTags— Sub 파츠 의미 태그 쿼리armorQueryTags— 방어구 의미 태그 쿼리miscQueryTags— 잡템 의미 태그 쿼리
그룹 단위 파라미터(dropWorthValue, dropEquipKindsValue, dropPartsRateValue, dropMiscKindsValue, dropGradeValue, dropMoneyValue, dropStackCountValue, dropStackCountAlpha)는 몹과 동일한 알고리즘으로 작동한다.
1.3 낱개 아이템
섹션 제목: “1.3 낱개 아이템”ItemGroup 단위로 맵에 수동 배치된다. 후보 결정은 그룹별 정의를 따른다 (상세는 맵 모듈 시스템 문서에서 다룸).
2. 등급 결정
섹션 제목: “2. 등급 결정”루팅 후보가 정해진 아이템마다 등급이 부여된다. 등급은 7단계.
Poor → Common → Uncommon → Rare → Epic → Legendary → Artifact
등급은 DropTier 테이블의 등급 확률 컬럼으로 결정된다. 같은 tier라도 행마다 분포가 달라 고티어 몹일수록 상위 등급 비율이 높다.
| 컬럼 | 의미 |
|---|---|
itemGradePoorRate | Poor 등급 확률 |
itemGradeCommonRate | Common 등급 확률 |
itemGradeUncommonRate | Uncommon 등급 확률 |
itemGradeRareRate | Rare 등급 확률 |
itemGradeEpicRate | Epic 등급 확률 |
itemGradeLegendaryRate | Legendary 등급 확률 |
itemGradeArtifactRate | Artifact 등급 확률 |
행 합은 항상 100%여야 한다.
3. 루팅 시점 보정 (행운 / 수량)
섹션 제목: “3. 루팅 시점 보정 (행운 / 수량)”후보가 정해져 있어도 플레이어가 실제로 얻는 양과 등급은 루팅 시점에 보정된다.
3.1 수량 보정 (노출 비율)
섹션 제목: “3.1 수량 보정 (노출 비율)”후보 아이템 중 얼마를 실제로 드러낼지 결정한다. 수량 수치가 높을수록 노출 비율이 올라간다.
| 수량 수치 | 노출 확률 |
|---|---|
| 40 | 20% |
| 100 | 40% |
| 150 | 60% |
| 300 | 80% |
| 600 | 100% |
3.2 등급 보정 (행운)
섹션 제목: “3.2 등급 보정 (행운)”행운 수치가 높을수록 후보 아이템 등급이 한 단계씩 상향될 확률이 부여된다. 보정은 루팅 시 아이템 각각 개별로 적용된다.
| 행운 \ 등급 보정 | +1 | +2 | +3 | +4 | +5 |
|---|---|---|---|---|---|
| 40 | 1% | 1% | – | – | – |
| 100 | 1% | 1% | 1% | – | – |
| 150 | 2% | 1% | 1% | 1% | – |
| 300 | 3% | 2% | 1% | 1% | 1% |
| 600 | 4% | 3% | 1% | 1% | 1% |
최대 등급 초과 시 Artifact로 고정.
4. 인벤토리 적재
섹션 제목: “4. 인벤토리 적재”확정된 DropItemInfo는 다음 정보를 담아 인벤토리에 들어간다.
| 필드 | 의미 |
|---|---|
Category1 | 최상위 카테고리 |
Category2 | 세부 카테고리 |
ItemName | 아이템 식별자 |
ItemGrade | 결정된 등급 |
Count | 개수 |
Stack | 스택 크기 |
PartsInfo | 무기인 경우 부착된 파츠 정보 |
Affixes | 부가 옵션(접사) — 등급/태그로 결정 |
화폐(Money)는 별도 생성자로 처리되며 Count가 골드량, Stack이 스택을 의미한다.
연결 시스템
섹션 제목: “연결 시스템”| 시스템 | 연결 지점 |
|---|---|
| 런 구조 | 런 종료 시 루팅 자산 보존/손실 처리. |
| 맵 모듈 | 몹·상자·낱개 아이템 배치 위치와 그룹 정의. |
| 인벤토리·창고 | 루팅 결과(DropItemInfo)가 격자 인벤토리에 적재. 아이템 칸 크기·스택은 아이템 마스터 종속. |
| 전투 | 무기·파츠·방어구·방패의 실제 성능 적용. |
| 캐릭터 스테이터스 | 행운(Luck)·수량 보정 출처. |
| 미션·NPC·상인 | 아이템 수집 미션 조건 평가, 상인 매입 카테고리. |
데이터 시트 매핑
섹션 제목: “데이터 시트 매핑”| 본 문서 절 | 관련 테이블 / 시트 |
|---|---|
| §1.1 몹 드랍 | 몬스터 정보 테이블, DropTier 테이블, 아이템 마스터 |
| §1.2 상자 드랍 | ChestGroup 테이블, DropTier 테이블, 아이템 마스터 |
| §1.3 낱개 | ItemGroup / MapDropItem 테이블 |
| §2 등급 | DropTier 테이블 (itemGrade*Rate) |
| §3 수량/행운 | 별도 보정 곡선 표 (작성 예정) |
코드–기획 불일치 (드랍 파이프라인 버그)
섹션 제목: “코드–기획 불일치 (드랍 파이프라인 버그)”2026-05-28 코드 점검(Corpse.cs, ItemManager.cs, MonsterGenerator.cs)에서 확인한 의도-구현 괴리. 사용자가 보고한 **“100% 드랍” + “같은 아이템 폭주”**의 직접 원인이다. 상세는 리스크에도 기록.
| # | 증상 | 원인 (코드) | 의도 (기획) |
|---|---|---|---|
| 1 | 100% 드랍 | Corpse.Setup이 후보 리스트(weapon/armor/misc/money)를 전부 그대로 인벤토리에 추가. 노출 확률 적용 단계 없음 | §3.1 수량 수치 → 노출 확률(40→20% … 600→100%) |
| 2 | 빗자루 등 비스택 아이템 5개 복제 | 스택 분배 루프(line 982stack=1) 아이템을 구분 안 함. 스택 포인트 배정 시 plusedCount>stack이 되어 “새 칸 생성” 분기(line 1007Remove로 1차 중복 제거가 있어 정상 | 비스택 아이템은 1개로 끝나야 함 |
| 3 | 잡템 편향 | 잡템 풀이 Belt/Accessory/Bag/Utility/Material/Money 6종을 한 리스트로 합쳐 추첨 → 등록 수 많은 카테고리 독점 | (기획 미명세 — 단일 풀 vs 카테고리별 분배) |
| 4 | 스택 한쪽 쏠림 | 스택 분배가 result.RandomElement() 균등 무작위 → 같은 아이템에 누적 | (기획 미명세 — DropStackCount α 함수 형태 불명) |
| 5 | 무기·방어구 연동 | dropEquipKindsValue 한 컬럼이 무기·방어구 개수를 함께 결정 | 무기 0/1, 방어구 0~4 별도 결정 |
| 6 | 무기 후보 축소 | RemoveWeaponItemKeysWithAvailableParts가 파츠 호환 무기를 후보에서 제외 | (기획 근거 없음) |
가치 가중치(GetRandomItemInfo)는 1/WorthRarity로 구현되어 의도(희귀할수록 덜 뽑힘)와 방향은 맞으나, 함수가 코드 상수로 박혀 시트 밸런싱이 불가하다. 등급 보정(행운, §3.2)은 Corpse.RollItemGrade로 정상 작동하나, 수량 보정(§3.1)은 통째로 미구현이다.
열린 질문
섹션 제목: “열린 질문”WorthRarity/DropWorth의 정확한 산식 및 가치 가중치 계산 방법.DropStackCount의 “스택 α 함수” 정의 (PDF에 함수 형태 미정).- 잠긴 상자의 해제 방식 (키·도구·스킬·미니게임).
- 시체 루팅의 시간 비용 (루팅 시 점유 시간이 있는지, 즉시인지).
- 시체 루팅 중 피격 가능 여부.
Affixes(접사) 부여 규칙과 등급/카테고리 관계.- 도깨비 탈출 아이템 등 특수 카테고리 아이템의 드랍 경로.