- 티커: 반투명 검은 가로 박스, 새 채팅을 한 줄씩 7초간 순차 표시,
길면 말줄임(…) 처리. 접속 이후 도착한 메시지만 흘림
- 💬 버튼 → 기존 메뉴와 같은 우측 사이드패널로 전체 채팅창
(히스토리 스크롤 + 말풍선 + 입력창, 내 메시지는 오른쪽 초록)
- SSE 연결은 chatClient 싱글톤(useSyncExternalStore)으로 티커·패널 공유
- 1:1 친구 채팅 로드맵을 docs/GAME_DESIGN.md 12절에 기록
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 오른쪽 상단에 한 줄씩 뜨는 반투명 채팅, 20초 후 페이드아웃 (최대 6줄)
- 💬 버튼으로 입력창 토글, Enter 전송 / ESC 닫기
- SSE 스트림(/api/chat/stream): 접속 즉시 연결, 최근 20개 백로그는 비동기 전송,
25초 하트비트로 프록시 유휴 타임아웃 방지
- 전송(/api/chat/send): 닉네임+토큰 검증(사칭 방지), 1.5초 도배 제한, 120자 제한
- chat_messages 테이블 자동 생성, 인프로세스 EventEmitter 브로드캐스트 (단일 컨테이너)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
고레벨 고양이 3마리 편성 시 150은 1~2분 만에 가득 차 생산이 멈추고
상시 수거 노동이 됐음. 400이면 최대 편성 기준 ~10분 여유가 생기고
오프라인 복귀 시 수거 보상도 의미 있는 양이 됨.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 새 마을 생성 시 닉네임과 함께 비밀 암호(2~16자) 필수 지정
- 복구 API: GET → POST 전환, 닉네임+암호 일치 시에만 세이브·토큰 반환
- 서버에는 salt+SHA-256 해시만 저장 (timingSafeEqual 비교)
- 암호 도입 전 마을은 최초 복구 시 사용한 암호를 그대로 등록(claim)
- 오프라인 시작 시 암호를 로컬 보관 → 자동 재등록에 포함
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 입양 재추첨 버튼: 장터 완공 전까지 숨김 (완공 후 해금)
- 부엌 있는데 요리 가능 고양이가 없으면 입양 후보에 요리 적성 보장
- 서버 접속 불가 시에도 닉네임 결정 가능 (오프라인 시작 → 이후 자동 재등록)
- 저장 403(미등록 닉네임) 시 재등록 후 재시도
- 파업 중 굶주림 행복도 하락 제외 + 자연 회복 +2/분 (전원 파업 데드락 방지)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 장터(회관 Lv2 건설) 전까지 코인 수입이 없어 3마리째 입양(100코인)이
불가능하던 문제 — 부엌 인력을 못 뽑아 굶는 소프트락
- 작별 단계 진입 시 촌장 냥이가 🪙200 지급 + 작별 대사에 안내
- 이미 튜토리얼을 마친 기존 마을도 접속 시 1회 소급 지급 (중복 방지 플래그)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 등록만 되고 세이브가 저장된 적 없는(data NULL) 닉네임은
중복 체크에서 사용 가능으로, 재등록 시 새 토큰으로 재선점
- 불러오기 실패 시 "서버에 닿지 않아" 대신 "그 이름의 마을은 없는걸?"
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- HUD 타이틀: 닉네임 설정 시 "{닉네임}의 마을 · 회관 LvN"
- 닉네임 모달에 "마을 불러오기" 모드: 기존 마을 이름 입력 →
1초 디바운스로 존재 확인("마을을 찾았어!") → 서버 세이브 복원
(/api/village/recover — 토큰 포함 반환, 비밀코드 보호는 추후)
- pull 비교 버그 수정: 오프라인 정산이 로컬 updatedAt을 항상 현재로
만들어 다른 기기 세이브를 절대 못 받던 문제 → 디스크에서 읽은
시점(loadedUpdatedAt) 기준으로 비교
- 모달 UX: Enter로 결정(한글 조합 중 제외), IME 간섭 제거(trim 시점 이동),
모드 전환 시 자동 재체크
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- villages 테이블(pg-jskim): nickname PK + 보호 토큰 + JSONB 세이브
- API: /api/village/check(중복)·register(선점)·save(토큰 검증 업서트)·load
- 닉네임 모달: 촌장 냥이 인사 직후 게임 차단, 입력 멈춘 1초 후 자동
중복 체크(디바운스), 사용 가능할 때만 결정 버튼 활성화
한글·영문·숫자 2~12자 검증, 서버 불가 시 로컬 시작 후 재시도
- 동기화: 30초마다 자동 push + 종료 시 push, 부팅 시 서버가 더 최신이면
교체(replaceState → 마이그레이션·오프라인 정산 재수행)
- 기존 세이브도 닉네임 미설정이면 모달 표시
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 해금 전: 행복도 증감·파업 로직 완전 비활성, 속도 배율 중립, UI에서 💗 숨김
→ 초반에 행복도를 올릴 수단이 없어 파업 소프트락에 걸리던 문제 해결
- 해금 조건 달성 시 촌장 냥이가 재등장해 행복도 시스템 안내 (1회)
- 해금 순간 전원 행복도 80으로 초기화
- 기존 세이브 마이그레이션: 조건 미충족이면 파업 해제 + 행복도 리셋,
이미 충족한 마을은 안내 생략
- 햇볕 데크 설명에 해금 역할 명시
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 냥코인(🪙) 재화 + HUD 표시, 복덩이 패시브 실효과(일하는 중 평균 100초당 1)
- 장터 건물(목재 120, 회관 Lv2): 판매 품목 선택 → 분당 5개 자동 판매
가격: 생선 1·목재 2·돌 3·구이 4·훈제 10 — 가공할수록 이득
- 창고 상한: 자원별 기본 500, 창고 건물(+500)로 확장. 가득 차면 회수 차단
(부분 회수·"창고 가득" 피드백), 건물 적재도 150 한도로 생산 정지
- 입양 비용: 3마리째부터 100+(n-2)×50, 모달에 비용 표시. 재추첨 🎲 30코인
- 즉시 완공: 건설 중 패널에서 남은 10초당 1코인
- 요리 판매는 부엌 선반에서 차감 — "먹일까 팔까" 선택 완성
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 단계 진입 시 자동 지급: 벌목장(생선 30)·부엌(목재 60)·회관 증축(목재 100+생선 80)
- 회관 단계에선 '특훈'으로 최고 레벨 친구를 Lv3으로 — 대기 없이 증축 가능
- 대사에 지원 멘트 반영 ("내가 미리 준비해뒀어!", "마을 발전 기금에서 내가 쏠게")
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- engine.reset(): 세이브 삭제 + 새 게임 상태로 즉시 전환 (튜토리얼부터)
- 회관 패널 하단에 확인 창 포함 초기화 버튼
- 콘솔에서 localStorage만 지우면 5초 자동 저장이 되살리는 문제의 정식 해법
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 새 게임: 회관만 있는 빈 마을(고양이 0·자원 0)에서 시작
- 촌장 냥이(코숏 스프라이트) + 말풍선 가이드 오버레이 (진행도 n/10, 태스크 칩)
- 라인: 인사 → 첫 입양 → 부두 건설(무료·강물 위)·배치 → 둘째 입양 →
벌목장 건설(생선 30)·배치 → 부엌 건설(목재 60) → 회관 Lv2 증축 → 작별
- 조건 충족 시 자동 진행, 인사·작별은 버튼. 완료 후 자유 운영(step 99)
- 부두·벌목장을 상점 구매 건물로 이동 (기존 세이브는 "보유 중"+튜토리얼 생략)
- 튜토리얼 입양 후보는 필요 적성(낚시→벌목) 보장
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 체력(energy): 작업 중 분당 -2(튼튼함 -30%), 소진 시 강제 휴식 —
배치 해제 후 수면 포즈로 회복(분당 +20, 고양이 집 +30), 완충 시 자동 복귀
- 행복도: 포만 80↑ +1/분, 굶주림 -4/분, 고양이 집 부족 -2/분(바닥 25),
휴식 +3/분, 햇볕 데크 회복 1.5배, 인기쟁이 동료 버프
효과: 80↑ 속도 +10%, 50 미만 -30%, 20 미만 파업(배치 해제·재배치 불가)
- 파업: 💢 배회, 행복도 40 회복 시 이전 일터로 자동 복귀
- 새 패시브: 낙천적(-40%)·까다로움(+50%)·인기쟁이 / 튼튼함·일중독 실효과화
- 새 건물: 고양이 집(정원 4, 목재100+돌20)·햇볕 데크(목재120+돌40) —
배치 없는 패시브 건물(전용 패널), 회관 Lv3 해금, 이모지 렌더(일러스트 대기)
- 오프라인 정산: 최대 8시간을 60초 단위 시뮬레이션, 복귀 시 토스트
- UI: 고양이 카드에 체력(⚡)·행복도(💗) 바, 휴식/파업 상태 표시
- 뷰: 휴식 시 고양이 집으로 이동 후 수면 포즈+💤, 파업 시 💢
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- BuildDef.buildTime 추가 (부엌 60초, 채석장 120초), 상점에 ⏱ 표시
- 배치 확정 시 constructionUntil 타임스탬프 설정 (오프라인에도 진행)
- 건설 중: 공사장 일러스트 + 🔨 카운트다운 판자 배지 + "건설 중" 라벨,
생산·배치 불가, 회관 증축 요건에도 미인정
- 패널: 공사장 이미지 + 진행 바 + 남은 시간 표시
- 완공 시 tick에서 자동 전환
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 보드 11×11 → 15×15, 강을 동쪽 2열로 확장 (흐름·반짝임도 2열)
- 건물 풋프린트: 회관 3×3, 부두·벌목장·채석장·부엌 2×2 (pos=좌상단 앵커)
렌더·클릭 영역·작업 위치(반경)·산책 충돌 전부 풋프린트 기반
- 배치: canPlaceAt이 풋프린트 전 타일 검사 + 사각 겹침, 호버 시 풋프린트
전체 하이라이트 + 실제 크기 고스트
- 부두: onWater 규칙(물 타일 위에만), 이미지 좌우 반전(강 방향)
- 보드 버전(v2) 마이그레이션: 기존 세이브 건물을 새 기본 위치로 재배치
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 발바닥 문양 오두막 일러스트를 투명화(420px)해 회관에 적용
- 원본은 assets-src/buildings/village_hall.png 보관
- 회관 클릭 영역을 일러스트 크기에 맞게 확장
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 미사용 에셋 삭제: 구 오렌지 태비 4프레임(품종 시트로 대체), create-next-app svg
- assets-src/: AI 생성 원본(품종 시트 8장·잔디·강물·도구·건물 시트) 프로젝트로 이동
- build.png 슬라이스: 어두운 글로우 배경을 밝기 기반 플러드필로 제거 →
부두(선착장+보트)·벌목장·채석장(광산)·부엌(모닥불) 4종
- 마을 캔버스·상점·패널 아이콘에 건물 일러스트 적용 (도구 아이콘은 폴백)
- 배치 고스트도 건물 일러스트, 히트 영역 확장, 삭제된 루트 프레임 404 폴백 제거
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 폰트: Jua(제목·버튼)·Gowun Dodum(본문)·JetBrains Mono(숫자) next/font 적용
- 팔레트·공통 클래스: 우드/크림/잎사귀 토큰, wood-plank·wood-pill·nature-btn·
amber-btn·panel-wood/paper·card-nature·chip-nature·bar-* (globals.css)
- HUD: 어두운 나무 바 + 매달린 판자 타이틀(로프) + 우드 자원 pill + 초록 입양 버튼
- 패널: 나무 프레임(나뭇결 텍스처) + 크림 종이 이중 구조 + 잎사귀 장식
- 카드: 비대칭 잎모양 모서리 + 초록 액센트 바, 연두 적성 칩, 초록/앰버 진행 바
- 입양 모달·상점·토스트·배치 힌트 모두 동일 스타일
- 캔버스: 건물 자원 배지를 나뭇결 판자+초록 글로우로, 라벨은 Jua+크림 외곽선
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 건물 위치가 게임 상태(building.pos)로 이동, 구세이브 자동 마이그레이션
- 🛒 상점 패널: 건물 목록·비용·해금 조건, 구매 → 배치 모드 진입
- 배치 모드: 배치 가능 타일 하이라이트, 호버 타일 초록/빨강 + 고스트,
클릭 확정(비용은 확정 시 차감), ESC/취소 버튼
- 배치 규칙: 물·나무·회관·기존 건물 차단, 부두는 물가 열 전용
- 기존 건물 📍 이동 기능 (건물 패널), 이동 시 배치된 고양이가 새 일터로 걸어감
- 공터(🚧) 방식 제거
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 캔버스가 뷰포트를 픽셀 단위로 가득 채우고 월드 좌표계로 렌더
(zoom = 보드 fit 배율, 보드는 월드 중앙 배치, 리사이즈 대응)
- 잔디 텍스처를 화면 전체에 커버, 격자 힌트는 플레이 보드에만 유지
- 강 스트립을 화면 밖까지 연장 (양방향 ±30타일) + 반짝임 오버레이 동일 적용
- 보드 밖 배경에 나무 16그루·꽃·바위 장식으로 숲 프레임 연출
- 클릭 좌표를 zoom 기반 월드 좌표로 변환
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 마을 캔버스가 뷰포트 전체를 채움 (ResizeObserver 스케일링)
- 상단 HUD: 회관·자원 칩 + 고양이 목록·입양 버튼 (반투명 오버레이)
- 건물 클릭 → 우측 플로팅 패널: 정보(적성·슬롯·속도·진행)·회수·
배치 가능한 고양이 목록(예상 속도순, 현재 일터 표시)에서 배치/해제
- 회관 클릭 → 증축 요건 체크리스트 패널, 부엌 미건설 시 공터(🚧) 클릭 → 건설
- 고양이 전체 목록은 서랍 패널로 이동, 기존 그리드 섹션 제거
- 배지 클릭 빠른 회수는 유지, 메시지는 토스트로 표시
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
확정 사항: 낮/밤 없음(항상 낮, 체력·행복도로 페이스 조절), 장기 구조는
마을 확장만(은퇴 없음), DB 세이브 동기화(Phase D), 프레스티지 폐기.
구현 로드맵 Phase A~E 정의.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 입양하기 → 모달에 후보 3마리 (능력치·품종 희귀도·적성·패시브 전부 랜덤)
- 패시브 배지 마우스오버 시 상세 툴팁 (이름·긍정/부정/복합 구분·효과)
- PassiveBadge 컴포넌트로 통합, 고양이 카드에서도 동일 툴팁 사용
- 모달 밖 클릭/✕로 취소 가능
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- cat_sprite.png 시트를 4프레임으로 슬라이스, 가장자리 플러드필로 배경 투명화
(배 크림색 보존), 256px 축소 → public/assets/cats/
- 걷기 180ms 프레임 교대, 일할 때 work 포즈 + 바운스, 좌우 반전 지원
- 로드 전 이모지 폴백 유지
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 순수 수면 텍스처로 교체 (900px JPEG, 137KB)
- 컨텍스트를 강 방향으로 회전 후 미러 타일링 스크롤 → 이음매 없는 단방향 흐름
- 상류(북동) → 하류(남서) 22px/초
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- public/assets/grass.jpg (1200px JPEG 최적화)
- 잔디 타일 영역 클리핑 채움, 격자 힌트는 미세한 화이트 오버레이로 유지
- 로드 전 단색 폴백
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- public/assets/water.jpg (원본 2.7MB → 1200px JPEG 233KB 최적화)
- 물 타일 영역을 클리핑해 텍스처 채움, 강 방향 느린 드리프트 애니메이션
- 타일 반짝임은 은은한 화이트 오버레이로 유지, 로드 전 단색 폴백
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- public/assets/tools/: 낚싯대·도끼·곡괭이·약초바구니·냄비·톱·빗 (적성 키 이름)
- 원본 파일명 axe/pickaxe가 서로 뒤바뀌어 있어 교정
- VillageView 건물 스프라이트를 일러스트로 교체 (로드 전 이모지 폴백)
- BuildingCard 헤더 아이콘도 일러스트 사용
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 11x11 아이소 타일 (잔디·물가·나무·장식), 회관/부두/벌목장 배치
- 고양이: 미배치 시 마을 배회, 배치 시 건물로 걸어가 작업(바운스+💦)
- 생산 말풍선, 건물 배지 클릭으로 산출물 회수
- 렌더 루프는 engine.peek() 라이브 참조 사용 (매 프레임 클론 회피)
- 컬러 이모지에 fillStyle 알파가 적용되는 문제 수정, 페이지 타이틀 변경
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 공식 워크플로우(.gitea/workflows/deploy.yml) 그대로 사용 (repo secrets 주입)
- deploy/docker-compose.yml: Next.js 포트 3000으로 Traefik 라벨 변경
- 커스텀 배포 방식 제거
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>