최종 갱신 (KST)

← 일감 목록
T-028

즉시 판매 — 아이템을 팔아 골드를 얻는다

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

배경

골드를 버는 길이 하나도 없다. User.Currency·S_CurrencyResponse는 있지만 잔액을 늘리는 경로가 없어 항상 0이다. 그래서 가챠 비용(T-027)도 슬롯 확장도 검증할 수 없다.

기획상 즉시 판매가 골드 faucet이자 거래소 가격의 하한이다 → 거래 3.1. 낮은 등급(Common·Uncommon)은 거래소에 올려도 팔리지 않으므로 즉시 판매가 유일한 출구다.

BasePrice 컬럼이 없으면 한 줄도 구현되지 않는다. 이 일감이 컬럼과 임시값까지 넣는다 — T-018은 그 위에서 값을 확정하는 일감으로 남는다.

할 일

  • [x] 엑셀 — Item.xlsx
    • [x] BasePrice 컬럼 추가 (Type = int · Min = 0)
    • [x] 156종 전부에 임시값 — 레벨배율(1·3·9·27·81) × 등급배율(10·25·60·150·400·1000). 곱셈 구조라 2차원 단조 증가가 구조적으로 깨지지 않는다 (위반 0건 검증)
    • [x] generate-tables.ps1 실행 · 엑셀 + 생성물 같은 커밋
  • [x] 밸런스 상수 — 즉시 판매가 = BasePrice의 100%
    • [x] 엑셀이 아니라 코드 상수 한 곳에 뒀다 (ShopService.SellRatePermille). 이 값 하나 때문에 새 엑셀 파일을 만들지 않기로 했다 — 거래소가 붙어 수수료·가격 밴드가 함께 생길 때 그때 엑셀로 옮긴다
  • [x] 패킷
    • [x] C_ItemSellRequest — List<ItemInfo>(종류 목록). 일괄 판매가 기본 동선이다
    • [x] S_ItemSellResponse — 결과 코드 · GainedGold · ItemChangeInfo 목록
    • [x] 잔액은 S_CurrencyResponse로 함께 내려보낸다
    • [x] EResultCode 300번대 신설 — InvalidSellRequest · NotEnoughItem
  • [x] 서버
    • [x] 보유 수량 검증 → 인벤 차감 → 골드 지급을 한 트랜잭션으로 묶는다 (SellItemsRepository 하나가 둘을 함께 쓴다. DbConnection.InTransactionAsync 신설)
    • [x] 판매 불가 아이템 — 지금은 전부 판매 가능. ShopService.IsSellable 자리만 만들어 뒀다. 실제로 갈리는 것은 상자가 생기는 T-029다
    • [x] 테스트 13개 — 차감 원자성 · 골드 증가액 · 거절 시 무변화 · DB 작업이 하나만 예약되는가
  • [x] 기획 문서 — 거래 6장 #1 해소 · 아이템 5장 갱신 · 전파 검사
  • [x] 프로토콜 미러 커밋
  • [x] 더미 클라 검증 수단 — PacketMenu에 ItemSell 액션(ItemId:Count 목록 입력)

결정한 것

  • 한 번에 여러 종류를 판다. C_ItemSellRequest가 목록을 받는다 — "전부 판매"·"Common 일괄 판매"가 요청 1번으로 끝난다.
  • 전부 되거나 전혀 안 된다. 목록 중 한 종류라도 모자라면 아무것도 팔리지 않는다. 부분 성공을 허용하면 클라가 "무엇이 팔렸는지"를 다시 물어야 한다.
  • 상점의 구매 쪽은 만들지 않았다. 지금 골드로 살 수 있는 물건이 하나도 없다 — 슬롯 확장권은 T-038, 가챠는 티켓 대신 골드 직접 결제(T-027)로 바뀌었다.

완료 조건

더미 클라에서 채취로 쌓인 아이템을 팔면 골드 잔액이 오르고 인벤토리가 줄어든다. 그 골드로 T-027의 가챠를 실제로 돌릴 수 있다.

막고 있는 것 / 선행 일감

  • 없음 (BasePrice 임시값을 이 일감이 직접 넣는다)

관련 커밋

  • fddc43f — 엑셀·패킷·서버·테스트·미러 (worktree worktree-T-028-baseprice-shop)

참고

  • 거래 3.1 · 아이템 5장
  • T-018 — BasePrice 값 확정(이 일감 이후)
  • T-032 — 클라 판매 UI. 패킷 스펙을 그 문서에 적어 뒀다
  • 구현: Shop/ShopService.cs · User/User.Shop.cs · Repository/ShopRepository.cs · User/Inventory/Inventory.cs(TryRemoveItems) · DB/DbConnection.cs(InTransactionAsync)