GameDesign/design/gathering/산업레벨.md 최종 업데이트 2026-08-08

산업 레벨 (Industry Level)

상위: 자원채취 · 게임기획코어.md 전제: 작업슬롯 최종 업데이트: 2026-08-08 · 상태: 골격·해금 조건·레벨 구성 확정 · 요구치(N·M) 미정 · 🔴 서버 미구현(T-017) 바뀌면 갱신: 게임UI · 게임기획코어 · 기획평가 · 낚시 · 농사 · 벌목 사냥 · 아이템 · 자원채취 · 작업슬롯 · 채굴 · 캐릭터

산업마다 레벨이 있고, 플레이어는 슬롯에 배치할 때 산업과 레벨을 함께 고른다. 레벨이 오르면 판정 1회에 필요한 점수가 커지고, 그 대신 다른 아이템이 나온다.

경험치가 없다. 시간을 쌓아서 자동으로 오르는 값이 아니라, 조건을 채우면 다음 레벨이 해금되고 그때부터 선택지에 추가되는 구조다.


1. 확정 사항

# 항목 확정 내용
1 레벨의 단위 산업마다 따로 — 농사Lv · 벌목Lv · 낚시Lv · 채굴Lv · 사냥Lv
2 해금 보관 계정 단위. 유저가 산업별로 "어디까지 열었는가"를 갖는다
3 레벨 선택 슬롯 단위. 배치할 때 해금된 레벨 중 아무거나 고른다
4 합산하지 않는다 같은 산업 슬롯을 여러 개 돌려도 레벨이 더해지지 않는다
5 경험치 없음 진행 바가 없다. 조건 충족 = 해금이다
6 레벨의 효과 ① 판정 1회 필요 점수 ② 드롭 테이블 두 가지가 함께 바뀐다 (2.4)
7 하향 선택 가능 상위 레벨을 열어도 하위 레벨을 계속 고를 수 있다
8 해금 조건 캐릭터 적성 + 계정 레벨 — 둘 다 충족해야 한다 ✅ → 3장
9 해금은 영구 한 번 열리면 되돌아가지 않는다. 해금 후 재검사 없음 ✅ → 3.2
10 산업당 레벨 수 5개 ✅ (2026-08-01)
11 필요 점수 곡선 레벨당 ×3 등비. 30,000 → 2,430,000 ✅ (2.4)
12 필요 점수의 산업 차등 없다 — 5종 공통값으로 시작한다. 나중에 벌릴 수 있다 ✅ (2.5)
13 상위 레벨 드롭 하위 저급품이 낮은 가중치로 섞인다 ✅ (4.3)
14 요구치 N·M 미정 (3.3)

레벨은 성장 수치가 아니라 "어디서 캘지"의 선택지다. 높은 레벨이 무조건 좋은 것이 아니라 느린 대신 다른 것이 나오는 곳이어야 한다 (4장).


2. 구조

2.1 슬롯 배치가 세 칸이 된다

WorkStationSlot
 ├─ Industry        농사 · 벌목 · 낚시 · 채굴 · 사냥 중 1개     ← 저장
 ├─ IndustryLevel   해금된 레벨 중 1개                          ← 저장 (신규)
 └─ Character       배치된 캐릭터 1명                            ← 저장

기존 작업슬롯 2장의 배치 설정에 IndustryLevel 한 칸이 붙는다. DB에 남는 것도 이 셋뿐이며, 진행도는 여전히 저장하지 않는다(오프라인 진행 폐지).

무엇을 갖는가 어디에
계정 산업별 최대 해금 레벨 (예: 낚시 3, 채굴 1) 유저 DB
슬롯 지금 돌리고 있는 (산업, 레벨) 유저 DB (슬롯 행)

해금은 계정, 선택은 슬롯이다. 해금을 슬롯마다 따로 두면 슬롯을 늘릴 때마다 같은 조건을 다시 채워야 해서, 슬롯 확장이 곧 후퇴가 된다.

2.2 슬롯 조합이 이 게임의 질문이 된다

슬롯이 3개면 배치 경우의 수가 (산업 × 해금 레벨)의 조합이 된다.

슬롯 1 — 낚시 Lv3   (상위 어종을 노린다 · 느리다)
슬롯 2 — 낚시 Lv1   (기초 재료를 빠르게 쌓는다)
슬롯 3 — 채굴 Lv2   (다른 계열 재료)

같은 산업을 서로 다른 레벨로 두는 것이 유효한 선택이어야 한다. 그렇지 않으면 모든 슬롯이 최고 레벨로 수렴하고, 레벨 선택은 없는 것과 같아진다(4장).

2.3 레벨 변경 = 슬롯 변경

레벨을 바꾸는 것은 슬롯 설정 변경이므로 작업슬롯 3.1의 규칙을 그대로 탄다 — 바꾸기 직전에 정산한다.

