# 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에서는 통계 조회, 프로필 영속화, 도감/인벤토리 같은 확장 기능을 고려할 수 있습니다.
