하루 동안 정체성 확립부터 전면 리뉴얼까지 진행한 대규모 세션의 기록입니다.


1. 세계 정체성 확립

요청: "이 오픈월드의 정체성을 뭐로 가져가야 할지 모르겠다"

4가지 방향(디지털 어항, 마을 도슨트, 느린 삶의 마을, 작은 생태계)을 분석하고, Stanford AI Town, Animal Crossing, Kind Words 등을 참고하여 "느린 삶의 마을 + 도슨트 온보딩 + 관조 모드" 를 선택했습니다.

"어떤 개발자의 홈페이지에 들어갔더니, 작은 마을이 살아 숨쉬고 있었다. 주민들이 나를 기억해줬다."

CLAUDE.md에 핵심 원칙 6가지를 기록했습니다.


2. 게이미피케이션 대청소 (~880줄 삭제)

요청: "정체성에 안 맞는 기존 시스템들 정리해줘"

제거 이유
코인 경제 화폐는 거래지, 관계가 아님
카드 수집 (40+ 참조) 가챠/스탯 보너스는 느린 삶과 반대
업적 시스템 마일스톤은 체크리스트, 체험이 아님
상점 시스템 NPC를 상인이 아닌 이웃으로
긴급 이벤트/챌린지 타이머 긴장감은 느린 삶에 반함
스토리 아크 강제 서사 대신 자연스러운 기억
동적 퀘스트 자동생성 LLM 부탁 시스템으로 대체
호감도 숫자/하트 UI 관계는 태도로 체감

아이템은 선물용으로 유지. 시작 시 퀘스트 없음.


3. 서울 실시간 동기화

요청: "시간은 서울 시간으로, 날씨도 서울 날씨로"

  • 시간: new Date()Asia/Seoul KST 고정. 1:1 비율 유지.
  • 날씨: 서버에 /api/weather 엔드포인트 추가 (OpenWeatherMap, 10분 캐시). 랜덤 날씨 → 실제 서울 날씨.

4. 룰 베이스 → LLM 전환

요청: "AI NPC인데 룰 베이스 대화를 하지 않았으면"

  • E키 인터랙션 → LLM 인사 생성
  • 감정 분석: 플레이어 텍스트 regex → NPC의 LLM 응답 텍스트 분석
  • 죽은 코드 정리: npcSmallTalk, detectTopic, npcReply 제거
  • LLM 실패 시: "나 말하는 법을 까먹은 거 같아..."

5. NPC 욕구 시스템

요청: "캐릭터들이 자기 상태에 맞게 필요한 행동을 해야"

5개 욕구: hunger(배고픔), energy(에너지), social(사교), fun(즐거움), duty(할 일)

욕구 트리거 행동 해소 장소
hunger > 70 시간에 따라 증가 음식점으로 카페/빵집
energy < 20 시간에 따라 감소 집으로
duty > 70 시간에 따라 증가 출근 직장
fun < 20 시간에 따라 감소 놀러 감 공원/꽃집
social < 30 시간에 따라 감소 사교 광장

LLM 혼잣말과 대화에 욕구 상태 반영. "배고프다...", "일해야 하는데..."


6. NPC 자세 & 기분

요청: "기분에 따른 모션, 앉기/눕기도 추가해줘"

  • pose: standing, sitting, lying, waving
  • 벤치 1칸 이내 → 정확히 벤치에 앉기 (방향 맞춤)
  • 집 + 밤 → 눕기
  • 자율 기분 변화: 시간/날씨/성격 기반 (맑은 아침 + 밝은 성격 → happy)
  • 3D 렌더러 통합: animateByState에 pose 파라미터
  • 눈을 head 자식으로 이동 (모든 포즈에서 얼굴 정상)

7. 도슨트 NPC 특별 대우