시점 처리
레벨 변경 변경 전 구간을 이전 레벨의 필요 점수·드롭 테이블로 정산한 뒤 교체
진행 조각 점수 단위로 이월된다

⚠️ 정산을 빼먹으면 두 가지가 한꺼번에 어긋난다. 낮은 레벨로 쌓은 점수가 높은 레벨 보상으로 지급되고, 싸게 쌓은 점수가 비싼 판정에 그대로 쓰인다.

⚠️ 이월이 레벨 갈아타기의 구멍이 될 수 있다. Lv1로 점수를 싸게 모아 두고 Lv5로 바꿔 큰 판정에 쓰는 경로다. 조각의 최대치가 이전 레벨의 필요 점수 미만이라 이득이 크지는 않지만, 규칙으로 명시해 두지 않으면 나중에 논쟁이 된다. → 7장 7번

2.4 판정 비용이 상수에서 레벨별 점수가 된다 (2026-08-01 신설)

기존에 전역 상수 하나였던 "판정 1회 비용"이 (산업, 레벨)의 테이블 값이 된다.

점수 += 경과시간 × 작업속도                    ← 작업속도가 곧 초당 점수
점수 >= 그 레벨의 RequiredScore  →  판정 1회 성립, 점수를 그만큼 차감
항목
점수의 단위 적성 1 캐릭터가 1초 일하면 1000점 (= BaseWorkSpeedPermille)
점수를 쌓는 것 WorkSpeedTable.BaseWorkSpeedPermille에 보정을 적용한 현재 작업속도
판정 성립 조건 누적 점수 ≥ IndustryLevelTable.RequiredScore

레벨별 필요 점수 (전 산업 공통)

레벨 필요 점수 적성 1 (1000점/초) 적성 10 (4000점/초)
Lv1 30,000 30초 7.5초
Lv2 90,000 1분 30초 22.5초
Lv3 270,000 4분 30초 1분 7.5초
Lv4 810,000 13분 30초 3분 22.5초
Lv5 2,430,000 40분 30초 10분 7.5초

기준 채취주기 30초 확정은 폐기되지 않았다 — Lv1의 값으로 살아남았다. 30,000점은 적성 1 캐릭터의 정확히 30초다. 전 산업 공통이라는 성질도 그대로다. 달라진 것은 "레벨을 올리면 한 판정이 길어진다" 한 가지뿐이다.

곱셈 항이 늘어나지 않는다. 속도 계산식(적성 × (1 + Σ가산) × Π승산)은 그대로고, 나눗셈의 분자였던 상수가 테이블 조회로 바뀔 뿐이다. → 작업슬롯 3.4

⚠️ 단위 — 엑셀은 초 기준, 서버는 밀리초 기준

서버의 ProgressUnits밀리초 × 천분율이라 엑셀 값의 1000배다.

단위 Lv1 Lv5
엑셀 RequiredScore 초 × 천분율 30,000 2,430,000
서버 JudgeCostUnits 밀리초 × 천분율 30,000,000 2,430,000,000

⚠️ 엑셀에 밀리초 값을 직접 넣으면 안 된다. Lv5의 24억 3천만은 int(21억)를 넘겨 조용히 깨진다. 엑셀은 초 기준으로 두고 서버가 로드 시 ×1000 한다. 서버 쪽 누적값은 long이므로 안전하다.

2.5 필요 점수는 지금 전 산업 같은 값이다 — 나중에 벌릴 수 있다

5개 산업이 모두 위 표와 같은 값을 쓴다. 낚시 Lv2와 채굴 Lv2가 똑같이 90,000점이다.

IndustryLevelTable행이 (산업, 레벨)이라 산업마다 다른 값을 넣을 자리가 이미 있다. 지금은 그 자리에 같은 값을 넣어 둔 것뿐이므로, 벌리는 데 구조 변경이 필요 없다.

나중에 벌리면 이런 표현이 가능해진다.

산업 심리 정의 필요 점수를 회당 산출을 체감
낚시 확실한 도파민 낮게 적게 자주 조금씩 들어온다
농사 안정적인 수익 높게 많이 가끔 뭉텅이로 들어온다

이것이 세 번째 수치 차별화 축이다. 지금까지 회당 산출·희귀도 분포 둘뿐이었다. → 자원채취 1-1

공통값으로 시작하는 이유: 회당 산출량이 아직 미정(일감 T-009)이라 두 축을 동시에 벌리면 서로 상쇄되는지 확인할 수 없다. 또 벌리는 순간 관리 대상이 5산업 × 5레벨 = 25개 값이 되고, 희귀도 분포가 이미 5개 시트로 흩어져 있어 밸런싱할 표가 두 배가 된다. 다르게 두는 것은 의도가 있을 때만 한다 — 자원채취가 희귀도 분포에 대해 세운 규칙과 같다.


