Kord/Docs/WorkDone/2026-03-31_Fishing_MiniGame...

2.9 KiB

2026-03-31 낚시 미니게임 Phase 1 완료

개요

낚시 미니게임의 Phase 1 범위를 완료했습니다. 이번 완료 단계에서는 전용 스레드 기반 플레이 흐름, 입력 예약형 판정, 물고기 데이터 기반 난이도/보상 시스템, 성공 시 아트 리소스 출력까지 포함해 실제 플레이 가능한 MVP를 마무리했습니다.

완료 범위

  • /fishing enter, /fishing cast, /fishing end 명령 흐름 확정
  • UserName's Fishing Spot 형식의 전용 스레드 생성 및 재사용
  • 낚시 스레드 안에서만 /fishing cast 가능하도록 제한
  • 사용자당 1개 활성 낚시 세션 유지
  • ⬅️, ⏺️, ➡️, 🛌 이모지 버튼 조작
  • 거리 게이지 / 끊어짐 게이지 렌더링
  • 입력 예약형 판정 구조 적용
  • 휴식 시 끊어짐 회복 + 거리 증가 규칙 반영
  • 성공/실패 후 스레드 유지, /fishing end에서만 삭제되도록 흐름 개선
  • resource/data/fishing/fish_catalog.json 기반 물고기 데이터 연결
  • 물고기별 출현 확률, 골드 범위, 반응 시간, 위치 약점, 아트 경로 적용
  • 성공 시 물고기 PNG 첨부 및 결과 메시지 전송
  • 대상 물고기와 상세 판정 시간은 플레이 중 UI에서 비공개 처리
  • 메시지 갱신 빈도 축소 및 판정 유예 시간 추가로 반응성 개선

주요 파일

  • src/commands/fishing.ts
  • src/services/FishingService.ts
  • src/events/interactionCreate.ts
  • src/services/MiniGameRegistry.ts
  • src/services/RefinementService.ts
  • src/i18n/types.ts
  • src/i18n/locales/en.ts
  • src/i18n/locales/ko.ts
  • resource/data/fishing/fish_catalog.json
  • resource/art/fishing/*
  • tests/services/FishingService.test.ts

플레이 흐름

  1. 사용자가 허용된 텍스트 채널에서 /fishing enter
  2. 봇이 낚시 전용 스레드를 생성하거나 기존 스레드를 재사용
  3. 사용자가 자신의 낚시 스레드 안에서 /fishing cast
  4. 버튼 입력으로 거리와 끊어짐 게이지를 관리
  5. 성공 시 물고기 결과 메시지와 PNG 출력, 골드 지급
  6. 같은 스레드에서 다시 /fishing cast로 재도전 가능
  7. /fishing end로 스레드 종료 및 삭제

밸런스 / UX 정리

  • 라운드 길이와 반응 시간은 Discord 버튼 지연을 고려해 완화했습니다.
  • 세션 틱은 더 촘촘하게 돌리되, 메시지 수정은 필요한 시점에만 수행하도록 조정했습니다.
  • 반복 플레이 피로를 줄이기 위해 물고기별 위치 약점과 거리 감소량은 JSON 데이터 기반 랜덤 범위를 사용합니다.

검증

  • yarn build
  • yarn test --runInBand

두 명령 모두 정상 통과했습니다.

비고

  • 낚시 세션은 메모리 기반이므로 봇 재시작 시 유지되지 않습니다.
  • Phase 2에서는 통계 조회, 프로필 영속화, 도감/인벤토리 같은 확장 기능을 고려할 수 있습니다.