요청: "도슨트는 좀 특별해야지, 맨날 자면 안 돼"

  • 항상 서 있음 (앉기/눕기 제외)
  • 항상 밝은 기분 (자율 변화에서 happy 고정)
  • 플레이어가 무례하면 대화 감정에서 화낼 수 있음
  • 첫 인사: 말풍선 + waving 포즈로 환영
  • 마을 역사/전통을 하나씩 꺼내주는 도슨트 역할

8. 마을 Lore

요청: "마을의 역사와 전통에 대해 다 알고 있어야"

서버 프롬프트에 11항목 추가:

  • 마을 이름 "유곤포르 마을", AI 주민 탄생 이야기
  • 자정의 분수, 고양이 마을, 비 오는 날 버섯 전설
  • 마을 모토 "느린 삶, 깊은 관계"

9. 동행 시스템

요청: "NPC가 따라가겠다고 했는데 안 따라오잖아"

  • [동행]: NPC가 플레이어 따라다님 (1.8칸 유지)
  • [안내:cafe]: NPC가 장소로 앞서 걸어감
  • [안내:npc:heo]: 대상 NPC의 실시간 위치를 추적하며 안내
  • [동행해제]: 종료. 작별 인사 시 자동 해제.

10. 스트리밍 말풍선

요청: "말풍선에도 스트리밍 들어가게"

LLM 스트리밍 chunk가 올 때마다 upsertSpeechBubble 갱신. NPC 머리 위에서 글자가 실시간으로 나타남.


11. 대화 추천 선택지

요청: "직접 치는게 귀찮아. 추천해줘"

  • 첫 대화: 역할/관계 기반 3개 버튼
  • 후속 대화: LLM이 [선택지:a|b|c] 태그로 직접 생성 (추가 API 호출 없음)
  • LLM이 태그 안 붙이면 키워드 기반 폴백

12. 한국어/영어 다국어 지원

요청: "언어 설정을 변경할 수 있게"

  • src/playground/core/i18n.js: ko/en 번역 테이블 (~80키)
  • t(key, params) 함수로 모든 UI 문자열 교체
  • 언어 토글 버튼 (상단 좌측)
  • 서버: buildPromptKo/buildPromptEn 분기
  • localStorage에 언어 설정 저장

13. 맵 재설계 (Central Park 스타일)

요청: "메인 공간이 너무 밀집되어 있어"

10가지 ASCII 드래프트 중 #8 "공원 중심형" 선택:

  • 상단에 큰 공원 (x=1050, y=515)
  • 두 줄 상가 (y=18, y=30)
  • 건물 간 8~10칸 간격
  • 나무는 공원과 외곽에만
  • 맵 크기 60x80

14. NPC 끼임 수정 & 분위기 말풍선

요청: "캐릭터가 건물에 끼여서 안 움직여" / "...이 이상해"

  • 30프레임 이상 못 움직이면 랜덤 방향 탈출
  • "..." → 분위기 이모지 (🎵 ♪ ㅎㅎ 와 😊 😔)

15. 기타

  • 플레이어 자동 앉기: 벤치 근처 5초 정지 → 앉기
  • NPC 깨우기: E키로 자는 NPC 깨우기 ("음... 뭐야...")
  • NPC 선제적 말 걸기: 근처 + 15% 확률로 먼저 인사
  • 대화 자동 종료: 작별 패턴 감지 → 2.5초 후 세션 종료
  • 건물 NPC 겹침 수정: npcSpots 위치에 분산 배치
  • 도움 요청 빈도 감소: 자동 시스템 제거, LLM 부탁만
  • 반투명 말풍선: backdrop-blur 유리 느낌
  • 술래잡기 역전: NPC가 술래, 쿨다운 제거

숫자로 보는 세션

  • 삭제: ~1,200줄
  • 추가: ~1,500줄
  • 새 파일: 1개 (i18n.js)
  • 커밋: 15+개
  • 팀원: 3명 병렬 투입 (i18n-infra, i18n-server, map-layout)

코드의 방향이 "게임"에서 "살아있는 마을"로 완전히 전환된 세션이었습니다.