← 일감 목록
T-005

산업 4종 드롭 테이블 · 아이템 TID 대역 · 확률 테이블 연결

공용 진행중 우선순위 높음 마감 미정

2026-07-31 범위 확대 · 보류 해제. 기존 범위는 "드롭 시트 4개 추가"였는데, 아이템 TID 대역 규칙희귀도 확률 테이블 연결이 함께 가야 한 번에 끝난다. 따로 하면 두 번 고친다.

배경

산업 5종 중 낚시만 드롭 테이블이 있다(FishingBasicTable). 나머지 4종은 슬롯에 배치해도 정산 때 테이블이 없어 조용히 건너뛴다:

WRN [채취] 드롭 테이블 없음, 건너뜀: Mining (슬롯 0)

배치는 되는데 아무것도 안 나온다. 예외로 죽지는 않게 막아 뒀지만 산업 4종이 사실상 비어 있다.

구조 — 산업별 단일 테이블 (2026-07-31 확정)

RarityWeightTable(전 산업 공통 분포)을 두지 않는다. 가중치는 각 산업의 드롭 시트가 직접 갖는다 — 낚시 기존 구조를 5종이 그대로 공유한다.

<산업>BasicTable :  DropTID(키) | ItemTID(Ref) | Weight | Description
내용
✅ 얻음 산업별 분포 차별화 — 낚시를 상위로 기울이거나 채굴을 깊이로 올릴 수 있다
✅ 얻음 롤이 판정당 2회 → 1회
⚠️ 잃음 단일 원본. 확률 조정 시 5개 시트를 함께 봐야 한다

기획 문서가 잡고 있던 "분포는 전 산업 동일 · RarityWeightTable 단일 원본"은 2026-07-31에 폐지됐다.자원채취 2.4

2026-08-08 엑셀 재편. Drop.xlsx 한 파일이 산업별 5개 파일(Drop농사~Drop사냥.xlsx, 파일 안은 레벨별 시트)로 갈라졌고, DropTID산업×100000+레벨×100+순번(산업 자리 = ItemType enum 값)으로 재채번됐다. 테이블명·생성물은 그대로다. → 산업레벨 6.2


아이템 TID 대역

산업마다 10000 단위로 대역을 나누고, 대역 안에서 희귀도 순으로 +1 ~ +6 을 쓴다.

산업 대역 상태
낚시 10001 ~ 10006 ✅ 확정 (2026-07-31)
농사 20001 ~ 20006 ✅ 확정
벌목 30001 ~ 30006 ✅ 확정
채굴 40001 ~ 40006 ✅ 확정
사냥 50001 ~ 50006 ✅ 확정

대역 안의 끝자리는 희귀도 고정이다 — +1 Common · +2 Uncommon · +3 Rare · +4 Epic · +5 Legendary · +6 Mythic. 아이템 문서 1.4가 요구한 최소 30종(5산업 × 6등급)이 이걸로 채워진다.

대역은 산업당 10000개다. 6종을 다 쓰고도 9994개가 남으므로, 같은 산업에 아이템이 늘어도(채굴 깊이 구간 · 사냥터별 산출물 · 낚시터 확장) 대역 안에서 뒤로 이어 붙이면 된다. 다음 대역을 침범하지 않는다.

⚠️ 대역 순서가 ItemType enum 순서와 다르다 (enum은 Farming=1, Fishing=2, …). ItemTID / 10000 으로 산업을 역산할 수 없다는 뜻이므로, 역산에 의존하는 코드를 쓰지 않는다. 산업은 언제나 ItemTable.ItemType에서 읽는다.

⚠️ 낚시는 이설이다 — 신규 채번이 아니다

낚시 아이템은 이미 1001~1006을 쓰고 있다 (DataLog/ItemTable.json). 10000대로 옮기는 것은 살아 있는 TID를 옮기는 것이라 게임기획코어 4장 식별자 규칙에 걸린다.

1001~1006은 영구 결번으로 확정됐다 (2026-07-31). 다른 아이템에 다시 붙이지 않는다.

남은 것은 이미 지급된 행의 처리뿐이다:

