최종 갱신 (KST)

GameDesign/design/item/README.md

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.7
  • GlobalRarity — 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.

RarityWeightTable(전 산업 공통 분포) + <산업>BasicTable(매핑만) 폐지 (2026-07-31). 공통 분포 테이블을 두지 않는다 — 가중치는 각 산업의 드롭 시트가 직접 갖는다. → 자원채취 2.4

각 산업이 레벨마다 희귀도 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), 테이블(GachaInfoTable 1번 · GachaItemTable의 GachaId=1 6행)은 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)을 정할 때 이 값과 대조해야 한다. 뽑기 비용이 Special 6종의 판매가 기댓값보다 낮으면 뽑아서 되파는 무한 골드 루프가 생긴다.

시간당 수익이 산업 간에 맞는지는 회당 산출(T-009)·희귀도 분포(T-008)와 함께 봐야 한다. 세 값을 따로 정하면 특정 산업만 압도적으로 돈이 된다 — 그것이 T-018에 남은 일이다.


6. 서버 / 클라이언트 책임

책임 주체
인벤토리 소유·증감 서버 (DB)
스택 상한 검증 서버
가챠 결과 롤 서버
아이콘·툴팁·정렬 클라이언트

DB 조회는 전용 Row record로 받는다 (Protocol DTO를 직접 쓰지 않는다).


7. 결정 필요 (Open Questions)

  1. BasePrice 값을 확정하는가? 156종에 임시값이 들어가 구현은 굴러간다(5장). 남은 것은 산업 간 시간당 수익을 맞추는 일이다 — T-009·T-008과 함께 본다 (T-018)
  2. ItemUsage(역할) 축을 도입하는가?
  3. 인벤토리 용량 제한을 두는가? 넘침 처리는? (개체 변량 폐기로 부담은 크게 줄었다 — 행 수가 아이템 종류 수로 묶인다)
  4. 채굴은 깊이 구간마다 행이 더 필요하다 — 깊이 폐지로 소멸 (2026-09-27 · T-011)
  5. 거래 불가 아이템이 존재하는가? (P4 예외 — Tradable)
  6. IconKey를 넣는가? 176종이 들어왔으므로 클라 표시(T-015)에서 곧 걸린다. 아이콘을 레벨마다 따로 그리는가도 함께 정해야 한다 — 150종은 손그림으로 감당하기 어렵다
  7. MaxStack을 역할별로 가르는가? 현재 176종 중 상자 15종(100019~100033)만 1000, 나머지 161종은 9999다
  8. 상자를 팝업으로 열게 하는가? 상자가 생기면 알림 → 누르면 개봉(작업표시줄 히어로식 · 상한 5). P1과 부딪혀 보류 (2026-10-01)
  9. 상자 전용 아이템 3종(지도·나침반·열쇠)의 용도는? 지금은 판매만 된다 (4.1)

해소됨: 개체 변량 폐기 ✅ / 티켓·고유 아이템 전 산업 공통 ✅ / 보상 한 층 ✅ / Desciption 오타 수정 ✅ / 실 아이템 입력 ✅ / TID 대역 규칙 확정 ✅ (2026-07-31) / 레벨 확장 150종 ✅ (2026-08-01) / BasePrice 컬럼 추가 + 156종 임시값 ✅ / 즉시 판매가 = BasePrice의 100% ✅ (2026-09-02) / 아이템 출구 3개 확정 ✅ / 특성 재료 용도 폐지 ✅ (2026-08-01)