최종 갱신 (KST)

← 일감 목록
T-030

상자 획득 경로 — 공통 상자 롤 + 산업별 덮어쓰기

진우 Resolve 우선순위 보통 목표 261010

🔁 방향 변경 (2026-09-25 · 사용자). 상자를 별도 시트(CommonRewardTable)가 아니라 산업 레벨 드롭 테이블(<산업>BasicTable)의 신화 아래 2줄로 옮긴다. 산업·레벨마다 확률을 두고 레벨이 오를수록 확률과 상자 등급이 함께 오른다. Lv2~5의 Lv1 자원 혼입 2줄은 그 자리에서 빠진다. 테이블을 없애면 서버가 깨지므로 서버에 요청했다 → 이슈 #33 (확률표도 거기에).

🔁 재설계 (2026-10-01 · 사용자). 2줄이 아니라 3줄 — 모든 레벨에서 나무·은·황금이 다 나온다(저레벨에서도 황금 상자를 본다). 상자는 레벨마다 따로 15종(100019~100033 · 풀 9~23)이고, 가치는 그 레벨 판정 기대값 × 10 · 30 · 100. 확률은 전 레벨 2% · 0.3% · 0.03%. 기존 상자 3종(100007~100009 · 풀 6~8)은 지우고 결번으로 둔다 → 아이템 4.1.

🔁 다시 별도 롤로 (2026-10-02 · 사용자). 상자가 자원을 대신하지 않게 자원 롤과 따로 굴린다. CommonRewardTable을 되살리고 IndustryType·IndustryLevel 컬럼을 더해 (산업, 레벨)마다 확률을 둔다(75행 — 특정 산업에서 상자가 더 잘 나오게 할 수 있다). 드롭 테이블의 상자 줄은 다시 뺐다.

🔁 공통 + 덮어쓰기로 (2026-10-02 · 사용자). 산업 칸에 None/All을 두는 대신 시트를 나눴다 — CommonRewardTable(레벨별 공통 15행) · CommonRewardOverrideTable(산업, 레벨 — 행이 있으면 그 레벨 공통을 통째로 대신, 지금 0행). 이벤트는 나중에 기간 있는 시트를 더해 공통에 얹는다.

