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+순번(산업 자리 =ItemTypeenum 값)으로 재채번됐다. 테이블명·생성물은 그대로다. → 산업레벨 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개가 남으므로, 같은 산업에 아이템이 늘어도(채굴 깊이 구간 · 사냥터별 산출물 · 낚시터 확장) 대역 안에서 뒤로 이어 붙이면 된다. 다음 대역을 침범하지 않는다.
⚠️ 대역 순서가
ItemTypeenum 순서와 다르다 (enum은Farming=1, Fishing=2, …).ItemTID / 10000으로 산업을 역산할 수 없다는 뜻이므로, 역산에 의존하는 코드를 쓰지 않는다. 산업은 언제나ItemTable.ItemType에서 읽는다.
⚠️ 낚시는 이설이다 — 신규 채번이 아니다
낚시 아이템은 이미 1001~1006을 쓰고 있다 (DataLog/ItemTable.json).
10000대로 옮기는 것은 살아 있는 TID를 옮기는 것이라 게임기획코어 4장 식별자 규칙에 걸린다.
1001~1006은 영구 결번으로 확정됐다 (2026-07-31). 다른 아이템에 다시 붙이지 않는다.
남은 것은 이미 지급된 행의 처리뿐이다:
| 확인 | 내용 |
|---|---|
| 선행 확인 | t_user_inventory 에 item_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.DropTID가 10001~10006 이라, 아이템 TID를 10000대로 옮기면
두 숫자가 완전히 겹친다. 테이블이 달라 기술적 충돌은 없지만 로그·쿼리에서 구분이 안 된다.
구조를 기획대로 바꾸면 Rarity가 키가 되므로 DropTID 컬럼 자체가 사라진다. 그걸로 해결한다.
할 일
1단계 · 서버 — 엑셀 작업 ✅ 완료 (2026-07-31)
- [x] 낚시 아이템
1001~1006→10001~10006이설 + 이름을 산출물 실명으로 교체 - [x]
Item.xlsx30행 — 산업 5종 × 6등급 (위 표 그대로) - [x] 더미 행
A~F(ItemTID 1~6) 제거 — 결번 - [x]
Drop.xlsx에 시트 4개 추가 —FarmingBasicTable·LoggingBasicTable·MiningBasicTable·HuntingBasicTable(기존 시트를 복사해 마커 행·서식 보존) - [x]
FishingBasicTable의DropTID를10001~→101~로 (아이템 TID와 숫자 겹침 방지) - [x]
generate-tables.ps1실행 —Ref검사 5시트 × 6행 전부 통과, Unity 미러까지 완료 - [ ]
t_user_inventory에item_tid1~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(클라)로 넘긴다
완료 조건
- ✅ 서버 로그에 "드롭 테이블 없음" 경고가 0건이다 (
드롭 테이블 5개 등록 완료확인) - ⬜ 산업 5종 드롭 테스트가 있다 (6등급 산출 · 실측 분포 일치)
- ⬜
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 누락 |
드롭 시트 ItemTID에 Ref 마커를 안 붙이면 끊어진 TID가 .bytes까지 통과해 런타임에야 터진다 |
관련 커밋
- 없음
참고
Server/WSGameServer/Common/DropTableCatalog.cs—LoadAll()에 "만들어지는 대로 한 줄씩" 주석Server/WSGameServer/Common/DropTable.cs·WeightedPicker.csGameDesign/Excel/Drop농사~Drop사냥.xlsx(산업별 5개 · 레벨별 시트) ·Item.xlsxGameDesign/design/gathering/README.md2.4 · 3장 — 보상 구조와 테이블 분리 근거GameDesign/design/게임기획코어.md4장 — 식별자 규칙 (결번 · enum 뒤에만 추가)