3. 해금 조건 (2026-08-01 확정)

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

# 조건 대상 의미
보유 캐릭터 중 그 산업 적성의 최댓값이 N 이상 산업별 "그 일을 할 줄 아는 사람이 있는가"
계정(섬주인) 레벨 M 이상 전역 "섬이 그만큼 발전했는가"
낚시 Lv3 해금 = (보유 캐릭터 중 낚시 적성 최댓값 ≥ N) AND (계정 레벨 ≥ M)
  • 적성은 CharacterTable의 고정값(0~10)이며 WorkSpeedTable의 축과 같다 → 캐릭터 2장.
  • 배치 여부와 무관하다. 슬롯에 넣지 않아도 갖고 있기만 하면 조건을 만족한다.
  • 계정 레벨은 캐릭터가 작업으로 번 경험치의 일부로 오른다 → 캐릭터 3.1.

3.1 왜 이 조합인가

조건 막는 것
적성만 좋은 캐릭터 하나 뽑고 첫날에 최고 레벨까지 직행하는 것
계정 레벨만 시간만 흘리면 열리는 자동 해금. 선택이 없다
둘 다 (채택) "뽑기 운"과 "쌓은 시간" 어느 한쪽만으로는 못 연다
  • 캐릭터 획득이 산업 레벨 진행의 동력이 된다. 가챠가 "속도 조금 빨라짐"이 아니라 "새 콘텐츠를 여는 열쇠" 가 되어, 캐릭터를 모을 이유가 생긴다.
  • 4.4의 적성 요구와 같은 축이다. 적성 N짜리 캐릭터로 열고, 그 캐릭터를 그 레벨에 배치하는 것이 자연스러운 동선이 된다.
  • 산업별(적성) × 전역(계정 레벨)이라 한 산업만 파도 다른 산업의 문이 함께 열린다. 계정 레벨은 어느 산업에서 벌든 오르기 때문이다 — 편식을 벌하지 않는다.

3.2 해금은 영구다

한 번 조건을 채워 열린 레벨은 되돌아가지 않는다. 해금 후에는 조건을 다시 검사하지 않는다.

항목 확정
저장 t_user_industry_level산업별 최대 해금 레벨을 기록한다
재검사 없다. 캐릭터를 방출·교체해도 이미 열린 레벨은 유지된다
배치 시 검증 저장된 값만 본다. 보유 캐릭터를 훑지 않는다

조건 판정이 필요한 시점은 둘뿐이다 — 조건 값이 오를 수 있는 순간만 보면 된다.

시점 검사 대상
캐릭터 획득 시 그 캐릭터가 적성을 가진 산업만
계정 레벨업 시 전 산업

이미 최고 레벨(Lv5)까지 연 산업은 검사에서 빠진다.

왜 영구인가:

  • 캐릭터 방출·교체가 후퇴가 되지 않는다. 상시 검사면 그 레벨을 돌리기 위해 캐릭터를 계속 붙들고 있어야 하고, 인벤토리 압박이 된다.
  • 이미 돌아가던 슬롯이 갑자기 멈추는 예외가 사라진다. 상시 검사에서는 캐릭터 하나를 처분했을 뿐인데 가동 중인 슬롯을 강제로 내려야 한다.
  • 1장 #2("해금은 계정 단위로 보관한다")와 정합적이다 — 보관한다는 말이 곧 영구다.
  • 배치 검증이 정수 비교 한 번으로 끝난다. 매 배치마다 보유 캐릭터를 훑지 않는다.

3.3 ⚠️ 요구치는 아직 미정

논점 상태
적성 요구치 N (레벨별) 미정
계정 레벨 요구치 M (레벨별) 미정 — 계정 레벨 곡선이 정해져야 잡을 수 있다
  • Lv1은 요구치가 없다 (둘 다 0). 게임 시작 시 5개 산업의 Lv1이 열려 있다.
  • 적성은 0~10 축이므로 N도 그 범위 안에서 정한다.
  • 엑셀에는 컬럼과 Lv1의 0만 들어가 있고, Lv2~5는 임시값이다. → 6.1

⚠️ 캐릭터 획득 경로가 미정이라는 점이 이 조건의 유일한 위험이다. 적성 N짜리 캐릭터를 얻는 길이 가챠뿐이고 천장이 없으면, 운이 나쁜 유저는 산업 레벨이 영영 열리지 않는다. 획득 경로를 정할 때 보조 경로(상점 구매·퀘스트 확정 지급) 를 함께 본다. → 캐릭터 5장


4. ⚠️ 왜 낮은 레벨을 고르는가 — 이 설계의 핵심 논점

