최종 갱신 (KST)

← 일감 목록
T-002

캐릭터 장비 시스템

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

완료 2026-09-17. 설계 docs/superpowers/specs/2026-09-17-equipment-design.md · 계획 docs/superpowers/plans/2026-09-17-equipment.md

배경

유저-캐릭터 구조로 전환하면서 인벤토리는 유저 소유, 장비 슬롯은 캐릭터 소유로 정했다. 설계는 매핑 테이블 + 유저 소유 장비 개체 — 행을 테이블 사이로 옮기는 방식은 쓰지 않는다. DB 계층에 트랜잭션 경계가 없어서 옮기는 도중 실패하면 아이템이 사라진다.

결정 (2026-09-17)

# 항목 결정
1 효과 대상 산업 지정 + 속도 가산. Industry(None=전 산업) · SpeedAddPermille. 속도식의 가산 항에 합산. 적성은 바꾸지 않는다 → T-022 사유 소멸
2 정의 테이블 별도 Equip.xlsx/EquipTable. ItemTable은 건드리지 않는다
3 종류 vs 칸 테이블은 종류 EquipKind(Weapon·Accessory·Gem), 매핑은 칸 EquipSlot(Weapon=1·Accessory1=2·Accessory2=3·Gem=4). 장신구는 두 칸 어디든
4 칸 선택 클라가 지정. 서버는 종류가 칸에 맞는지만 검사(EquipKindMismatch)
5 착용 중인 장비 재장착 자동 이동. 이전 캐릭터에서 해제 → 새 캐릭터 착용. 같은 칸의 장비는 창고로. 매핑 변경 최대 3개를 한 트랜잭션으로
6 강화 필드 없음. 규칙이 생기면 ALTER TABLE ADD COLUMN
7 창고 칸 slot_position 컬럼·EquipInfo.SlotPosition + 새 장비는 첫 빈 칸. 정렬·이동 요청은 T-058
8 획득 치트 GiveEquip = 8만. 정식 경로(가챠·상자·드롭)는 미정 — User.GrantEquip이 진입점
9 보석 독립 부위

만든 것

  • 엑셀: Enum.xlsx(EquipKind·EquipSlot) · Equip.xlsx(EquipTable 테스트 행 5개)
  • DB: t_user_equip(개체 · 창고 칸) · t_character_equip((캐릭터, 칸) PK · equip_id UNIQUE)
  • 서버: Common/EquipCatalog.cs · User/Equip/Equip.cs · User/User.Equip.cs(적재·장착·해제·지급) · Repository/EquipRepository.cs · ResolveSlotSpeed에 GetEquipSpeedAdd 가산
  • 패킷: EquipInfo · S_EquipListResponse(27) · S_EquipSyncResponse(28) · C_EquipRequest(29) · C_UnequipRequest(30) · S_EquipResponse(31) · EResultCode 600대 · EEquipSlot
  • Unity 미러·ServerPacketHandler 수신 핸들러 3개 · 더미 클라 메뉴
  • 테스트: EquipCatalogTest · EquipRepositoryTest(:memory: 트랜잭션) · UserEquipTest(20) · UserCheatTest 2 · PacketEnumTest 1

완료 조건 확인

Unity CLI로 실서버 왕복: 치트 지급 → 낚시 슬롯 배치(속도 6000) → 낚싯대(1002, 낚시 +30%) 장착 → 슬롯 속도 7800 → 보석 칸 장착 요청 EquipKindMismatch → 해제 → 6000 → 다시 장착 후 재접속 → S_EquipListResponse 1개 · 슬롯 속도 7800 복원.

남은 것 (별도 일감)

  • 장비 획득 경로 — 상자(T-029)·가챠·드롭 중 결정. 지급은 GrantEquip을 부르면 된다
  • 창고 장비 탭 정렬·자리 이동 — T-058이 자원·캐릭터와 함께
  • 클라 장비 탭·착용 UI — T-043
  • 강화 — 기획 없음
  • T-022 — 장비가 적성을 안 바꾸므로 사유 소멸. 폐기 여부는 사용자 결정

관련 커밋

13792a5 엑셀·enum · 2f9cd11 DDL · db87d47 EquipCatalog · e860066 패킷 · 36b7087 저장소 · 3bed931 장착·해제·속도 · 4cd9213 핸들러·치트

참고

  • Server/docs/채취-정산.md 5장 · Server/docs/데이터-카탈로그.md 5장 · Server/docs/치트.md
  • .claude/Agent/2026-09-17-equip-server.md