배경
지금 가챠는 공짜다. GachaService.Draw가 횟수와 풀 존재만 검사하고 바로 지급한다.
비용이 없으면 캐릭터를 무한히 뽑을 수 있어 적성·배치·산업 레벨 해금이 전부 무의미해진다.
기획의 sink 3종은 거래 수수료 · 슬롯 확장권 · 가챠 티켓이었으나
가챠 비용은 골드 직접으로 확정한다(2026-08-17). 티켓 획득 경로를 만들지 않아도
판매 → 골드 → 뽑기가 곧바로 이어지고, 즉시 판매(T-028)가 만든 골드에 첫 출구가 생긴다.
할 일
- [x] 엑셀 — 풀 메타 테이블 신설 (
Gacha.xlsx)- [x]
GachaInfoTable—GachaInfoTID(= 풀 ID) ·Name·CostCurrency(eEnumCurrencyType) ·CostSingle·CostMulti·Description - [x] 방향이 뒤집혔다 — 풀 시트가 메타를 참조한다
(
GachaItemTable.GachaId·GachaCharacterTable.GachaId에Ref: GachaInfoTable.GachaInfoTID). 시트가 둘로 갈려(T-026) 메타가 한쪽만 가리킬 수 없기 때문이다 — 메타 없는 풀을 막는다 - [x] 값은 테스트용 (1번 500/5,000 · 2번 1,000/10,000). 10연차 = 정확히 10배
- [x]
generate-tables.ps1실행 · 엑셀 + 생성물 같은 커밋
- [x]
- [x] 서버
- [x]
GachaService.Draw에 비용 검사·차감을 넣는다 — 지급 전에 차감한다 - [x] 잔액 부족은
EResultCode.NotEnoughCurrency(102)로 거절 — 아무것도 지급하지 않는다 - [x] 차감 후
S_CurrencyResponse로 잔액을 내려보낸다 (TrySpendGold가 이미 저장·통지한다) - [x] 메타가 없는
GachaId는 거절한다 (공짜로 새는 구멍을 만들지 않는다) - [x] 테스트 — 잔액 부족 시 지급·차감이 둘 다 없는지 / 10연차가
CostMulti를 쓰는지
- [x]
- [x] 기획 문서 — 거래 3.2 sink ③ 갱신 · 전파 검사
- [x] 프로토콜 미러 커밋
완료 조건
골드가 모자라면 뽑기가 거절되고, 뽑으면 골드가 줄어든 잔액이 클라에 내려온다. 공짜로 뽑히는 경로가 하나도 남지 않는다.
⏳ 실물 확인은 남았다 — 더미 클라로 돌리려면 골드를 벌 수단이 필요하다 → T-028 즉시 판매.
막고 있는 것 / 선행 일감
T-026— 같은 작업 단위에서 함께 끝냈다
관련 커밋
- 미커밋 (
worktree-T-026-character-gacha)
참고
Server/WSGameServer/User/User.Currency.cs(TrySpendGold·TrySpendDia)Server/WSGameServer/Gacha/GachaService.cs- 거래 3.2