🔁 상한 50 → 1000 · 연속 개봉 크래시 수정 (2026-10-05 · 태웅).

  • 상한 — 50은 "자주 까게" 하려던 값인데, 자는 동안·일하는 동안 방치해 두고 돌아와 확인하는 P1의 재미와 부딪혀 대부분이 버려졌다. Item.xlsx 상자 15종 MaxStack 1000. 한 번에 여는 수(BoxOpenMax)는 50 그대로 — 여러 번 나눠 연다.
  • 크래시 — 50개를 연 뒤 다시 50개를 열면 튕겼다. GachaService.OpenBox가 DB 스레드에 넘긴 차감 목록(SaveItemChangesRepository)에 보상 변경분을 AddRange해 저장 도중 Collection was modified → 세션 끊김 → 클라 핑 타임아웃 → 종료. 응답용 목록을 새로 만들고, 저장소도 받은 목록을 복사하게 고쳤다(이슈 #55 — 진우 리뷰 요청)(테스트 상자_차감_저장_작업에는_보상_변경분이_섞이지_않는다). 띄워 둔 서버는 재시작해야 반영된다.
  • 레벨별 기대값 점검 — 판정 기대값이 레벨당 ×3, 판정 시간도 ×3이라 시간당 자원 수익은 레벨과 무관하게 같다(점수 100만당 903). 상자 내용물 기대값은 목표(판정 기대값 × 10·30·100)의 Lv1 94% → Lv5 86% — 큐브가 고정가라 높은 레벨일수록 조금 모자란다. 상자 즉시 판매가는 내용물 기대값의 약 1/5. 시간당 상자 가치도 레벨과 무관하게 같다(높은 레벨 상자는 크고 드물다).

배경

T-029로 상자를 깔 수 있게 돼도, 상자를 얻는 길이 없다. 기획에는 채취 판정 1회마다 별도로 도는 공통 보상 롤이 이미 설계돼 있으나 CommonRewardTable이 미작성이다 → 아이템 1.4.

이 일감이 루프를 닫는다:

채취 → 상자 → 개봉 → 아이템 → 판매 → 골드 → 캐릭터 뽑기 → 배치 → 채취

띄워 두기만 해도 상자가 쌓이고, 들여다볼 때 깔 것이 있다 — P3(하루에 한 번 들여다볼 이유)에 맞는 장치이며, 놓쳐도 사라지지 않으므로 P1을 어기지 않는다.

할 일

  • [x] 엑셀 — CommonRewardTable(DropCommon.xlsx) 전 산업 공통 1벌 · ItemTID · Count · ChancePerMillion — 미당첨 가중치 대신 행마다 독립 확률로 바꿨다(사용자: "판정 1회당 각각 엄청 낮은 확률"). 한 판정에 둘 이상 나올 수 있다
  • [x] 산업 레벨별 차등 — 당분간 공통 → 2026-09-25 뒤집힘(위 머리글)
  • [x] 서버 — 정산에 별도 롤(CommonRewardCatalog.Roll) · 결과는 그 슬롯의 S_GatherResultResponse에 얹는다
  • [x] 테스트 — 확정(백만분율 100만)이면 판정마다 · 행마다 따로 · 없으면 드롭만
  • [x] 기획 문서 — 아이템 1.4 · 4.1 · 자원채취 · 게임기획코어 5장
  • [x] 실측 — 확률이 낮아(0.2%) 실서버에서는 보지 못했다. 이관 뒤에 확인한다 (레벨 툴팁에 럭키 상자 줄이 보이는지 · 채취로 실제로 나오는지) → 태웅이 클라에서 확인했다(2026-10-02 · #49 코멘트 — Lv1에서 상자 드랍 · 레벨별 툴팁 표시)
  • [x] 프로토콜 미러 커밋 — 15d5223에 함께 들어갔다 (2026-09-25 점검)
  • [x] 서버 — 상자를 <산업>BasicTable로 이관 · CommonRewardTable·CommonRewardCatalog 폐지 (이슈 #33) — 2026-10-01 · 엑셀(드롭 5 · 아이템 · 가챠 · 우편 템플릿 1번 상자 교체) · 서버 테스트 729 통과
  • [x] 공통 + 산업별 덮어쓰기 시트 분리 (2026-10-02)
  • [x] 상자를 별도 롤로 되돌림 · (산업, 레벨)별 확률 — CommonRewardTable 75행 · Roll(industry, level, …) (2026-10-02)
  • [x] 클라 — 산업 레벨 툴팁의 럭키 상자 줄을 CommonRewardTable에서 읽게 — 공통 + 덮어쓰기 두 시트 (태웅 · 이슈 #49) — 1153da8 (2026-10-02) · 서버 확인 완료 — 덮어쓰기 규칙이 CommonRewardCatalog.Roll과 같다. 이슈 닫음 (2026-10-06)
  • [x] 상자 15종 재설계 — 레벨별 상자 · 내용물을 레벨 기대값에 맞춤 (2026-10-01)
  • [x] 상자 상한 50 · 넘치는 몫은 버린다 — MaxStack·BoxOpenMax 99 → 50, 채취 지급이 MaxStack에서 자른다(User.ClampToMaxStack · 우편·개봉 경로는 자르지 않음). 99는 그동안 서버가 강제하지 않던 값이었다 (2026-10-01)
  • [x] 상자 상한 50 → 1000 · 연속 개봉 크래시 수정 — 엑셀 MaxStack · GachaService.OpenBox · SaveItemChangesRepository 복사 · 서버 테스트 748 통과 (2026-10-05 · 태웅 — 서버 폴더 변경이라 진우 확인 필요)
  • [x] 클라 — 산업 레벨 툴팁에 ■ 럭키 상자 묶음 · 상자 개봉 수량 팝업을 "몇 개를 열까?"로 (2026-09-25 · 개봉 팝업 문구는 사용자 확인 · 럭키 상자 묶음은 데이터가 오면 저절로 보인다)

완료 조건

캐릭터를 배치해 두면 아무 조작 없이 상자가 인벤토리에 쌓이고, 그 상자를 T-029로 까서 나온 아이템을 T-028로 팔아 T-027의 가챠를 돌릴 수 있다. 루프 한 바퀴가 실제로 돈다.

막고 있는 것 / 선행 일감

  • T-029 — 같은 작업에서 함께 섰다 (2026-09-19)

관련 커밋

  • 8dcd8fa 상자를 산업 레벨별 15종으로 바꾸고 드롭 테이블로 옮긴다
  • c4f492c 상자 최대 수량을 50개로 줄이고 넘치는 몫은 버린다
  • 85d8899 상자를 자원과 따로 굴리고 확률을 (산업, 레벨)마다 둔다

참고