← 일감 목록
T-017

산업 레벨 구현 — 엑셀 · DB · 패킷 · 서버

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

배경

산업 레벨을 실제로 굴리려면 엑셀·DB·패킷·서버 로직이 전부 한 칸씩 늘어난다. 슬롯 배치가 (산업, 캐릭터)에서 (산업, 레벨, 캐릭터)가 되고, 드롭 롤의 대상이 시트 전체가 아니라 (산업, 레벨)로 걸러진 행 목록이 된다.

해금 조건이 정해지기 전에는 시작할 수 없다 → ✅ 2026-08-01에 조건이 확정됐다적성 N + 계정 레벨 M (AND). 컬럼은 RequiredAptitude + RequiredAccountLevel 정수 2개로 끝난다. 범용 조건 시스템(ConditionType enum 등)을 만들지 않는다.

2026-08-01에 레벨 개수(5개)와 판정 비용 구조도 확정됐다. 판정 1회 비용이 전역 상수에서 (산업, 레벨)의 필요 점수가 된다 — Lv1 30,000에서 레벨당 ×3. 점수는 작업속도로 쌓인다(적성 1 = 1000점/초).

⚠️ 남은 선행 조건: 요구치 값(N·M) — 엑셀에 임시값이 들어가 있다 (T-016).

🔴 지금 서버가 잘못 동작하고 있다 (2026-08-02 확인)

엑셀만 먼저 레벨별로 갈라져서, 레벨을 모르는 옛 코드가 새 데이터를 읽고 있다. 이건 "아직 안 됨"이 아니라 "틀리게 됨" 이다.

증상 원인
어떤 레벨을 돌리든 Lv1~Lv5 아이템이 전부 섞여 나온다 DropTableCatalog.LoadAll<산업>BasicTable.All 38행을 통째로 등록한다. IndustryLevel 컬럼을 읽지 않는다
희귀도 분포가 의도와 다르다 5개 레벨의 가중치가 한 통에 합산돼 총합이 부풀었다
판정 주기가 레벨과 무관하게 30초 고정 WorkStationSlot.JudgeCost가 상수 30_000_000
  • WorkStationSlot에 레벨 필드가 없어 필터를 걸 축 자체가 없다. 그래서 드롭만 따로 고칠 수 없고, 아래 "패킷·서버" 항목이 함께 가야 한다.
  • 구현 전까지 채취 결과는 밸런스 참고값이 아니다. T-008(희귀도 분포)·T-009(회당 산출)를 지금 데이터로 검증하면 안 된다.

최소 임시 조치를 원하면 드롭 롤을 Lv1으로 고정 필터하는 방법이 있다 (현재 해금은 Lv1뿐이라 기획과도 맞는다). 다만 JudgeCost는 그대로 틀린 채 남는다.

할 일

엑셀 — ✅ 완료 (2026-08-01)

  • [x] IndustryLevelTable 시트 신설 (GameDesign/Excel/Industry.xlsx · 25행) — IndustryLevelTID(키) · IndustryType · Level · Name · RequiredScore · RequiredAptitude(0~10) · RequiredAccountLevel · Description
  • [x] <산업>BasicTable 5종에 IndustryLevel 컬럼 추가 + 레벨별 행 확장 (산업당 38행 · 총 190행)
  • [x] IndustryLevelRef 검사 방식 → IndustryLevelTable.Level로 그대로 걸린다. ReferenceValidator는 참조 대상이 키가 아니어도 값 집합을 만들어 검사한다
  • [x] 신규 아이템 120종 추가 (Lv2~5 × 희귀도 6 × 산업 5) — ItemTable 총 150행 (가챠 전용 6종을 더해 시트는 156행)
  • [x] generate-tables.ps1 실행 — .bytes·DataLog·Unity 미러까지 생성 완료

2026-08-08 엑셀 재편 (레벨 30~40 확장 대비). Drop.xlsx → 산업별 5개 파일(파일 안은 레벨별 시트), Industry.xlsx는 산업별 시트로 분리 — 제너레이터가 병합하므로 테이블명· 생성물·서버 코드 영향 없음. DropTID산업×100000+레벨×100+순번으로 재채번 (산업 자리 = ItemType enum 값 — 농사 1 · 낚시 2 …). DropTID는 DB 미저장이라 안전하다.

DB

  • [ ] t_user_workstation_slotindustry_level 컬럼 추가
  • [ ] t_user_industry_level 신설 — 유저 × 산업 → 최대 해금 레벨
  • [ ] 기존 슬롯 행의 마이그레이션 (레벨 1로 채운다)

패킷 · 서버

  • [ ] WorkStationSlotInfoIndustryLevel 추가 (Server/MikaProtocol에서만 수정)
  • [ ] 슬롯 배치 요청에 레벨 추가 · 서버가 해금 여부를 검증한다
  • [ ] 적성 0 캐릭터 배치를 거절하는 응답을 함께 넣는다 (Character.CanWork는 이미 있다)
  • [ ] WorkStationSlot.JudgeCost 상수를 (산업, 레벨) 조회로 바꾼다IndustryLevelTable.RequiredScore × 1000 (엑셀은 초 기준, 서버는 밀리초 기준)
  • [ ] WorkStationSlotInfo.JudgeCostUnits를 그 값으로 채운다 (클라 카운트다운이 이 값을 쓴다)
  • [ ] 🔴 드롭 롤을 (산업, 레벨) 인덱스 기준으로 변경지금 틀리게 동작 중이다(위 참조). DropTableCatalog의 키가 ItemType 하나라 (ItemType, Level)로 늘려야 한다
  • [ ] 레벨 변경 시 변경 직전에 정산 — 산업 변경과 같은 경로를 탄다
  • [ ] 해금 처리 — 보유 캐릭터의 산업별 최고 적성계정 레벨을 비교해 판정, t_user_industry_level 갱신
  • [ ] 판정 시점 결정 — 캐릭터 획득 시 · 계정 레벨업 시 · 배치 UI를 열 때 (해금을 영구로 두면 위 세 시점에 갱신만 하면 된다)
  • [ ] 테스트 — 해금하지 않은 레벨 배치 거절 · 레벨 변경 시 소급 없음 · 캐릭터를 잃어도 이미 열린 레벨은 유지(영구 채택 시)

완료 조건

해금하지 않은 레벨로는 배치가 거절되고, 레벨을 바꾸면 그 시점 이전 구간이 이전 레벨의 필요 점수·드롭 테이블로 정산되며, 레벨마다 판정 주기와 나오는 아이템이 실제로 다른 상태.

막고 있는 것 / 선행 일감

  • T-016 해금 조건풀렸다
  • 레벨 개수5개로 확정
  • 엑셀 작업완료 (2026-08-01)
  • T-016의 남은 것 — 요구치 N·M 값. 계정 레벨 곡선(미정) 이 선행. ⚠️ 값이 임시라 해금 로직을 구현해도 밸런스 검증은 못 한다
  • T-005(드롭 테이블)와 같은 시트를 건드린다. 순서가 겹치면 충돌한다
  • ⚠️ 이 일감은 T-008·T-009를 막고 있다. 드롭이 레벨별로 갈리기 전에는 희귀도 분포도 회당 산출도 실측할 수 없다 (위 "지금 잘못 동작하고 있다")

관련 커밋

  • 없음 (엑셀·생성물 커밋 예정)