하루 동안 정체성 확립부터 전면 리뉴얼까지 진행한 대규모 세션의 기록입니다.
1. 세계 정체성 확립
요청: "이 오픈월드의 정체성을 뭐로 가져가야 할지 모르겠다"
4가지 방향(디지털 어항, 마을 도슨트, 느린 삶의 마을, 작은 생태계)을 분석하고, Stanford AI Town, Animal Crossing, Kind Words 등을 참고하여 "느린 삶의 마을 + 도슨트 온보딩 + 관조 모드" 를 선택했습니다.
"어떤 개발자의 홈페이지에 들어갔더니, 작은 마을이 살아 숨쉬고 있었다. 주민들이 나를 기억해줬다."
CLAUDE.md에 핵심 원칙 6가지를 기록했습니다.
2. 게이미피케이션 대청소 (~880줄 삭제)
요청: "정체성에 안 맞는 기존 시스템들 정리해줘"
| 제거 | 이유 |
|---|---|
| 코인 경제 | 화폐는 거래지, 관계가 아님 |
| 카드 수집 (40+ 참조) | 가챠/스탯 보너스는 느린 삶과 반대 |
| 업적 시스템 | 마일스톤은 체크리스트, 체험이 아님 |
| 상점 시스템 | NPC를 상인이 아닌 이웃으로 |
| 긴급 이벤트/챌린지 | 타이머 긴장감은 느린 삶에 반함 |
| 스토리 아크 | 강제 서사 대신 자연스러운 기억 |
| 동적 퀘스트 자동생성 | LLM 부탁 시스템으로 대체 |
| 호감도 숫자/하트 UI | 관계는 태도로 체감 |
아이템은 선물용으로 유지. 시작 시 퀘스트 없음.
3. 서울 실시간 동기화
요청: "시간은 서울 시간으로, 날씨도 서울 날씨로"
- 시간:
new Date()→Asia/SeoulKST 고정. 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=10
50, 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)
코드의 방향이 "게임"에서 "살아있는 마을"로 완전히 전환된 세션이었습니다.