확인 내용
선행 확인 t_user_inventoryitem_tid = 1001~1006 행이 있는가
있고 버려도 되면 개발 DB를 비우고 이설 (가장 단순)
있고 못 버리면 UPDATE t_user_inventory SET item_tid = item_tid + 9000 WHERE item_tid BETWEEN 1001 AND 1006
없으면 그냥 엑셀만 고치면 된다

이 행을 방치하면 인벤토리에 ItemTable에 없는 TID가 남는다. 조회 시점에 이름·희귀도를 못 찾아 터지거나 빈칸으로 표시된다. 엑셀 이설과 같은 작업 단위에서 처리한다.


아이템 30종 — 산업 문서의 산출물 이름을 그대로 쓴다

임시 이름(일반 생선 · A~F)을 버리고 각 산업 기획안의 산출물 실명으로 채운다.

낚시 문서 4장의 패턴을 5산업에 공통 적용한다 — 같은 자원의 상위 등급은 별도 ItemTID 이며, 등급이 올라갈수록 이름이 구체적·희소해진다 (붕어월척 붕어대물 잉어).

희귀도 낚시 1000_ 농사 2000_ 벌목 3000_ 채굴 4000_ 사냥 5000_
Common 붕어 📖 잡목 돌덩어리 📖 질긴 고기
Uncommon 잉어 📖 감자 소나무 목재 구리 광석 토끼 가죽
Rare 월척 붕어 📖 옥수수 참나무 목재 은광석 📖 늑대 가죽
Epic 향어 📖 인삼 흑단 목재 금광석 곰 모피
Legendary 대물 잉어 📖 변종 인삼 고급 원목 📖 보석 원석 거대한 뿔
Mythic 전설의 잉어 📖 태초의 씨앗 세계수 가지 심연의 원석 마수의 심장

📖 = 기획 문서에 이미 적혀 있는 이름 (낚시 4장 · 채굴 1장 · 벌목 3장). 나머지는 제안이며, MaxStack은 낚시 기준(9999)을 따른다 — 방치로 대량 축적되므로 크게 잡는다 (아이템 2장).

각 산업 문서의 산출물 서술과 대응한다 — 농사 "작물류(곡물·채소) · 변종 작물", 벌목 "목재(수종별 등급) · 고급 원목", 채굴 "광석(깊이별 등급) · 보석류", 사냥 "가죽 · 고기 · 뿔 · 모피".

이 표에서 의도적으로 뺀 것

항목 이유
낚시 낡은 장화 실패(허탕)를 폐기했는데 "꽝 느낌" 아이템을 Common에 넣으면 실패를 다른 형태로 되살린다. 낚시의 "확실한 도파민" 정의와 어긋난다 (낚시 7장 Q5)
채굴 깊이별 매핑 깊이 시스템이 미구현이다. 지금은 깊이 1구간(6종)만 만들고, 구간이 늘면 40007~로 이어 붙인다
사냥터별 산출물 사냥터가 미확정이다. 지금은 사냥터 1개 기준 6종. 늘면 50007~

DropTID는 없앤다

현재 FishingBasicTable.DropTID10001~10006 이라, 아이템 TID를 10000대로 옮기면 두 숫자가 완전히 겹친다. 테이블이 달라 기술적 충돌은 없지만 로그·쿼리에서 구분이 안 된다.

구조를 기획대로 바꾸면 Rarity가 키가 되므로 DropTID 컬럼 자체가 사라진다. 그걸로 해결한다.


할 일

1단계 · 서버 — 엑셀 작업 ✅ 완료 (2026-07-31)

  • [x] 낚시 아이템 1001~100610001~10006 이설 + 이름을 산출물 실명으로 교체
  • [x] Item.xlsx 30행 — 산업 5종 × 6등급 (위 표 그대로)
  • [x] 더미 행 A~F(ItemTID 1~6) 제거 — 결번
  • [x] Drop.xlsx에 시트 4개 추가 — FarmingBasicTable · LoggingBasicTable · MiningBasicTable · HuntingBasicTable (기존 시트를 복사해 마커 행·서식 보존)
  • [x] FishingBasicTableDropTID10001~101~로 (아이템 TID와 숫자 겹침 방지)
  • [x] generate-tables.ps1 실행 — Ref 검사 5시트 × 6행 전부 통과, Unity 미러까지 완료
  • [ ] t_user_inventoryitem_tid 1~6 / 1001~1006 행이 남아 있는지 확인 ← 미처리 있으면 1001+n → 10001+n으로 UPDATE, 1~6은 삭제

