Devlog #13에서 정한 정체성 — "느린 삶의 마을" — 을 코드로 옮기는 작업을 시작했습니다.
룰 베이스 대화 제거
기존에 NPC에게 E키로 말을 걸면 4가지 고정 대사 중 하나가 나왔습니다. AI NPC인데 정해진 말만 하는 건 어색했습니다.
변경: E키 인터랙션에서도 LLM이 인사를 생성합니다. LLM 서버가 안 되면 NPC가 "나 말하는 법을 까먹은 거 같아..."라고 합니다. 이것도 세계관의 일부.
npcSmallTalk, detectTopic, npcReply — 모두 사용되지 않는 룰 베이스 코드를 정리했습니다.
감정 분석 전환
기존: 플레이어 메시지를 regex로 분석 → 호감도 변동. 변경: NPC의 LLM 응답 텍스트를 분석. AI가 맥락을 이해하고 답했으므로, NPC가 따뜻하게 답하면 좋은 인터랙션, 차갑게 답하면 나쁜 인터랙션으로 판단합니다.
NPC 말풍선 개선
혼잣말 시스템
- 가장 가까운 NPC → LLM으로 혼잣말 생성 ("날씨 좋다...", "배고프네..." 같은 10자 이내 한마디)
- 나머지 NPC → "..." 말풍선 (생각에 잠긴 느낌)
NPC끼리 대화
플레이어 근처(12칸)에서 NPC 2명이 만나면 LLM으로 서로 주고받는 대화를 생성합니다. 멀리 있으면 "..." 말풍선만.
채팅 → 말풍선 연동
채팅창에서 보낸 메시지가 플레이어 머리 위에, NPC 응답이 NPC 머리 위에 말풍선으로 뜹니다. 세상 안에서 대화가 일어나는 느낌.
반투명 말풍선
불투명했던 말풍선을 반투명 + backdrop-blur로 변경. 세상의 풍경이 비치는 유리 느낌.
시간 시스템: 현실과 1:1
기존: 매 접속마다 오전 8시 시작, 실제 1초 = 게임 14분.
변경: new Date()로 현재 실제 시간에서 시작, dt / 60으로 1:1 동기화. 지금 밤이면 게임도 밤. 세상은 내가 없어도 돌아가고 있었다는 느낌.
퀘스트 → 부탁 시스템
기존: 시작하자마자 "이웃의 실타래" 퀘스트가 떠있었습니다. 변경: 시작 시 퀘스트 없음. 배너 숨김.
대신 NPC가 대화 중 자연스럽게 부탁합니다. LLM 프롬프트에 부탁 시스템을 넣었습니다:
- 관계가 "아는 사이" 이상일 때
- 대화 흐름이 자연스러울 때
- NPC가
[부탁:bring_item:coffee]같은 태그를 응답에 포함 - 클라이언트가 태그를 파싱해서 favor request로 전환
- 플레이어에게는 태그가 보이지 않음
"혹시 커피 한 잔 구해다 줄 수 있어?" — 이게 퀘스트가 아니라 친구의 부탁처럼 느껴지는 게 목표입니다.
서버 프롬프트 개편
buildPrompt()를 전면 개편했습니다:
- "오픈월드 시뮬레이션 게임의 NPC" → "작은 마을에 사는 주민"
- 관계 단계(낯선 사이~소울메이트)에 따른 태도 지침 추가
- 부탁 시스템 지시 포함
favorLevel을 payload에 추가해서 서버가 관계를 인지
기타
- 술래잡기 쿨다운 제거 (즉시 재도전)
- 도움 요청(favor request) 빈도 대폭 줄임 (쿨다운 5분, 확률 1/4, 동시 최대 2개)
- NPC 대화 마무리 시 자동 세션 종료 (작별 패턴 감지 → 2.5초 후 포커스 해제)