04. 아이템 (Item)
상위 문서:
게임기획코어.md상태: 실 데이터 176종 입력 ·BasePrice필수 확정 · 분류 정책 미정 바뀌면 갱신:거래·게임기획코어·기획평가·낚시·농사·벌목·사냥산업레벨·자원채취·진행 및 성장·캐릭터
ItemTable이 엑셀→.bytes 파이프라인으로 돌고 있고, 2026-07-31에 더미가 실 데이터로 교체됐다.
1. 확정 사항
1.1 코드에 존재하는 스키마
Server/GameData/Tables/ItemTable.cs (엑셀 Item.xlsx에서 생성):
| 컬럼 | 타입 | 비고 |
|---|---|---|
ItemTID |
int |
아이템 고유 ID |
Name |
string |
|
ItemType |
ItemType |
아이템 분류 (산업 축은 IndustryType으로 갈라졌다 — 1.2) |
GlobalRarity |
GlobalRarity |
희귀도 (구 ItemRarity — 2026-08-02 개명) |
MaxStack |
int |
스택 상한. 현재 상자 15종(100019~100033)만 1000(2026-10-05 · 50에서 올림), 나머지는 9999 |
BasePrice |
int |
기준 가격. 즉시 판매가·거래소 하한의 기준 (2026-09-02 추가) |
Description |
string |
기획 메모 — 로직에서 읽지 않는다 (오타 수정됨) |
1.2 확정 enum
ItemType—Farming=1/Fishing=2/Mining=3/Logging=4/Hunting=5/Misc=6/Special=7. 아이템 분류 전용이다 — 배치·적성·드롭 같은 산업 자리에는IndustryType(1차 산업 5종)을 쓴다. 두 축은 2026-08-10에 갈라졌고 값은 1:1이다 (DropTID·DB 컬럼이 그 숫자에 묶여 있다) → 기획평가 2.7GlobalRarity—Common/Uncommon/Rare/Epic/Legendary/Mythic(색상 정의 포함). 구ItemRarity. 아이템 전용이 아니라 가챠 등 전역 등급 축이라 2026-08-02 개명 (프로토콜EGlobalRarity도 같은 값으로 정렬됨)
⚠️
Hunting은 값5로 중간에 삽입됐다 —Misc·Special이 한 칸씩 밀렸다. 기획 문서 일부가 "값 7로 뒤에 추가"라고 적고 있었으나 실제 구현은 5다. 지금 되돌리면t_user_workstation_slot.industry에 저장된 값이 어긋나므로 그대로 둔다. "enum은 뒤에만 추가한다"는 규칙은 앞으로에만 적용된다.
1.3 실 아이템 데이터 (2026-07-31 · 2026-08-01 레벨 확장)
현재 ItemTable은 176종이다. 더미 A~F는 제거됐다.
| 구분 | 종수 | 계산 |
|---|---|---|
| 산업 자원 | 150종 | 5산업 × 5레벨 × 희귀도 6등급 |
| 가챠 전용 | 6종 | Special · 테스트값 (2026-08-02) |
| 상자 | 15종 | Special · 나무·은·황금 × 산업 Lv1~5 · 여는 풀을 갖는다 → 4.1 |
| 상자 전용 | 3종 | Special · 용도 미정 → 4.1 |
| 인챈트 큐브 | 2종 | Special · 장비 개체에 쓴다 → 4.2 |
| 합계 | 176종 |
⚠️ 2026-08-01에 30종 → 150종이 됐다. 산업 레벨이 도입되면서 레벨마다 6종이 붙었다. 이 문서가 오래 "30종"으로 남아 있었다(2026-08-02 정정).
TID 규칙 — 산업 대역 + 레벨당 10칸 + 희귀도 순 1~6
| 레벨 | 낚시 | 농사 | 벌목 | 채굴 | 사냥 |
|---|---|---|---|---|---|
| Lv1 | 10001~10006 |
20001~ |
30001~ |
40001~ |
50001~ |
| Lv2 | 10011~10016 |
20011~ |
30011~ |
40011~ |
50011~ |
| Lv3 | 10021~10026 |
20021~ |
30021~ |
40021~ |
50021~ |
| Lv4 | 10031~10036 |
20031~ |
30031~ |
40031~ |
50031~ |
| Lv5 | 10041~10046 |
20041~ |
30041~ |
40041~ |
50041~ |
Lv1 아이템 이름 (Lv2~5는 Item.xlsx 참조)
| 산업 | Common → Mythic |
|---|---|
| 낚시 | 붕어 · 잉어 · 월척 붕어 · 향어 · 대물 잉어 · 전설의 잉어 |
| 농사 | 밀 · 감자 · 옥수수 · 인삼 · 변종 인삼 · 태초의 씨앗 |
| 벌목 | 잡목 · 소나무 목재 · 참나무 목재 · 흑단 목재 · 고급 원목 · 세계수 가지 |
| 채굴 | 돌덩어리 · 구리 광석 · 은광석 · 금광석 · 보석 원석 · 심연의 원석 |
| 사냥 | 질긴 고기 · 토끼 가죽 · 늑대 가죽 · 곰 모피 · 거대한 뿔 · 마수의 심장 |
| 가챠 전용 | 100001~100006 — 유리 구슬 · 호박 구슬 · 진주 구슬 · 오팔 구슬 · 용안 구슬 · 창세의 구슬 |
| 상자 전용 | 100010~100012 → 4.1 |
| 상자 | 100019~100033 → 4.1 |
| 인챈트 큐브 | 100015 인챈트 큐브 · 100018 상급 인챈트 큐브 → 4.2 |
- 대역은 산업당 10000개다. 레벨당 10칸 중 6칸만 쓰므로 희귀도가 늘어도 대역이 밀리지 않는다. 레벨이 늘면 자기 대역 뒤로 이어 붙인다.
- 아이템
Description의 레벨 표기는IndustryLevelTable.Name과 같아야 한다 (예:저수지(Lv2)). 어긋나도 로직은 멀쩡하므로 사람이 맞춰야 하는 규칙이다. - 결번:
1~6(구 더미) ·1001~1006(구 낚시). 다시 쓰지 않는다.
1.3 기획 확정 내용
채취로 얻은 아이템으로 특성·스킬을 획득·성장시킨다❌ 폐지 (2026-08-01). 특성은 계정 레벨 포인트로 찍는다 → 특성.- 모든 아이템은 거래소 등록이 가능하다.
아이템의 출구 3개 (2026-08-01 확정)
특성 재료라는 소비처가 없어진 대신, 아이템은 세 곳으로 나간다.
| 출구 | 대상 | 상세 |
|---|---|---|
| 즉시 판매 → 골드 | 주로 Common·Uncommon | 거래 3.1 |
| 거래소 등록 | 주로 Rare~Mythic | 거래 2장 |
| 캐릭터에게 먹이기 | 전 등급 (자원 sink) | 캐릭터 3.1 |
낮은 등급이 죽은 재고가 되지 않는 것이 핵심이다. 거래소만 있으면 Common은 아무도 사지 않아 인벤토리만 채운다.
1.4 채취 보상 — 자원 한 층 + 상자 (2026-10-02)
채취 판정 1회는 <산업>BasicTable에서 자원 하나를 뽑고, 그와 별개로 상자를 굴린다. → 자원채취 2.4
| 층 | 비율 | 아이템 성격 | 테이블 |
|---|---|---|---|
| 채취 보상 | 전량 | 산업 자원. 가중치·아이템 모두 산업별 | <산업>BasicTable ✅ 생성됨 |
| ❌ | 폐지 (2026-07-30). 대물·보석·변종 작물·보스 티켓의 경로 미정 | — |
- 상자는 자원 롤과 따로 굴린다 (2026-10-02).
CommonRewardTable(DropCommon.xlsx)이 레벨마다 그 레벨의 상자 3종과 확률을 갖고, 특정 산업만CommonRewardOverrideTable로 덮어쓴다. 판정마다 자원은 그대로 나오고 상자는 덤이다 → 4.1.
폐지 (2026-07-31). 공통 분포 테이블을 두지 않는다 — 가중치는 각 산업의 드롭 시트가 직접 갖는다. → 자원채취 2.4RarityWeightTable(전 산업 공통 분포) +<산업>BasicTable(매핑만)
각 산업이 레벨마다 희귀도 6단계를 전부 채운다.
5산업 × 5레벨 × 6등급 = 150종이 기본 자원이며, 2026-08-01에 전부 입력됐다 (1.3).
2. 아이템 역할 분류 (제안)
⚠️ 제안이다. 현재
ItemType은 어느 산업에서 나왔는가만 나타내고 용도를 나타내지 않는다.
| 역할 | 설명 | 예 |
|---|---|---|
| 재료 | 특성 해금·레벨업에 소모 | 산업별 기본 자원 |
| 고유 아이템 | 수집·거래 대상. 소모되지 않음 | 희귀 산출물 |
| 티켓 | 가챠·이벤트 재화 | 가챠 티켓 |
| 입장권 | 콘텐츠 도전에 소모 | 보스 티켓 (사냥 전용, ⚠️ 획득 경로 미정) |
| 화폐 | 거래소 결제 수단 | 돈 |
보스 티켓은 가챠 티켓과 다른 축이다. 가챠는 확률 뽑기, 보스 티켓은 콘텐츠 입장권이다.
ItemUsage를 도입한다면 이 둘을 구분해야 한다. 거래 가능 여부도 갈릴 수 있다 (보스 티켓이 거래되면 사냥을 안 하고도 보스에 갈 수 있다 — 의도인지 확인 필요).
현재 스키마에는 이 축이 없다.
ItemUsage컬럼을 추가하거나,Misc/Special을 용도 표기로 전용하는 두 가지 방법이 있다. 전자를 권장 — 후자는 "출처"와 "용도"를 한 컬럼에 섞는다.
스택 정책
MaxStack이 이미 존재한다. 역할별 기준을 세운다.
| 역할 | 스택 | 이유 |
|---|---|---|
| 재료 | 큰 값 (1,000~) | 방치로 대량 축적됨 |
| 고유 아이템 | 1 | 개체 식별 필요 시 |
| 티켓 | 중간 | |
| 화폐 | 스택 개념 없음 (별도 필드) |
✅ 개체 변량 없음 (2026-07-27 확정)
모든 아이템은 개체별 수치 롤을 갖지 않는다. 같은 ItemTID면 완전히 동일하다.
- 한때 검토됐던 물고기 크기(개체마다 다른 수치)는 폐기됐다.
- 등급 차이는 희귀도가 다른 별도
ItemTID로 표현한다. 예:붕어(Common)/월척 붕어(Rare)/대물 붕어(Epic) - 따라서 모든 아이템이
MaxStack대로 정상 스택된다. 개체 인스턴스 테이블이 필요 없다.
| 얻은 것 | 내용 |
|---|---|
| 인벤토리 | 스택 충돌 없음. 행 수가 아이템 종류 수로 제한됨 |
| 정산 | Dictionary<ItemTID, count> 집계로 끝남 |
| 거래소 | 같은 아이템은 같은 값. 개체별 시세가 없어 UI·검색이 단순 |
대가로 아이템 종류 수가 늘어난다. 어종 × 등급만큼
Item.xlsx행이 생긴다. 같은 자원의 등급 변형을 몇 단계로 둘지는 산업 문서에서 정한다.
3. 인벤토리 (제안)
| 논점 | 선택지 | 권장 |
|---|---|---|
| 용량 제한 | 있음 / 없음 | 없음 또는 매우 큼 — 방치 중 가득 차면 P2 위반 |
| 가득 찼을 때 | 채취 중단 / 초과분 소멸 / 자동 판매 | 용량을 두려면 자동 판매 |
| 정렬·필터 | 산업별 / 희귀도별 | 팝업 UI에서 제공 |
방치형에서 "인벤토리가 차서 채취가 멈춰 있었다"는 최악의 경험이다. 용량 제한을 넣을 거면 반드시 넘침 처리가 함께 있어야 한다.
4. 가챠 · 상자
- 가챠 풀은 엑셀이 원본이다.
Gacha.xlsx가 시트 넷을 갖는다 —GachaInfoTable(풀 이름·비용) ·GachaItemTable(아이템 풀) ·GachaCharacterTable(캐릭터 풀) ·GachaEquipTable(장비 풀 — 무기·장신구·보석을 풀로 나눈다 → 캐릭터 5.1.1). 각 시트가 자기 TID에Ref를 걸어 실재하지 않는 보상은 생성 단계에서 막힌다. 등급은 풀에 두지 않고 정의 테이블(ItemTable·CharacterTable·EquipTable)에서 읽는다(단일 원본). - 가챠 결과물 = 캐릭터로 확정 (2026-09-02). 캐릭터 획득 경로가 가챠로 정해졌다
→ 캐릭터 5.1. 아이템 풀(1번)은 화면에서 빼고 서버 테스트용으로만 남긴다
(2026-09-22 · 이슈 #30) —
클라 뽑기 버튼 2줄을 지웠고(
81bd727), 테이블(GachaInfoTable1번 ·GachaItemTable의GachaId=16행)은GachaServiceTest가 비용 메타를 읽으므로 그대로 둔다. 구슬 6종(100001~100006)도 남는다. - 비용은 골드 직접이다. 가챠 티켓을 만들지 않는다 → 거래 3.2.
- 상자 풀은 골드로 뽑을 수 없다. 비용 재화가
None인 풀은 상자 전용이다 — 일반 뽑기 요청은InvalidGachaId로 거절한다. - 확률 공개 여부 미정. 수익화와 연결되면 법적 고지 의무가 생길 수 있다. → 거래 / BM 미정 상태와 함께 결정.
4.1 상자 (2026-10-02 개편 · T-030)
상자는 인벤토리 아이템이다. ItemType = Special, 가챠 전용 TID 대역, 최대 1000개 — 넘치는 상자는 버린다(2026-10-01 · 2026-10-05 50 → 1000).
열면 ItemTable.OpenGachaId가 가리키는 풀을 비용 없이 개수만큼 돈다(C_ItemUseRequest, 한 번에 1~50개).
상자는 산업 레벨마다 따로 있다 — 나무·은·황금 × Lv1~5 = 15종. 5개 산업이 같은 레벨의 상자를 나눠 쓴다.
확률은 레벨별 공통이고, 특정 산업만 덮어쓴다 — CommonRewardOverrideTable에 그 (산업, 레벨) 행이 하나라도 있으면
공통 3줄을 통째로 대신한다(확률만이 아니라 상자 구성도 바꿀 수 있다). 지금 덮어쓰기는 없다.
나중에 기간이 있는 이벤트는 같은 모양의 시트를 따로 더해 공통에 얹는 방식으로 넣는다(대신하지 않는다).
모든 레벨에서 세 등급이 다 나온다 — 저레벨에서도 황금 상자를 볼 수 있다. 대신 가치는 레벨을 따라간다.
| 상자 | TID | 등급 | 여는 풀 | 얻는 곳 | 판정당 확률 (테스트값) |
|---|---|---|---|---|---|
| 나무 상자 Lv1~5 | 100019 + 3(L−1) |
Common | 9 + 3(L−1) |
CommonRewardTable (Lv L) |
2% |
| 은 상자 Lv1~5 | 100020 + 3(L−1) |
Uncommon | 10 + 3(L−1) |
〃 | 0.3% |
| 황금 상자 Lv1~5 | 100021 + 3(L−1) |
Rare | 11 + 3(L−1) |
〃 | 0.03% |
- 자원 롤과 따로 굴린다 — 판정마다 행마다 독립 확률(백만분율
ChancePerMillion). 한 판정에 상자가 둘 이상 나올 수 있고, 자원은 그대로 나온다. - 확률은 전 레벨 같다. 그래서 상자가 수입에서 차지하는 몫(약 +32%)이 레벨과 무관하게 일정하다.
상자 가치 = 그 레벨의 판정 기대값 × 배수
기준 가치 V = (그 레벨 판정 1회의 BasePrice 기대값) × 나무 10 · 은 30 · 황금 100.
BasePrice가 바뀌면 V를 다시 계산해 풀을 고친다.
| 내용물 | 가중치 비율 | 레벨 스케일 |
|---|---|---|
| 골드 | 약 40% | 두 구간 — 0.5V~V (75%) · V~2.5V (25%). 평균이 V |
| 자원 (5개 산업) | 약 40% | 그 레벨의 자원 — 나무 Common · 은 Uncommon · 황금 Rare. 수량 = V ÷ 판매가 |
| 장비 | 약 9% | 등급 = (레벨 − 1) + 상자 단계(나무 0 · 은 1 · 황금 2), 신화에서 멈춘다. 그 등급 장비 전부를 같은 가중치로 |
| 인챈트 큐브 | 4~8% | 나무 = 큐브 · 은·황금 = 큐브 + 상급 큐브. 수량 = 레벨 |
| 상자 전용 아이템 | 약 2% | 나무 = 낡은 보물 지도 · 은 = 은빛 나침반 · 황금 = 황금 열쇠 |
-
골드·자원은 V에 맞춰 두었고, 장비·큐브·전용 아이템은 V에서 벗어난다.
-
상자의
BasePrice(바로 팔 때)는 V의 20%다. -
채취로 1000개를 넘는 몫은 버린다(2026-10-05 태웅 — 50에서 올림). 50은 "자주 까게" 하려던 값이지만, 자는 동안·일하는 동안 방치해 두고 돌아와 확인하는 것이 P1의 재미라 대부분이 버려지면 안 된다. 한 번에 여는 수는 그대로
Constants.BoxOpenMax(50)라 여러 번 나눠 연다. 서버는ItemTable.MaxStack으로 자른다(채취 경로만 · 우편·개봉 경로는 자르지 않는다). -
캐릭터는 나오지 않는다 — 캐릭터 뽑기와 역할이 겹치지 않게.
-
상자에서 상자는 나오지 않는다 — 무한 개봉을 막는다. 서버 테스트(
BoxSheetTest)가 데이터를 지킨다. -
골드는 구간 보상이다 —
GachaGoldTable행 하나 = 구간(MinAmount~MaxAmount) + 가중치. 가중치로 구간을 고른 뒤 그 안에서 무작위. -
상자 전용 특수 아이템(100010~100012)은 다른 경로로 얻을 수 없다. 이름은 임시, 용도는 미정(지금은 판매만 된다).
-
개봉 결과는 가챠 결과와 같은 모양(
GachaRewardInfo)이라 클라 연출을 한 벌로 쓴다.
4.2 인챈트 큐브 (2026-10-01 개편 · #46)
장비 개체의 인챈트를 붙이거나 다시 뽑는 소모품이다. ItemType = Special, 스택 9999. 상자를 열어서만 얻는다(4.1).
두 큐브는 등급 상승 배율(EquipEnchant.xlsx/EnchantItemTable.UpRatePermille)과 이전 값 유지 여부가 다르다.
| 아이템 | TID | 상승 배율 (테스트값) | 이전 값 유지 | 판매가 |
|---|---|---|---|---|
| 인챈트 큐브 | 100015 | ×1.0 | — 바로 덮어쓴다 | 500 |
| 상급 인챈트 큐브 | 100018 | ×1.25 | ✅ 이전·새 값 중 고른다 — ❌ 미구현 (일감 T-127) | 1,000 |
- 성공하든 실패하든 1개 소모된다. 착용 중인 장비에 쓰면 거절되고 소모되지 않는다.
- 큐브를 더하는 일은 엑셀 두 줄(
ItemTable+EnchantItemTable)로 끝난다 — 배율이 데이터에 있다. 이전 값 유지 여부도EnchantItemTable의 컬럼으로 둔다(T-127). - 인챈트 규칙(칸 수·등급·수치·효과)은 캐릭터 1.4.
5. 데이터 설계
기존 Item.xlsx를 확장한다. 컬럼 추가는 엑셀에서만 하고 GameDesign/generate-tables.ps1을 돌린다.
ItemTable은 종류별 시트 둘로 나뉜다 (2026-09-19) —ItemTable.자원(산업 자원 150종) ·ItemTable.Special(구슬·상자·상자 전용·인챈트 큐브 14종). 시트 병합 규약(<테이블명>.<라벨>)이라 생성물은ItemTable하나다. 두 시트의 컬럼(마커 행)은 같아야 한다 — 컬럼을 더하면 두 시트에 함께 더한다.
| 항목 | 조치 |
|---|---|
Desciption 오타 |
✅ 수정 완료 — Description |
| ✅ 입력 완료 — 30종(2026-07-31) → 150종(2026-08-01 레벨 확장) (1.3) | |
BasePrice |
✅ 컬럼 추가 · 156종 임시값 입력 완료 (2026-09-02). 값 확정은 T-018 |
아이콘 키 IconKey |
클라 리소스 매핑. 아이템이 176종으로 늘어 우선순위가 올라갔다 (T-015) |
ItemUsage 컬럼 |
역할 분류 도입 시 추가 (미정) |
| 거래 가능 여부 | Tradable bool 컬럼 (P4 예외 관리, 미정) |
BasePrice 임시값은 레벨배율 × 등급배율로 일괄 산출했다 (2026-09-02).
| 축 | 배율 |
|---|---|
| 레벨 Lv1~5 | 1 · 3 · 9 · 27 · 81 — IndustryLevelTable.RequiredScore가 레벨당 정확히 3배라 판정 지연을 그대로 벌충한다 |
| 등급 Common~Mythic | 10 · 25 · 60 · 150 · 400 · 1000 |
곱셈 구조라 희귀도 × 레벨 2차원 단조 증가가 구조적으로 깨지지 않는다 —
어긋나면 상위 등급을 갈아 하위를 사는 재정거래가 생긴다.
가챠 전용 Special 6종은 채취 레벨이 없어 Lv1 배율(10~1000)로 뒀다.
⚠️ 가챠 비용(T-027)을 정할 때 이 값과 대조해야 한다. 뽑기 비용이
Special6종의 판매가 기댓값보다 낮으면 뽑아서 되파는 무한 골드 루프가 생긴다.시간당 수익이 산업 간에 맞는지는 회당 산출(T-009)·희귀도 분포(T-008)와 함께 봐야 한다. 세 값을 따로 정하면 특정 산업만 압도적으로 돈이 된다 — 그것이 T-018에 남은 일이다.
6. 서버 / 클라이언트 책임
| 책임 | 주체 |
|---|---|
| 인벤토리 소유·증감 | 서버 (DB) |
| 스택 상한 검증 | 서버 |
| 가챠 결과 롤 | 서버 |
| 아이콘·툴팁·정렬 | 클라이언트 |
DB 조회는 전용 Row record로 받는다 (Protocol DTO를 직접 쓰지 않는다).
7. 결정 필요 (Open Questions)
BasePrice값을 확정하는가? 156종에 임시값이 들어가 구현은 굴러간다(5장). 남은 것은 산업 간 시간당 수익을 맞추는 일이다 — T-009·T-008과 함께 본다 (T-018)ItemUsage(역할) 축을 도입하는가?- 인벤토리 용량 제한을 두는가? 넘침 처리는? (개체 변량 폐기로 부담은 크게 줄었다 — 행 수가 아이템 종류 수로 묶인다)
채굴은 깊이 구간마다 행이 더 필요하다— 깊이 폐지로 소멸 (2026-09-27 · T-011)- 거래 불가 아이템이 존재하는가? (P4 예외 —
Tradable) IconKey를 넣는가? 176종이 들어왔으므로 클라 표시(T-015)에서 곧 걸린다. 아이콘을 레벨마다 따로 그리는가도 함께 정해야 한다 — 150종은 손그림으로 감당하기 어렵다MaxStack을 역할별로 가르는가? 현재 176종 중 상자 15종(100019~100033)만1000, 나머지 161종은9999다- 상자를 팝업으로 열게 하는가? 상자가 생기면 알림 → 누르면 개봉(작업표시줄 히어로식 · 상한 5). P1과 부딪혀 보류 (2026-10-01)
- 상자 전용 아이템 3종(지도·나침반·열쇠)의 용도는? 지금은 판매만 된다 (4.1)
해소됨: 개체 변량 폐기 ✅ / 티켓·고유 아이템 전 산업 공통 ✅ / 보상 한 층 ✅ /
Desciption오타 수정 ✅ / 실 아이템 입력 ✅ / TID 대역 규칙 확정 ✅ (2026-07-31) / 레벨 확장 150종 ✅ (2026-08-01) /BasePrice컬럼 추가 + 156종 임시값 ✅ / 즉시 판매가 =BasePrice의 100% ✅ (2026-09-02) / 아이템 출구 3개 확정 ✅ / 특성 재료 용도 폐지 ✅ (2026-08-01)