시트·컬럼 작성 규칙은 excel-table-creator 스킬을 따른다.

2단계 · 서버 — 코드 · 패킷 테스트

  • [x] DropTableCatalog.LoadAll()에 산업 4종 등록 — 구조가 그대로라 DropTable·DropTableTest는 손대지 않았다
  • [x] 빌드 성공 · 기존 테스트 83개 전부 통과
  • [x] 서버 시작 로그 "드롭 테이블 5개 등록 완료" · "드롭 테이블 없음" 경고 0건
  • [ ] 테스트 추가: 산업 5종이 각각 6등급을 전부 낼 수 있는가 / 실측 분포가 시트 가중치와 맞는가
  • [ ] 진단 로그 검토 — 5개 분포를 나란히 찍어 두면 어긋남을 눈으로 잡을 수 있다 (기획평가 R18)

채취 푸시로 5종 아이템이 실제로 내려오는지 확인은 클라이언트가 붙어야 하므로 T-015로 옮겼다 (2026-07-31). 서버 측은 등록·빌드·테스트까지 확인이 끝났다.

3단계 · 이양

  • [ ] 2단계까지 끝나면 T-015(클라)로 넘긴다

완료 조건

  1. ✅ 서버 로그에 "드롭 테이블 없음" 경고가 0건이다 (드롭 테이블 5개 등록 완료 확인)
  2. ⬜ 산업 5종 드롭 테스트가 있다 (6등급 산출 · 실측 분포 일치)
  3. t_user_inventory의 구 TID(1~6 · 1001~1006) 행을 정리했다

실물 확인(슬롯 배치 → 아이템 수령 → 클라 도달)은 T-015의 완료 조건이다.

막고 있는 것 / 선행 일감

  • 없음. T-008을 기다리지 않는다 — 현재 가중치는 5종 공통 임시값이고, 확정되면 각 시트의 Weight 컬럼만 고치면 된다.
  • T-009(산업별 회당 산출) — 대역·구조와 무관. 나중에 붙여도 된다

2026-07-31 해소: 대역 순서 ✅ / 아이템 이름 = 산출물 실명 ✅ / 1001~1006 영구 결번 ✅ / 시트 구조 = 산업별 단일 테이블 ✅ (RarityWeightTable 불채택)

위험

위험 내용
TID 이설 1001~1006이 DB에 남아 있으면 이설 시 고아가 된다. 1단계 두 번째 항목을 먼저 확인
결번 관리 1001~1006은 다시 쓰지 않는다 (게임기획코어 4장 — 폐기 번호 재사용 금지)
구조 변경 범위 DropTable(ItemTID, Weight) 쌍 전제다. 2단 롤로 바꾸면 DropTableTest·WorkStation 호출부가 함께 움직인다
Ref 누락 드롭 시트 ItemTIDRef 마커를 안 붙이면 끊어진 TID가 .bytes까지 통과해 런타임에야 터진다

관련 커밋

  • 없음

참고

  • Server/WSGameServer/Common/DropTableCatalog.csLoadAll()에 "만들어지는 대로 한 줄씩" 주석
  • Server/WSGameServer/Common/DropTable.cs · WeightedPicker.cs
  • GameDesign/Excel/Drop농사~Drop사냥.xlsx(산업별 5개 · 레벨별 시트) · Item.xlsx
  • GameDesign/design/gathering/README.md 2.4 · 3장 — 보상 구조와 테이블 분리 근거
  • GameDesign/design/게임기획코어.md 4장 — 식별자 규칙 (결번 · enum 뒤에만 추가)