상위 레벨이 단순히 더 좋기만 하면 레벨 선택은 죽는다. 전부 최고 레벨로 맞추면 끝이고, "고를 수 있다"는 확정(1장 #3·#7)이 의미를 잃는다.

사냥 3.1이 사냥터에 대해 이미 같은 지적을 했다 — "상위 사냥터가 단순히 더 좋기만 하면 하위 사냥터는 죽는다. 기대값을 비슷하게 두고 무엇을 모으는가로 갈라야 선택이 성립한다." 산업 레벨은 그 문제를 5개 산업 전체로 확대한 것이다.

4.1 채택 — B(상위는 느리다)를 중심에 둔다 (2026-08-01)

내용 결정
A. 드롭 목록이 갈린다 상위 레벨에서는 다른 아이템이 나온다 완화형으로 채택 — 4.3
B. 상위는 느리다 상위 레벨일수록 판정 1회 비용이 커진다 채택 · 중심 — 2.4
C. 캐릭터 적성 요구 상위 레벨은 적성이 낮은 캐릭터가 돌리면 매우 느리다 자동으로 따라온다 — 4.4

B가 이 논점을 정면으로 푼다. 상위 레벨은 시간당 판정 횟수가 1/3씩 줄어들므로, 하위 레벨은 "박리다매", 상위 레벨은 "저빈도 고가치" 로 성격이 갈린다. 기대값을 비슷하게 두면 둘 다 살아남는다.

4.2 ⚠️ B는 원래 비권장이었다 — 판단이 뒤집힌 이유

이 문서는 2026-08-01 이전까지 B를 비권장했다. 근거는 두 가지였다.

당시 우려 실제
"JudgeCost는 전역 상수라 레벨이 개입하면 30초 공통 확정이 깨진다" 안 깨진다. 30,000점 = 적성1의 30초이고, Lv1이 그 값을 그대로 갖는다. 전 산업 공통이라는 성질도 유지된다 (2.4)
"캐릭터 속도 계산식과 곱해지는 항이 하나 늘어난다" 안 는다. 속도식은 손대지 않고, 나눗셈의 분자가 상수에서 테이블 값으로 바뀔 뿐이다

그리고 A만으로는 부족하다는 것이 그사이 분명해졌다. A는 "하위 아이템에 지속 수요가 있어야" 성립하는데, 2026-08-01에 특성이 전역으로 재작성되면서 "특성 해금 재료"라는 수요처가 통째로 없어졌다(특성 1.1).

남은 수요처 성격
즉시 판매 골드로 바꿀 뿐이라 상위 등급이 항상 낫다 — 하위를 살리지 못한다
캐릭터 먹이기 경험치 환산식이 미정. 희귀도별로 다르면 여기도 상위가 낫다
제작·납품 기획에 없다

B는 수요처 없이도 하위 레벨을 살린다 — 같은 시간에 더 많이 나오는 것 자체가 이유이기 때문이다.

정리: A는 수요처라는 외부 조건이 필요하고, B는 그 자체로 닫힌다. 그래서 B를 중심에 두고 A를 완화된 형태로 얹었다. 하위 수요처는 여전히 만들 가치가 있지만, 이제 레벨 시스템의 전제 조건은 아니다.

4.3 상위 레벨 드롭 — 하위 저급품이 섞인다

상위 레벨에서도 Lv1의 하위 2등급이 낮은 가중치로 계속 나온다.

낚시 Lv2 드롭
 ├─ 피라미 6590 · 메기 2000 · 가물치 1000 · 백년 메기 300 · 저수지의 주인 100 · 용왕의 사자 10
 └─ 붕어 1000 · 잉어 300        ← Lv1 하위 혼입
레벨 자기 아이템 6종 Lv1 Common Lv1 Uncommon
Lv1 6590 / 2000 / 1000 / 300 / 100 / 10
Lv2 1000 300
Lv3 700 200
Lv4 400 100
Lv5 200 50

혼입 가중치가 레벨이 오를수록 줄어든다. 상위 레벨은 판정 자체가 느리므로, 시간당 기초 재료 산출은 레벨이 오를수록 급격히 떨어진다 (가중치 감소 × 판정 빈도 감소).

왜 완전 분리(순수 A안)로 가지 않았는가: 기초 재료가 상위 레벨에서 아예 안 나오면 하위 슬롯 유지가 강제된다. 이 설계는 그것을 강제가 아니라 효율 차이로 만든다 — 급하면 상위 슬롯 하나로 버틸 수 있고, 대량이 필요하면 하위를 돌리는 게 압도적으로 낫다. 상위가 느린 구조(B)가 이미 하위를 살리고 있어서, 종류까지 막을 필요가 없었다.

⚠️ 혼입 대상은 Lv1 것으로 고정했다. "바로 아래 레벨"이 아니다. Lv5에서도 나오는 하위 재료가 Lv1의 것이어야 기초 재료 수요가 한 곳으로 모인다. 레벨마다 다른 하위가 섞이면 중간 등급 재료가 어디서 얼마나 나오는지 추적이 어려워진다.

4.4 적성 요구는 따로 만들 필요가 없었다

상위 레벨의 필요 점수가 크다는 것 자체가 적성 요구로 작동한다.

적성 1(1000점/초) 캐릭터를 Lv5에 놓으면 판정 1회가 40분 30초, 적성 10(4000점/초)이면 10분 7.5초다. 같은 레벨에서 적성 차이가 그대로 4배로 벌어진다.

낮은 레벨일수록 적성의 절대적 손해가 작다. Lv1은 30초 대 7.5초라 차이가 22.5초지만, Lv5는 30분이 넘는다. 그래서 좋은 캐릭터는 상위 레벨에, 약한 캐릭터는 하위 레벨에 두는 것이 자연스러운 배치가 된다 — 별도 규칙 없이 배치 퍼즐이 성립한다.

이것이 3.1의 해금 조건(적성 N)과 같은 축이다. 적성으로 열고, 적성으로 굴린다.

적성 0은 배치 자체가 거절된다.작업슬롯 3.4

점수 구조가 "적성 0의 속도값" 미결 항목을 없앴다. 기존 기준주기 ÷ 속도는 속도 0에서 0으로 나눠 터졌지만, 점수 누적은 나눗셈이 아니라 덧셈이라 0이 들어와도 사고가 나지 않는다. (배치 거절은 그것과 무관하게 유지되는 별도 규칙이다.)


5. 기존 고유 메커니즘과의 관계

5개 산업이 각자 다른 이름으로 "구간 선택"을 갖고 있었다. 산업 레벨은 그 자리를 통합한다 — 새 축을 추가하는 것이 아니라 이름을 하나로 모으는 것이다.

산업 기존 축 산업 레벨과의 관계 레벨 이름 (Lv1→Lv5) 상태
낚시 낚시터 (1개 · 미생성) 레벨이 낚시터를 대신한다 개울 · 저수지 · 강 하류 · 호수 · 심해 ✅ 정합
사냥 사냥터 (HuntingFieldTable) 레벨 = 사냥터 들판 · 야산 · 깊은 숲 · 설산 · 마수의 영역 ✅ 정합
벌목 수종 (TreeTable) 레벨 = 수종 등급. 자원 고갈은 직교 잡목림 · 소나무 숲 · 참나무 숲 · 흑림 · 세계수 뿌리 ✅ 정합
농사 파종 작물 (CropTable) 레벨과 작물 선택이 겹친다 텃밭 · 밭 · 농장 · 대농장 · 신성한 대지 ⚠️ 결정 필요
채굴 깊이 (DepthLevel · 자동 누적) 레벨과 깊이가 성격이 다르다 노천 광산 · 갱도 · 심층 갱도 · 지하 대공동 · 심연 ⚠️ 결정 필요

레벨 이름은 IndustryLevelTable.Name에 들어 있다. 아이템 Description의 레벨 표기와 같아야 한다 (예: 저수지(Lv2)). 둘이 어긋나도 로직은 멀쩡하므로 사람이 맞춰야 하는 규칙이다.

5.1 ✅ 낚시 — 비어 있던 개입 지점이 채워진다

낚시 3장은 낚시가 5종 중 유일하게 고유 메커니즘이 없는 산업이라고 기록하고 있고, 낚시터 확장을 열린 선택지로 남겨 뒀다.

산업 레벨이 들어오면 낚시터를 따로 만들 이유가 없다. 레벨이 곧 낚시터다.

다만 이것이 낚시의 "조작 없음"(P1과 가장 잘 맞는 산업)을 깨는지는 별개 판단이다. 레벨 선택은 배치할 때 한 번이므로 상시 조작이 아니다 — P1과 충돌하지 않는다.

5.2 ⚠️ 농사 — 레벨과 파종 선택이 겹친다

농사 2장의 A안(파종 = 드랍 세트 선택) 과 산업 레벨은 같은 일을 한다. 둘 다 "슬롯이 어떤 드롭 세트를 쓸지 고르는 것"이다.

내용
A. 파종을 레벨로 흡수 농사 레벨이 곧 작물 세트. CropTable을 만들지 않는다
B. 두 층으로 분리 레벨 = 밭 등급, 작물 = 그 안에서의 세트 선택 (레벨 × 작물 행)

A가 단순하다. B는 농사만 선택 칸이 하나 더 생겨 배치 UI가 산업마다 달라진다. 다만 A를 택하면 농사의 유일한 개입 지점이 다른 4종과 같은 것이 되어 "파종"이라는 농사 고유의 감각은 이름으로만 남는다.

현재 데이터는 A로 깔려 있다 — 농사도 다른 4종과 똑같이 레벨 5개짜리 드롭 시트다. B로 갈 거면 시트를 다시 짜야 한다. → 일감 T-014

5.3 ⚠️ 채굴 — 깊이는 "선택"이 아니라 "누적"이다

채굴의 깊이는 플레이어가 고르는 것이 아니라 시간이 쌓아 주는 것이다. "확실한 스노우볼"이라는 심리 정의가 여기 걸려 있다. 산업 레벨(조건 → 해금 → 선택)과 성격이 정면으로 다르다.

내용 평가
A. 깊이를 레벨로 흡수 하강 메커니즘 폐기. 깊이 = 채굴 레벨 구조는 깔끔하지만 채굴의 정체성이 사라진다
B. 두 층으로 둔다 레벨 = 갱도, 깊이 = 그 갱도 안에서의 누적 권장. 스노우볼을 지키면서 레벨도 성립
C. 채굴만 레벨 없음 채굴은 깊이로만 간다 5종 중 하나만 규칙이 다르다

B를 권장한다. 갱도(레벨)를 고르고, 그 안에서 깊이가 누적된다. 갱도를 바꾸면 깊이는 갱도별로 따로 보관한다 — 그래야 갱도 변경이 후퇴가 되지 않는다.

⚠️ B는 MiningBasicTable의 행 수가 갱도 × 깊이 구간 × 아이템 수 로 늘어난다. 지금 38행인 시트가 깊이 구간 3개만 둬도 100행을 넘는다. 현재 데이터는 A로 깔려 있다(레벨 5개, 깊이 없음). → 일감 T-016

⚠️ 점수 구조가 채굴에 새 논점을 만들었다. 깊이 하강이 "판정 횟수" 단위라면, 상위 레벨은 판정이 느려 깊이도 느리게 내려간다. 갱도가 깊을수록 하강까지 느려지는 이중 페널티가 의도인지 확인이 필요하다. → 게임기획코어 5장 "속도 가변이 판정 횟수 단위 설계와 부딪힌다"


6. 데이터 설계 (2026-08-01 — 엑셀·생성물까지 완료 · 서버 미구현)

🔴 "구현 완료"가 아니다 (2026-08-02 정정). 이 장의 ✅는 전부 엑셀 시트와 .bytes·Unity 미러가 만들어졌다는 뜻이다. 서버 코드는 IndustryLevel을 한 줄도 읽지 않는다IndustryLevelTable 25행이 어디에도 쓰이지 않고, JudgeCost는 여전히 전역 상수 30,000,000이다. → 6.4 · 일감 T-017

6.1 IndustryLevelTable — 신설 (GameDesign/Excel/Industry.xlsx)

컬럼 타입 내용
IndustryLevelTID int (키) 산업 EID × 100 + 레벨. 농사 101~105 · 낚시 201~205 · 채굴 301~305 · 벌목 401~405 · 사냥 501~505
IndustryType eItemType 산업
Level int (1~5) 레벨
Name string 레벨 이름 (낚시터·사냥터·수종·갱도의 통합 이름 — 5장)
RequiredScore int 판정 1회 필요 점수 (초 × 천분율 — 2.4)
RequiredAptitude int (0~10) 해금 조건 ① — 그 산업 적성 요구치 N ⚠️ 임시값
RequiredAccountLevel int 해금 조건 ② — 계정 레벨 요구치 M ⚠️ 임시값
Description string 기획 메모 (로직 미사용)

행 수 = 산업 5 × 레벨 5 = 25행.

시트는 산업별로 갈라져 있다 (2026-08-08). Industry.xlsx 안에 IndustryLevelTable.농사 ~ IndustryLevelTable.사냥 5개 시트가 있고, ExcelGenerator가 시트 이름의 . 앞부분이 같은 시트를 한 테이블로 병합한다. 레벨이 30~40으로 늘어도 자기 산업 시트에 행만 추가하면 된다. IndustryLevelTID 채번식(산업 EID × 100 + 레벨)은 레벨 99까지 버티므로 그대로다.

해금 조건이 확정되면서 컬럼이 단순해졌다.

조건 미정일 때 확정 후
컬럼 UnlockCondition(종류, 대상, 수량) 3개가 필요할 수도 정수 2개
해석 조건 종류마다 분기 로직이 필요 분기가 없다. 두 정수를 비교하면 끝
  • 조건이 고정 2종이므로 범용 조건 시스템(ConditionType enum 등)을 만들지 않는다. 나중에 조건이 늘면 그때 컬럼을 추가한다.
  • Lv1은 해금 없이 열려 있다 — 두 요구치가 0이다.

⚠️ RequiredAptitude·RequiredAccountLevel의 Lv2~5 값은 임시다 (3.3). 요구치가 확정되면 이 컬럼만 고치면 되고, 구조는 바뀌지 않는다.

(IndustryType, Level) 복합키를 쓸 수 없다. ExcelGenerator는 단일 컬럼 키만 지원하므로, 첫 컬럼에 고유 IndustryLevelTID를 두고 서버가 로드 후 (산업 → 레벨 목록) 인덱스를 만든다.

6.2 <산업>BasicTable 5종 — IndustryLevel 컬럼 추가 ✅

이전 이후
DropTID · ItemTID · Weight · Description DropTID · IndustryLevel · ItemTID · Weight · Description
  • 행 수 = 산업당 38행 (Lv1 6행 + Lv2~5 각 8행), 5종 합계 190행.
  • 파일·시트 구조 (2026-08-08 개편): Drop.xlsx 한 파일이 산업별 5개 파일로 갈라졌다 — Drop농사.xlsx · Drop낚시.xlsx · Drop채굴.xlsx · Drop벌목.xlsx · Drop사냥.xlsx. 각 파일 안은 레벨별 시트(FishingBasicTable.Lv1 ~ .Lv5)이고, ExcelGenerator가 베이스 이름이 같은 시트를 한 테이블로 병합한다. 테이블명·생성물은 이전과 동일(<산업>BasicTable 5종). 레벨이 30~40으로 늘면 시트만 추가한다.
  • IndustryLevelRef = IndustryLevelTable.Level 을 걸었다.
  • 서버는 로드 후 (산업, 레벨) → 드롭 행 목록 인덱스를 만들어 롤에 써야 한다. 🔴 아직 안 만든다DropTableCatalogAll을 통째로 등록해 38행이 한 테이블에 뭉쳐 있다. 그래서 지금은 어떤 레벨을 돌리든 Lv1~Lv5 아이템이 전부 섞여 나온다. 가중치 총합도 레벨 수만큼 부풀어 있어 희귀도 분포가 의도와 다르다. → 6.4 · 일감 T-017

ReferenceValidator는 참조 대상이 키가 아니어도 받아 준다 — 그 컬럼의 값 집합을 만들 뿐이다. 이 문서가 이전에 "Level은 키가 아니므로 참조 대상이 못 된다" 고 적었던 것은 사실이 아니었다.

⚠️ Ref는 레벨 번호가 1~5인지만 검사한다. 낚시 시트에 사냥 레벨을 적어도 통과한다. 시트가 산업별로 갈려 있어 실수 여지가 작지만, 산업 정합성은 검사되지 않는다.

DropTID를 6자리로 재배치했다 (2026-08-08)

이전 이후
산업 × 1000 + 레벨 × 100 + 순번 — 낚시 1101~1508 산업 × 100000 + 레벨 × 100 + 순번 — 농사 100101~ · 낚시 200101~
  • 구식(×1000)은 레벨 10부터 레벨×100이 산업 대역을 침범해 깨졌다. 새 식은 레벨 999 · 순번 99까지 버틴다.
  • 산업 자리는 ItemType enum 값을 따른다 (농사 1 · 낚시 2 · 채굴 3 · 벌목 4 · 사냥 5) — IndustryLevelTID와 같은 기준이다.
  • ⚠️ ItemTID 대역(낚시 1 · 농사 2 · 벌목 3 · 채굴 4 · 사냥 5)과는 이제 다르다. ItemTID는 DB에 적히는 정수라 재배치하지 않았다 — 대역 통일은 남은 과제다.

DropTID는 DB에 저장되지 않으므로 번호를 바꿔도 안전하다. 재배치가 금지되는 것은 ItemTID·enum처럼 DB에 적히는 정수다. → 게임기획코어 4장 식별자 규칙

6.3 아이템 — 산업당 30종 (총 150종) ✅

ItemTID = 산업 대역 + 레벨당 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~
  • 신규 120종 추가 (Lv2~5 × 6희귀도 × 5산업). 기존 30종은 Lv1으로 유지.
  • 레벨당 10칸 중 6칸만 쓴다 — 희귀도가 늘어나도 대역이 밀리지 않는다.
  • 산업당 9,950여 개가 남아 있어 레벨을 더 늘려도 자기 대역 뒤로 이어 붙일 수 있다.

6.4 서버 · DB · 패킷 영향 (❌ 미구현 — 일감 T-017)

대상 변경 현재
드롭 롤 (산업, 레벨) → 행 목록 인덱스로 거른다 🔴 레벨 무시 · 38행 통짜
WorkStationSlot IndustryLevel 필드 추가 ❌ 없다 (필터를 걸 축 자체가 없다)
WorkStationSlot.JudgeCost 전역 상수 → RequiredScore × 1000 ❌ 상수 30_000_000 고정
t_user_workstation_slot industry_level 컬럼 추가 ❌ 없다
t_user_industry_level (신규) 유저 × 산업 → 최대 해금 레벨 ❌ 없다
WorkStationSlotInfo IndustryLevel 필드 추가 ❌ 없다
슬롯 배치 패킷 요청에 레벨 추가 · 해금 여부를 서버가 검증 ❌ 없다
해금 판정 캐릭터 획득 시 · 계정 레벨업 시 두 지점 (3.2) ❌ 없다

🔴 미구현이 "아무 일도 안 일어남"이 아니라 "잘못 동작함"이다 (2026-08-02). 엑셀이 먼저 레벨별로 갈라졌기 때문에, 레벨을 모르는 옛 코드가 새 데이터를 읽으며 모든 레벨의 아이템을 한 통에 섞어 뽑고 있다. 구현 전까지 채취 결과는 밸런스 참고값이 아니다.

⚠️ 해금 검증은 반드시 서버가 한다. 클라이언트가 보낸 레벨을 그대로 믿으면 해금하지 않은 상위 레벨을 돌릴 수 있다 — 재화 생성 지점이므로 P4 위반이다.

⚠️ 적성 0 배치도 서버가 거절한다. 이미 Character.CanWork가 있다. 레벨 검증과 같은 지점에서 함께 거절해야 한다.

industry_level은 DB에 저장되는 정수지만 테이블 TID가 아니라 순번이다. 레벨 번호의 의미를 바꾸지 않는다(레벨 2를 다른 것으로 재정의하지 않는다)는 규칙은 동일하게 적용된다.


7. 결정 필요 (Open Questions)

  1. 레벨별 RequiredAptitude(N) · RequiredAccountLevel(M) 값은?미정 (최우선) → 계정 레벨 곡선이 정해져야 M을 잡을 수 있다. 현재 엑셀은 임시값 (6.1)
  2. 농사의 파종 선택을 레벨로 흡수하는가, 두 층으로 두는가? (5.2 — 현재 데이터는 흡수)
  3. 채굴의 깊이와 레벨을 어떻게 나누는가? (5.3 — B안(갱도 × 깊이) 권장, 현재 데이터는 미반영)
  4. 벌목의 숲 자원량을 레벨별로 따로 두는가? 하나로 두면 레벨을 갈아타며 고갈을 회피할 수 있다
  5. 레벨 변경에 제약이 있는가? 쿨타임·비용 없이 자유롭게 바꾸는가 (작업슬롯 6장과 같은 질문이다)
  6. 해금하지 않은 레벨을 UI에 보여 주는가? 보여 주면 목표가 되고, 숨기면 "지금 못 하는 것"이 눈에 남지 않는다 → 게임 UI
  7. 레벨을 갈아탈 때 남은 점수 조각을 이월하는가, 버리는가? (2.3) 싸게 모아 비싸게 쓰는 경로가 열려 있다
  8. 회당 산출량이 레벨에 따라 달라지는가? 지금은 레벨과 무관이다. 상위가 느린 만큼 회당 산출까지 같으면 상위 레벨의 시간당 총량이 1/3씩 떨어진다 — 아이템 가치로만 벌충하는 것이 맞는지 확인이 필요하다 → 일감 T-009
  9. 적성 N짜리 캐릭터를 확정적으로 얻는 길이 있는가? → 가챠뿐이면 운에 따라 콘텐츠가 영영 안 열린다 (3.3 경고)

이 문서가 답한 것:

  • 레벨의 단위 — 산업별 ✅
  • 해금/선택의 층 — 해금은 계정, 선택은 슬롯 ✅
  • 레벨의 효과 — 필요 점수 + 드롭 테이블 ✅
  • 경험치 유무 — 없음. 조건 충족이 곧 해금 ✅
  • 해금 조건 — 보유 캐릭터 적성 N 이상 AND 계정 레벨 M 이상 ✅
  • 해금의 영속성 — 영구. 재검사 없음 ✅
  • 산업당 레벨 수 — 5개 ✅
  • 필요 점수 곡선 — 30,000에서 ×3 등비 ✅
  • 필요 점수의 산업 차등 — 지금은 공통, 나중에 벌릴 수 있음 ✅
  • 하위 레벨이 죽는 문제B안(상위는 느리다)이 수요처 없이 해결 ✅ (4.2)
  • 상위 레벨 드롭 구성 — 하위 저급품 혼입 ✅ (4.3)

이 문서가 만든 것:

  • 판정 비용이 전역 상수에서 테이블 값이 됐다 (2.4) — JudgeCost 상수를 쓰는 모든 코드가 영향
  • 기준 채취주기 30초가 Lv1의 값으로 재해석됐다 (2.4)
  • 낚시터·사냥터·수종이 산업 레벨로 통합됐다 (5장)
  • 아이템이 30종에서 150종이 됐다 (6.3)