최종 갱신 (KST)

← 일감 목록
T-021

산업 레벨을 UnlockTable 해금으로 이관

진우 Closed 우선순위 높음 목표 미정 · 보관됨

2026-09-14 — "캐릭터 획득·계정 레벨업 시 자동 판정"은 폐기됐다. 산업 레벨은 해금 시스템의 대상 하나가 되어 유저의 해금 행동으로 열리고, 조건은 계정 레벨만이다. 골격은 T-038이 슬롯으로 세웠다(2026-09-16 · UnlockCatalog · User.Unlock · t_user_unlock). ⏸ 계정 레벨이 서버에 생긴 뒤 착수한다. 아래 배경·조건 절은 옛 서술이다.

배경

산업 레벨의 그릇은 다 만들어졌는데 레벨을 올려 주는 사람이 없다. T-017에서 드롭 롤·판정 비용·DB·패킷·배치 검증까지 끝났지만, t_user_industry_level의 unlocked_level을 갱신하는 코드가 어디에도 없다.

그래서 지금은:

  • 모든 유저의 모든 산업이 Lv1에 머문다 (행이 없으면 Lv1로 본다).
  • Lv2 이상 배치 요청은 전부 EResultCode.IndustryLevelLocked로 거절된다.
  • Lv2~5의 드롭 시트·판정 비용·아이템 120종이 전부 도달 불가 상태로 놀고 있다.

이건 오동작이 아니라 미구현이다 — 검증은 정상 작동하고, 열린 것이 Lv1뿐일 뿐이다.

해금 조건 (T-016에서 확정 · 2026-08-01)

두 조건을 모두 충족해야 다음 레벨이 열린다.

# 조건 대상 엑셀 컬럼
① 보유 캐릭터 중 그 산업 적성의 최댓값 ≥ N 산업별 IndustryLevelTable.RequiredAptitude
② 계정(섬주인) 레벨 ≥ M 전역 IndustryLevelTable.RequiredAccountLevel
  • 배치 여부와 무관하다 — 갖고 있기만 하면 된다.
  • 해금은 영구다. 캐릭터를 방출·교체해도 이미 열린 레벨은 유지되고 재검사하지 않는다.
  • 분기 로직이 없다 — 정수 두 개를 비교하면 끝이다.

→ 산업 레벨 3장

할 일

  • [x] IndustryLevelTable에 UnlockTID 컬럼(대역 2xxx) 추가 · RequiredAptitude·RequiredAccountLevel 제거 · UnlockTable에 산업 5 × Lv2~5 = 20행(AccountLevel = M 테스트값 5·15·30·50, 선행 = 이전 레벨)
  • [x] 배치 검증(AssignWorkStation)을 IsIndustryLevelUnlocked → IsUnlocked(IndustryLevelTable.UnlockTID)로 교체
  • [x] t_user_industry_level·LoadIndustryLevels 제거 (행 0건이라 옮길 것 없음 — 실DB에서 DROP)
  • [x] 테스트 — 선행 레벨 미해금 거절 · 계정 레벨 미달 거절 · 정상 해금 후 그 레벨로 배치 가능 · 재로그인 후 유지
  • [x] 실측 (2026-09-19 · 더미 클라 + 실서버) — 계정 경험치 5000 → Lv15·포인트 3 · 2202 찍기 성공 · 선행 없는 2203 거절 · 일반 해금 요청 TraitOnlyUnlock · 재로그인 후 계정·해금 복원 · 낚시 Lv3 배치 거절 / Lv2 배치 성공 · 판정 2회 → Lv2 드롭(10011 · 10014)·경험치 6(캐릭터 = 계정) · 속도 특성 3201 → 슬롯 속도 +10% (6600 = 1000 × 1.1 × 전역 6배). 클라 화면은 T-068

결과 (2026-09-19)

"계정 레벨이 서버에 생긴 뒤"라는 선행을 이 일감에서 함께 풀었다 — 사용자 결정으로 해금 방식도 바뀌었다.

  • 계정 레벨 — 캐릭터가 얻은 경험치 전량이 계정 경험치. AccountLevelTable(User.xlsx, 캐릭터 곡선 × 8, 100레벨, 5레벨마다 특성 포인트 1) · t_user_account · S_AccountLevelResponse
  • 산업 레벨은 특성 노드로 연다 — UserTraitTable(User.xlsx) 노드 TID = UnlockTID. 조건은 UnlockTable, 비용은 특성 포인트. C_UserTraitLearnRequest. 일반 해금 요청으로는 막힌다(TraitOnlyUnlock)
  • 산업별 속도 특성 — 산업마다 5단(+10%씩), 3000 + 산업×100 + 단. 슬롯 속도 가산(GetTraitSpeedAdd)
  • 치트 GiveAccountExp = 9
  • 곁가지: PacketId 27·28, EResultCode 600 중복을 고치고 중복 방지 테스트를 넣었다

완료 조건

조건을 채우면 상위 레벨이 실제로 열리고, 그 레벨로 배치하면 판정 주기와 나오는 아이템이 Lv1과 눈에 띄게 다른 상태. 캐릭터를 방출해도 열린 레벨이 유지된다.

T-017의 완료 조건 중 "레벨마다 판정 주기와 나오는 아이템이 실제로 다르다"의 실물 확인이 여기로 넘어왔다. T-017 시점에는 상위 레벨을 열 수단이 없어 구조까지만 확인했다.

막고 있는 것 / 선행 일감

  • T-016의 남은 것 — 요구치 N·M 값. 엑셀은 임시값(Lv2 3/5 · Lv3 5/15 · Lv4 7/30 · Lv5 9/50)이다. ⚠️ 구조는 지금 만들 수 있지만 밸런스 검증은 못 한다 — 값이 확정되면 엑셀만 고치면 된다.
  • 계정 레벨 곡선이 미정이라 M을 못 잡는다 → T-003 · 캐릭터 3.1
  • ⚠️ 계정 레벨 자체가 서버에 구현돼 있는지 확인이 먼저다. 없으면 T-003이 진짜 선행이 된다.
  • 이 일감이 T-009(회당 산출)의 레벨별 실측을 막고 있다. 상위 레벨을 돌려 볼 수 없기 때문이다.

관련 커밋

  • 6a8bc84 — 계정 레벨 · 특성 트리 · 산업 레벨 해금 이관 (실측 2026-09-19) · 클라 화면은 T-068 · 이슈 #29