Skip to content

[제안] 세계 상태와 사건의 결과에서 이어지는 NPC 의뢰와 이야기 #182

Description

@GONGJI-KIM

[제안] 세계 상태와 사건의 결과에서 이어지는 NPC 의뢰와 이야기

제안 요약

세계의 변화가 NPC의 목표를 만들고, 플레이어의 선택과 사건의 결과가 다음 이야기로 이어지는 의뢰 시스템을 제안합니다.

횃불이 없는 경비병은 물품을 부탁할 수 있습니다. 길목의 도적 세력이 강해지면 경비대는 토벌을 모집하고, 상인은 운송 방법을 바꿀 수 있습니다. 토벌이 끝난 뒤에는 그 결과로 생긴 필요를 LLM이 해석해 후속 의뢰를 제안합니다.

구현은 개인 수요 → 지역의 공유 사건 → 결과에 따른 후속 이야기 순서로 진행합니다. 첫 MVP는 기존 거래를 활용하는 Karl의 횃불 조달이며, 다음 단계에서 지역 토벌과 LLM의 후속 의뢰 생성을 검증합니다. 각 단계는 같은 사건·계약·결과 기록을 확장합니다.

플레이어가 남긴 결과를 NPC가 받아들이고, 그 변화에서 다음 행동과 이야기가 발생하는 세계를 만들고자 합니다.

문제 제기

퀘스트는 플레이어에게 할 일을 제공하지만, 의뢰의 원인과 결과가 실제 세계와 연결되지 않으면 NPC는 정해진 임무를 반복해서 전달하는 역할에 머물기 쉽습니다. LLM으로 대화를 자연스럽게 만드는 것만으로는 이 문제가 해결되지 않습니다.

이 제안은 다음 여덟 가지 설계 문제에서 출발합니다. 현재 OpenMMO에 각 문제가 그대로 존재한다는 뜻은 아니며, 기존에 해결한 부분과 추가할 부분은 뒤의 현재 구현과 추가할 기능에서 구분합니다.

1. 처음 만난 플레이어에게 중요한 일을 맡길 근거가 있는가?

NPC가 처음 보는 플레이어에게 가족의 구조나 비밀이 걸린 일을 맡긴다면, 왜 그 사람을 선택했는지 설명할 수 있어야 합니다. 플레이어에게도 위험을 감수할 이유가 필요합니다.

개인적인 친분만이 답은 아닙니다. 긴급한 상황, 확인된 능력, 길드의 보증도 근거가 될 수 있습니다. 신뢰와 이해관계가 의뢰의 대상과 조건에 반영되어야 합니다. 그렇다고 신규 플레이어가 흥미로운 사건에 참여하기 위해 사소한 심부름만 반복하게 해서도 안 됩니다.

2. 누군가 해결한 사건이 다른 플레이어에게는 왜 그대로 남아 있는가?

플레이어 A가 NPC의 딸을 구출했는데, 같은 공유 세계의 플레이어 B에게는 여전히 구출 의뢰가 남아 있다면 사건의 결과를 믿기 어렵습니다. 개인별 진행에는 편리하지만, 하나의 세계를 함께 바꾼다는 경험과 충돌할 수 있습니다.

공유 사건의 해결은 공유 결과로 남아야 합니다. 동시에 늦게 온 플레이어가 모든 기회를 놓치지 않도록 남은 단계나 다른 사건에 참여할 방법도 필요합니다. 대상의 이름만 바꿔 같은 임무를 생성하는 것으로는 반복 문제를 해결할 수 없습니다.

3. NPC에게 정말 필요한 일인가, 퀘스트를 위해 붙인 설명인가?

상인이 식량 운송을 부탁하더라도 실제 재고, 구매 자금, 공급처가 없다면 ‘식량이 부족하다’는 말은 배경 설명에 그칩니다. 납품 후에도 같은 부탁을 계속한다면 플레이어가 무엇을 해결했는지 알기 어렵습니다.

필요가 의뢰를 만들고, 필요가 채워지면 의뢰가 끝나야 합니다. 개발자는 구매·이동·고용 같은 행동과 결과의 규칙을 만들고, NPC는 실제 상태에 맞춰 그 방법을 선택하도록 합니다.

4. 플레이어가 참여하지 않으면 NPC는 계속 기다려야 하는가?

해결이 필요한 문제라면 NPC에게도 기다릴 수 있는 시간과 다른 선택지가 있어야 합니다. 아무도 의뢰를 받지 않았다는 이유로 모든 활동이 멈추면 NPC의 목표가 플레이어 접속 여부에 종속됩니다.

모집 기한과 실행 가능한 대안이 필요합니다. 다만 NPC가 늘 최선의 결과를 혼자 만들면 참여 동기가 약해지고, 무참여가 매번 재앙으로 이어지면 접속 의무처럼 느껴집니다. 참여했을 때의 이점과 참여하지 않았을 때의 결과를 함께 설계해야 합니다.

5. 실패가 NPC의 다음 행동을 바꾸는가?

실패할 때마다 NPC를 없애거나 퀘스트를 처음부터 되돌리면 관계와 경험이 쌓이기 어렵습니다. 반대로 아무 변화가 없다면 실패의 의미가 사라집니다.

실패는 손실·지연·부상 같은 상태 변화와 다음 계획으로 이어져야 합니다. 같은 위험을 피하거나 준비를 강화할 근거가 남아야 하며, NPC가 회복하거나 다른 방법을 찾을 경로도 필요합니다. 첫 MVP에서는 납품 실패 후 직접 구매로 전환하고 그 결과를 기록하는 것부터 검증합니다.

6. 플레이어가 다른 해결책을 제안해도 실제로 달라지는가?

“직접 가지 말고 다른 상인에게 사면 어떨까요?”라는 제안에 NPC가 말로만 동의하고 원래 행동을 계속한다면, 대화의 자유도와 게임의 실제 가능성 사이에 간극이 생깁니다.

지원하는 제안은 계획과 실행을 바꿔야 합니다. 지원하지 않는 방법은 그 한계를 설명해야 합니다. 또한 다른 플레이어가 이미 일을 맡았다면 새 제안을 받아들이더라도 기존 계약을 지켜야 합니다.

7. LLM의 말과 게임이 보장하는 사실이 다르면 무엇을 믿어야 하는가?

NPC가 없는 돈을 보수로 약속하거나, 물품을 받지 않았는데 받았다고 기억한다면 거래와 세계 상태의 신뢰가 무너집니다. 그럴듯한 대화와 검증된 완료는 서로 다릅니다.

LLM의 제안은 서버의 검증을 거쳐야 하며, 확정된 결과가 대화와 화면에 반영되어야 합니다. 계약 체결, 자원 이동, 보상 지급과 이행 기록은 서버가 보장하고, LLM은 그 범위에서 판단과 표현을 담당합니다.

8. 사건을 끝낸 뒤에도 그 결과가 다음 이야기에 남는가?

도적을 몰아냈는데 상인은 계속 길이 위험하다고 말하거나, 토벌에 실패했는데 아무 변화 없이 같은 의뢰가 다시 나타난다면 성공과 실패의 차이가 약해집니다. 대화에서만 지난 일을 언급하는 것으로는 충분하지 않습니다.

사건이 바꾼 자원·치안·인물·관계가 다음 목표의 원인이 되어야 합니다. 길이 열려 운송을 재개할 수도 있고, 실패로 기존 계획을 포기하고 다른 조달 방법을 찾을 수도 있습니다. 후속 의뢰가 없어도 평온한 일상으로 돌아가는 결말은 유효합니다.

제안의 전체 구조

현재 프로젝트에는 LLM이 조종하는 NPC, 실제 지갑과 인벤토리, 구매 희망 목록, 호감도와 기억이 구현되어 있습니다. NPC가 물건을 부탁하고 거래하는 기반은 이미 마련되어 있습니다.

의뢰의 출발점을 NPC의 물품 부족에 한정하지 않습니다. 개인의 필요, 지역의 문제, 앞선 사건의 결과를 같은 흐름으로 연결합니다.

출발점 NPC가 인식하는 문제 의뢰의 예
개인 상태 경비병에게 필요한 횃불이 없음 횃불 납품
지역 상태 동쪽 길에서 도적의 활동이 심해짐 토벌, 정찰, 운송 호위
앞선 사건의 결과 토벌 후 빼앗겼던 화물을 회수함 화물 주인에게 반환
앞선 사건의 결과 토벌 실패로 기존 운송 계획이 중단됨 다른 조달 방법에 필요한 협력
flowchart TD
    A[개인·지역의 실제 상태] --> B[NPC가 목표와 계획을 선택]
    B --> C[필요한 협력을 의뢰]
    C --> D[참여·제안·무참여에 따라 행동]
    D --> E[서버가 결과와 상태 변화를 확정]
    E --> F[LLM이 영향을 받은 NPC와 남은 문제를 해석]
    F --> G{실행할 수 있는 후속 필요가 있는가?}
    G -->|있음| H[서버 검증 후 새 목표와 의뢰 반영]
    H --> B
    G -->|없음| I[결말과 일상 유지]
Loading

개발자는 구매·납품·처치·이동 같은 행동과 결과의 규칙을 구현합니다. LLM은 그 범위에서 NPC의 목표와 후속 전개를 제안합니다. 새 목표는 NPC가 스스로 수행할 수도 있으며, 다른 참여자의 도움이 필요할 때 의뢰로 공개합니다.

지역 토벌은 여러 사람이 함께 세계를 바꾸는지, 후속 이야기 생성은 그 변화가 다음 사건의 원인이 되는지를 검증하는 핵심 단계입니다.

현재 구현과 추가할 기능

아래 내용은 2026-09-13, 커밋 daa45867 기준으로 코드와 관련 테스트를 읽어 확인했습니다. 게임 실행과 테스트 실행을 통한 검증은 이번 검토에 포함하지 않았습니다.

영역 현재 구현 이번 제안에서 추가할 기능
NPC 행동 LLM의 말하기·이동·구매·판매·흥정 등을 서버 명령으로 변환 의뢰 조회, 계약 처리, 해결 방법과 후속 목표 선택
주민 거래 실제 지갑·인벤토리, 구매 희망 목록, 월급과 지갑 상한 필요 수량, 중복 모집 방지, 수요 종료
관계와 기억 플레이어별 호감도 favor, 회상용 기억 파일 서버가 확인한 계약 이행과 실패 기록
일과표 시간·조건별 행동, Karl의 순찰 경로 조달을 위한 순찰 중단과 완료 후 복귀
거래와 저장 서버의 거래 검증, 캐릭터 저장, 플레이어 거래의 일괄 정산 계약·보상 예약·정산 이력의 저장과 복구
시간과 호출 제어 세계 시간 저장, LLM 호출 우선순위·동시성·시간 제한 사건 기한과 LLM 장애 시 대안 실행
화면 NPC 메뉴, 대화, 거래창과 제안 알림 의뢰 원인·수량·기한·진행 상태·결과 표시
전투와 출현 서버 처치 판정, 플레이어 이동 거리에 따른 일반 몬스터 출현 지역·세력·사건에 속한 병력, 영향력, 처치 결과와 지역 변화의 연결
사건의 연속성 개별 행동 결과와 회상용 기억 원인 사건·상태 변화·남은 문제의 기록, 후속 후보 생성과 검증

현재 기능을 확장할 때는 다음 차이를 구분해야 합니다.

  • 구매 희망 목록은 수량이 정해진 의뢰와 다릅니다. 에이전트는 이미 가진 물품을 대화에서 덜 제안하지만, 서버에는 이 제안에서 필요한 목표 수량과 사건 종료 상태가 없습니다.
  • 호감도와 계약 이행은 다른 정보입니다. LLM이 갱신하는 favor나 기억 파일을 보상 지급의 증거로 사용하지 않습니다.
  • 흥정은 장기 계약과 다릅니다. OfferDeal은 제한 시간 동안 사용할 수 있는 단품 가격 제안입니다. 담당자·납품 기한·보상 예약을 가진 계약은 별도로 필요합니다.

기존 주민 거래에는 물품을 받고 대금을 지급하는 과정이 구현되어 있습니다. 여기에 필요 수량, 참여자, 기한, 완료 조건을 연결하는 Karl의 횃불 조달을 첫 사례로 삼습니다. 이 계약 기반을 지역 토벌에 확장하고, 두 사건의 결과를 LLM이 후속 목표의 근거로 읽도록 연결합니다.

1단계 MVP: Karl의 횃불 조달

Karl을 선택한 이유

Karl은 현재 횃불과 단검을 기본가의 120%에 매입합니다. 횃불의 기본가는 50구리, 흥정이 없는 기본 매입액은 60구리입니다.

기존 주민 거래 테스트에는 플레이어의 횃불을 Karl의 인벤토리로 옮기고, Karl의 지갑에서 60구리를 지급하는 사례가 있습니다. 이 경로를 출발점으로 삼으면 새 아이템이나 상점 없이 의뢰를 검증할 수 있습니다.

플레이 흐름

  1. Karl이 횃불을 가지고 있지 않으면 수요가 발생합니다.
  2. 지급할 돈을 확보한 뒤, 횃불 1개를 구하는 의뢰를 게시합니다.
  3. 플레이어가 수락하고 기한 안에 납품하면 60구리를 지급합니다.
  4. 아무도 수락하지 않거나 계약이 실패하면 Karl이 Rica에게 직접 구매합니다.
  5. 실제 횃불 확보를 확인하고 사건을 종료합니다. 직접 구매했다면 순찰로 복귀합니다.
flowchart TD
    A[횃불 부족 감지] --> B{모집할 자금 확보?}
    B -->|가능| C[납품 의뢰 게시]
    B -->|불가능| D[직접 구매 가능 여부 확인]
    C -->|수락| E[계약 진행]
    C -->|모집 만료 또는 직접 구매 제안| D
    E -->|기한 내 납품| F[물품 인수와 보상 정산]
    E -->|기한 초과 또는 포기| D
    D -->|구매 가능| G[Rica에게 이동해 구매]
    D -->|구매 불가| H[조건 변경까지 대기]
    H -->|자금·영업·경로 변경| D
    F --> I[사건 종료와 결과 저장]
    G -->|획득 확인| I
    G -->|구매 실패| H
    I --> J[순찰 유지 또는 복귀]
Loading

플레이어는 대화로 **“Rica에게 직접 사는 게 어때?”**라고 제안할 수도 있습니다. 서버가 현재 계약과 구매 조건을 확인한 뒤 계획을 바꿉니다. 이미 수락된 계약은 제안만으로 취소되지 않습니다.

초기 규칙

아래 금액과 기한은 플레이테스트를 위한 제안값입니다. 화폐와 시간은 기존 시스템을 사용합니다.

항목 제안값 또는 규칙
목표 Karl이 횃불 torch 1개를 보유
발생 조건 가방·장비에 사용 가능한 횃불이 없고, 같은 목표의 활성 사건도 없음
참여자 한 명. 신규 플레이어도 접근할 수 있는 공개 의뢰
지급액 물품 대금 포함 총 60구리, 선불 없음
납품 물품 강화되지 않은 torch 1개
공급처 기존 Rica 상점. 기본 구매가 50구리
모집 기한 사건 발생 후 게임 시간 1시간
수행 기한 사건 발생 후 게임 시간 3시간. 수락 시각과 무관하게 표시
미참여·실패 시 Karl의 직접 구매로 전환
종료 조건 실제 물품 확보와 필요한 정산을 확인한 뒤 종료

현재 게임 하루는 현실 3시간입니다. 모집 기한은 현실 7분 30초, 수행 기한은 현실 22분 30초에 해당합니다. 개발 테스트에서는 별도의 짧은 기한이나 통제된 시계를 사용합니다.

지급할 60구리가 없으면 의뢰를 게시하지 않습니다. 직접 구매 비용을 감당할 수 있다면 구매를 시도하고, 그것도 불가능하면 자금이나 구매 조건이 바뀔 때까지 기다립니다.

플레이어의 선택이 만드는 차이

방법 Karl의 변화 플레이어의 경험
플레이어 납품 60구리를 지출하고 순찰을 계속함 정가로 준비했다면 10구리 차익과 계약 이행 기록을 얻음
Karl의 직접 구매 기본 50구리를 지출하고, 구매를 위해 순찰을 잠시 중단함 자신의 제안이나 무참여에 따라 NPC가 다른 행동을 하는 모습을 봄

첫 MVP에서는 Karl의 지출과 순찰 중단·복귀를 통해 선택의 결과를 확인합니다. 10구리의 차익이 이동 시간에 비해 충분한 동기가 되는지도 함께 검증해야 합니다.

이번 MVP에서 검증할 범위

Karl 한 명이 횃불 한 개를 확보하는 사건을 끝까지 구현합니다. 계약은 한 플레이어가 정해진 보수와 기한으로 맡고, 해결 방법은 플레이어의 납품과 Karl의 직접 구매 두 가지로 구성합니다.

이 범위에서 필요가 의뢰로 이어지고, 참여 여부에 따라 행동이 달라지며, 결과가 저장되는지를 확인합니다. 횃불을 확보하면 사건은 종료됩니다. 이미 횃불을 가진 Karl에게는 같은 의뢰가 발생하지 않으며, 새로운 의뢰는 다시 물품이 필요해지는 원인이 생겼을 때 다룹니다.

2단계 MVP: 지역 상태에서 발생하는 토벌 의뢰

같은 지역 문제를 NPC마다 다르게 받아들입니다

예를 들어 동쪽 길의 도적 영향력 100/100은 그 지역에서 도적이 통행을 위협하는 정도를 나타냅니다. 경비대는 안전을 확보하려 하고, 상인은 물품을 운송하려 합니다. 같은 상태라도 각자의 역할에 따라 필요한 행동이 달라집니다.

NPC 목표 선택할 수 있는 방법
경비대 길의 위협을 줄임 도적 토벌, 거점 정찰, 순찰 강화
상인 물품을 목적지로 운송 호위 모집, 우회, 운송 연기
주민 길 너머의 가족이나 물품에 접근 동행 요청, 필요한 물품의 대리 조달

2단계에서는 이 중 한 지역의 토벌 사건을 구현합니다. 영향력이 높아지면 모집하고, 실제 처치로 영향력이 낮아지면 모집을 끝냅니다. 영향력 감소는 같은 지역을 방문한 모든 플레이어에게 적용됩니다.

영향력과 처치의 관계

아래 수치는 첫 검증을 위한 예시입니다. 처음에는 영향력을 해당 지역의 적 병력으로 단순하게 계산하고, 거점·보급·주민 피해 같은 요인은 이후에 추가합니다.

항목 초기 제안
적용 범위 동쪽 길로 지정한 한 지역
영향력 해당 세력의 활동 가능한 병력 1개체당 10, 최대 100
모집 시작 영향력 70 이상이고 같은 문제의 활성 사건이 없을 때
목표 달성 영향력 30 이하로 감소
감소 조건 해당 지역·세력에 소속된 병력의 사망을 서버가 확정
종료 시점 목표 달성 또는 사건에 명시된 작전 기한 도달
결과 판정 목표 달성은 성공, 기한 종료 시 시작보다 낮지만 목표 미달이면 부분 성공, 그 외에는 실패
실제 효과 해당 병력의 재출현을 막고, 감소한 병력에 맞춰 지역의 적 출현 기회를 줄임
회복 원인 증원 등 별도 규칙으로 확정된 병력 유입. 사건 종료만으로 초기화하지 않음

실패 후 영향력이 여전히 높다는 이유만으로 같은 토벌을 즉시 다시 게시하지 않습니다. 다음 작전에는 병력·피해·가용 지원의 유의미한 변화나 검증된 새 계획이 필요하며, 재모집 간격과 예산도 확인합니다. 어떤 변화가 재도전을 가능하게 했는지 기록합니다.

처치 기반 계약에는 ‘지정된 도적 N명 처치’를 사용할 수 있습니다. 지역의 목표는 위협 감소이고, 처치 수는 참여자의 수행 조건입니다. 하나의 죽음이 지역 영향력에 미치는 효과는 한 번만 계산하고, 파티원별 보상은 별도의 기여 규칙에 따라 계산합니다.

계약을 받지 않은 플레이어의 처치도 실제 병력 감소라면 지역에 반영합니다. 계약 보상을 받을 자격은 별도로 확인합니다. 다른 플레이어의 활약으로 목표가 먼저 달성되면 신규 모집을 끝내고, 진행 중인 계약은 미리 표시한 조기 종료·기여 정산 규칙으로 처리합니다. 없어져 버린 대상을 계속 처치하라고 요구하지 않습니다.

현재 몬스터 출현 방식과 연결할 때 필요한 작업

현재 일반 몬스터 출현은 플레이어가 이동한 거리에 따라 판정됩니다. 이 출현 개체 수를 그대로 세력 규모로 사용하면, 사람이 많이 다니는 것만으로 도적 영향력이 높아질 수 있습니다.

따라서 지역이 보유한 병력과 플레이어 주변에 표현된 몬스터를 구분합니다. 한 병력을 여러 플레이어에게 중복 생성하지 않고, 화면 밖으로 나가거나 연결이 끊겨 표현이 제거되어도 처치로 계산하지 않습니다. 다시 표현할 때는 살아 있는 같은 병력 기록을 사용합니다. 서버가 확정한 처치만 그 병력을 제거합니다.

기존 전투 코드의 처치 판정을 활용하되, 지역·세력·병력 ID와 지속 상태는 추가해야 합니다. ‘도적’은 이번 설계의 예시 세력명이며, 현재 도적 세력이 구현되어 있다는 뜻은 아닙니다. 초기 테스트에는 기존 적 모델을 활용하고 사건 소속을 별도 데이터로 지정합니다.

화면에는 지역의 위협 수준, 모집 이유, 작전 기한, 개인 계약 진행과 공유 사건 결과를 구분해 표시합니다. 토벌 후 실제로 적과 덜 마주치는지까지 확인해야 합니다.

3단계 MVP: 사건 결과에서 후속 이야기를 자동 생성

성공과 실패가 다음 이야기의 원인이 됩니다

서버가 사건 결과를 확정하면 LLM은 어떤 NPC가 영향을 받았고, 무엇이 해결되거나 새로 필요해졌는지를 해석합니다. 그 결과로 후속 목표와 의뢰를 제안합니다.

확정된 사건 결과 남은 변화 또는 필요 가능한 후속 이야기
토벌 성공으로 길의 위협이 낮아짐 상인이 보류했던 운송을 재개할 수 있음 보관 중인 화물의 운송 의뢰
토벌 중 빼앗긴 화물을 회수함 화물이 아직 주인에게 돌아가지 못함 회수품 반환 의뢰
일부 병력이 인접 지역으로 실제 이동함 인접 지역의 위협이 커짐 해당 지역의 정찰이나 대응 요청
토벌 실패로 운송 중단이 이어짐 기존 구매 계획으로는 물품을 구하기 어려움 다른 공급처를 이용하는 조달 의뢰
부상이나 장비 손실이 실제로 발생함 회복과 재정비가 필요함 치료 물품 조달이나 장비 회수 의뢰

이 표는 확장 가능한 전개의 예입니다. 화물·부상·도주가 기록되지 않았다면 LLM이 이를 이미 일어난 일로 취급해서는 안 됩니다. 새 전개를 만들 필요가 있다면 지원되는 세계 행동으로 제안하고, 서버가 검증해 실제 상태에 반영한 뒤에 후속 이야기의 근거로 사용합니다.

LLM에 전달할 사건 기록

도적 영향력: 40이라는 현재 수치만으로는 이야기의 맥락을 알기 어렵습니다. 토벌로 100에서 낮아졌는지, 외부 병력이 들어와 20에서 높아졌는지에 따라 다음 판단이 달라져야 합니다.

기록 예
사건과 원인 동쪽 길 토벌, 원인이 된 지역 위협 기록
목표와 결과 영향력 30 이하 / 작전 기한 종료 시 부분 성공
전후 상태 영향력 100 → 40
관련 인물과 정보 경비대, 피해 상인, 각 NPC가 확인한 소식과 출처
참여와 기여 어떤 플레이어가 어느 계약에서 무엇을 수행했는지
남은 문제와 약속 계속 보류 중인 운송, 아직 유효한 계약
사용 가능한 수단 지원되는 행동, 현재 자원·예산·장소·참여자

후속 사건에는 원인이 된 사건 ID를 남깁니다. 여러 사건이 같은 문제를 만들면 원인들을 연결하고 중복 의뢰를 합칩니다. 화면과 NPC 대화에서도 “지난 토벌로 길이 열려 운송을 다시 시작한다”처럼 연결 이유를 알 수 있어야 합니다.

개인 계약의 실패와 공유 사건의 실패는 다릅니다. 내가 포기했더라도 다른 파티가 목표를 달성했다면 지역 사건은 성공입니다. 지역의 후속 이야기는 공유 결과에서, 개인 신뢰 변화는 해당 플레이어의 실제 이행 기록에서 시작합니다.

후보 생성부터 게시까지 자동으로 처리합니다

LLM은 후속 후보마다 원인 사건, 의뢰자, 목표, 대상·수량, 실행 방법, 보상·기한, 성공 조건, 무참여 대안을 제안합니다. 대상과 장소는 실제 ID로 연결합니다.

서버는 다음 순서로 검증합니다.

  1. 원인 사건과 상태 변화가 실제 기록인지 확인합니다.
  2. 해당 NPC의 역할·소유권·피해·물품 부족 등 정의된 조건과 연결되는 목표인지, 제안한 방법이 구현되어 있는지 확인합니다. 자유로운 설명 문장만으로 관련성을 인정하지 않습니다.
  3. 대상·장소·자원·예산이 존재하고 기존 계약을 지킬 수 있는지 확인합니다.
  4. 같은 목표의 활성 사건, 중복 보상, 후속 생성 한도를 확인합니다.
  5. 확정 직전에 상태를 다시 확인하고 필요한 자원을 예약한 뒤 사건과 의뢰를 저장합니다.
  6. 저장된 조건으로 NPC의 계획과 화면을 갱신합니다.

조건을 통과하면 매번 사람의 승인 없이 게시할 수 있습니다. 통과하지 못한 후보에는 실패 이유를 반환하고, 수정 횟수를 제한합니다. 적절한 후보가 없으면 생성하지 않습니다. LLM 장애 때도 기존 사건·계약은 유지하고 기본 행동을 계속합니다.

후속 생성 작업은 원인 사건의 저장과 함께 기록합니다. 같은 완료 알림을 다시 받거나 서버가 재시작해도 같은 후속 의뢰가 중복 게시되지 않도록 합니다. NPC에게 필요한 정보만 전달하고, 플레이어의 주장은 확인된 사실과 구분합니다.

첫 자동 생성 실험은 한 단계의 후속 의뢰로 제한합니다

처음에는 원인 사건 하나당 새 후속 사건 최대 하나, 연결 깊이 한 단계로 검증합니다. 수량·대상·이유는 사건 기록에서 선택하고, 실행 방법은 먼저 완성한 납품 계약을 사용합니다.

  • 성공 후 실제 회수품과 소유자가 기록되어 있다면 반환 의뢰를 제안할 수 있습니다.
  • 실패 후 특정 NPC의 물품 부족이 기록되어 있다면, 기존 공급처에서 확보할 수 있는 품목의 납품 의뢰를 제안할 수 있습니다.
  • 필요한 사실이나 예산이 없으면 후속 의뢰 없이 종료합니다. 검증용 데이터에는 각 분기의 전제 조건을 명시적으로 준비합니다.

이를 통해 문장만 달라지는 생성이 아니라 이전 결과 때문에 대상·목표·행동이 달라지는 연결을 확인합니다. 이후 검증된 행동과 연결 깊이를 늘립니다.

후속 이야기는 항상 새로운 위기일 필요가 없습니다. 감사, 거래 재개, 관계 변화, 일상 복귀도 결과가 될 수 있습니다. 토벌에 성공할 때마다 더 큰 적을 만들어 이전 성취를 무효화하지 않습니다.

공통 설계 원칙

목표와 계약을 구분합니다

개념 의미 MVP의 예
목표 NPC가 달성하려는 상태 횃불 1개 확보
계획 목표를 달성하는 방법 플레이어에게 납품받기 또는 직접 구매하기
의뢰 참여자를 모집하는 제안 횃불을 가져올 사람 모집
계약 참여자와 조건이 확정된 약속 지정 기한까지 납품하면 60구리 지급
사건 원인부터 결과까지 묶은 진행 단위 이번 Karl의 횃불 조달

모집 중인 의뢰는 상황에 따라 철회할 수 있습니다. 이미 수락된 계약은 조건을 지킵니다. 다른 경로로 물품을 얻었더라도 진행 중인 계약을 조용히 삭제하지 않습니다. 횃불 MVP에서는 NPC의 일방 취소를 지원하지 않습니다. 지역 토벌에는 공동 목표가 먼저 달성될 경우의 조기 종료와 기여 정산을 계약 조건에 포함합니다.

서버가 약속과 결과를 보장합니다

LLM은 대화와 제안 해석을 담당합니다. 서버는 수량·자금·권한·기한을 확인하고, 계약 체결과 물품 이동, 보상 지급을 확정합니다.

계약의 수량·보상·기한은 서버 값으로 표시합니다. NPC도 확정된 결과를 바탕으로 설명해야 합니다. LLM이 지원하지 않는 행동을 실행했다고 말하거나, 아직 검증되지 않은 보상을 약속하지 않도록 합니다.

무참여와 실패도 다음 행동으로 이어집니다

NPC는 모집 기한이 지나면 다른 방법을 실행합니다. LLM 응답이 없더라도 이 흐름은 진행되어야 합니다.

실패 기록에는 결과와 원인을 함께 남깁니다. NPC 프로세스 중단처럼 플레이어가 통제할 수 없는 문제를 계약 위반으로 처리하지 않습니다. 플레이어의 참여는 더 나은 결과를 만들되, 모든 무참여가 큰 손해나 접속 의무로 이어지지 않도록 합니다.

세부 구현 규칙: 기존 거래·일과표·저장과 연결하는 방법

수요와 기존 거래

  • Karl의 횃불 매입에는 서버의 목표 수량을 적용합니다. 단건·일괄 매입이 같은 수요 상태를 확인해야 합니다.
  • 모집 중에는 의뢰 수락과 납품 경로로 안내합니다. 계약 체결 후에는 참여자의 지정 납품만 계약 정산으로 인정합니다.
  • 일반 매입액과 계약 보상을 이중 지급하지 않습니다. 계약가에 OfferDeal을 중첩하지 않습니다.
  • 물품 잠금, 다른 거래의 예약, 운반 한도와 수량을 정산 직전에 다시 확인합니다.
  • 진행 중인 확보 계획의 물량도 고려해 중복 모집을 막습니다. 수락된 계약이 남아 있다면 먼저 정리하고 새 계획을 만듭니다.
  • 다른 품목의 기존 거래 규칙과 개인 거래의 호감도 기준은 유지합니다. 공개 의뢰는 별도의 서버 접근 규칙을 사용합니다.

보상 예약과 자금

  • Karl의 기존 지갑에서 지급액을 예약합니다. 예약한 돈은 다른 구매·매입·팁에 쓸 수 없게 합니다.
  • 예약액도 잔액의 일부로 계산해 기존 월급 누적 상한을 우회하지 않도록 합니다.
  • 성공 시 예약액을 지급하고, 실패·포기 시 해제하거나 직접 구매용으로 전환합니다. 구매 후 남은 차액은 해제합니다.
  • 현재 Karl의 하루 월급은 5,000구리, 누적 상한은 30,000구리입니다. 이 값은 사건마다 지급하는 초기 자금이 아닙니다.
  • NPC에게 제한된 플레이어 간 자유 교환이나 플레이어 좌판 구매를 우회하지 않습니다. 직접 구매에는 기존 상인 카탈로그 경로를 사용합니다.

직접 구매와 일과표

기존 buy 행동에는 상인에게 이동해 BuyItem을 보내는 기능이 있습니다. 여기에 일과표보다 우선하는 임시 조달 계획을 연결합니다.

  1. 순찰을 잠시 중단합니다.
  2. Rica에게 이동하고 서버가 검증한 구매를 실행합니다.
  3. 실제 인벤토리 변화를 확인합니다.
  4. 사건을 종료하고 순찰로 복귀합니다.

명령을 보냈다는 이유만으로 구매 성공으로 처리하지 않습니다. 전투·사망·상인 수면·경로 불가에는 대기 이유를 표시하고, 제한된 간격과 횟수로 재시도합니다. 재시도 전에는 이전 구매 결과를 확인해 중복 구매를 막습니다.

연결 종료와 저장

  • 사건·기한·계약은 서버가 관리합니다. 당사자는 세션 ID나 이름만이 아니라 저장되는 캐릭터 ID와 NPC 정의 ID로 식별합니다.
  • 플레이어가 재접속하면 같은 계약을 복원합니다. 연결 종료만으로 즉시 실패 처리하지 않습니다.
  • NPC 에이전트가 끊기면 직접 이동은 대기하고, 재접속 후 미완료 단계부터 이어갑니다.
  • 서버 기록상 납품 창구가 이용 불가능했던 시간에는 수행 기한을 연장합니다. 변경 기한과 이유를 플레이어에게 표시합니다.
  • 서버 중단 시간은 기존 세계 시간 저장·복원 정책을 따릅니다. 디버그 시간 점프에도 만료·정산은 한 번만 처리합니다.
  • 기존 commit_trade의 방식을 참고해 자원 변경·계약 상태·이행 기록을 같은 DB 트랜잭션으로 확정합니다. 중복 요청에도 한 번만 지급되어야 합니다.

기억과 LLM

기존 기억 파일과 favor는 대화에 활용하고, 계약 이행 여부는 서버 기록을 따릅니다. LLM은 확정 기록을 읽을 수 있지만 임의로 작성하거나 수정할 수는 없습니다.

기존 LLM 호출 큐와 시간 제한을 재사용합니다. 의뢰 상태를 프롬프트에 제공하고, 지원되는 제안만 서버 요청으로 변환합니다. LLM 장애 때도 UI를 통한 수락·납품·포기·직접 구매 제안과 기본 조달 흐름은 유지합니다.

구현 순서

세 MVP를 순서대로 연결합니다. 첫 단계의 계약과 정산을 안정화한 뒤, 같은 기반을 지역 사건과 후속 생성에 사용합니다.

단계 주요 작업 확인할 결과
1-A. 개인 수요 필요 수량, 사건 ID, 중복 방지, 기존 매입 경로와 연결 물품이 확보되면 추가 모집과 구매가 끝남
1-B. 계약과 정산 수락·납품·기한·보상 예약·이행 기록·화면·저장 동시 요청과 재접속에도 약속과 정산이 유지됨
1-C. 대안과 대화 직접 구매, 순찰 복귀, 자연어 제안, LLM 장애 대응 횃불의 모든 경로가 완료됨. 1단계 MVP 완료
2-A. 지역 상태 지역·세력·병력 기록, 영향력, 처치와 출현의 연결 처치로 실제 위협이 줄고 여러 플레이어가 같은 결과를 봄
2-B. 토벌 사건 모집·작전 기한·기여·조기 정산·결과 저장 개인 계약과 공유 결과를 구분해 종료. 2단계 MVP 완료
3-A. 결과와 원인 기록 전후 상태, 영향을 받은 NPC, 남은 문제, 원인 사건 ID, 생성 작업 기록 사건 결과가 재시작 후에도 후속 생성의 근거로 유지됨
3-B. 후속 생성 LLM 후보, 서버 검증, 중복 방지, 자원 예약, 한 단계 게시 성공·실패에 따른 후속 의뢰 또는 정상 종료. 3단계 MVP 완료

완료 기준

1단계: 개인 수요와 계약

  • Karl에게 횃불이 없을 때만 의뢰가 발생하고, 같은 목표가 중복 생성되지 않는다.
  • 정상 납품, 무참여, 기한 초과, 직접 구매 제안이 실제 아이템·지갑 변화로 이어진다.
  • 단건·일괄 매입과 계약 납품을 함께 이용해 초과 매입이나 이중 보상을 받을 수 없다.
  • 동시 수락은 한 명만 성공하고, 중복 납품·구매 요청은 한 번만 정산된다.
  • 다른 지출을 해도 예약된 보수가 보존되고, 계약 종료 후 불필요한 예약이 남지 않는다.
  • 기한 만료와 납품이 겹쳐도 하나의 결과만 확정된다.
  • 재접속·서버 재시작·NPC 에이전트 재시작 후 계약과 조달 상태가 복원된다.
  • 저장 실패 시 완료를 알리거나 일부 자원만 확정하지 않는다.
  • LLM 없이도 무참여 대안이 실행되고, Karl이 구매 후 순찰로 복귀한다.
  • 기존 주민 거래·흥정·지갑 상한·장비 보호 기능이 유지된다.
  • 화면에서 원인, 수량, 보상, 기한, 진행 상태와 결과를 확인할 수 있다.
  • 플레이어가 의뢰의 원인과 자신의 선택이 바꾼 결과를 설명할 수 있다.

2단계: 지역 상태와 토벌

  • 같은 지역·세력의 문제가 여러 NPC에게 전달되어도 중복 토벌 사건이 생성되지 않는다.
  • 서버가 확인한 대상 병력의 처치만 영향력에 한 번 반영된다.
  • 화면 밖 정리·연결 종료·재출현으로 영향력을 낮추거나 처치 보상을 중복 획득할 수 없다.
  • 비참여자의 처치도 지역에 반영하되 보상은 계약·기여 규칙에 따라 지급한다.
  • 영향력 감소가 해당 세력의 실제 출현 감소로 이어지고, 재접속 후에도 유지된다.
  • 성공·부분 성공·실패와 개인 계약의 결과가 각각 기록된다.
  • 공동 목표 조기 달성 시 신규 모집이 끝나고 진행 중인 계약이 약정대로 정산된다.
  • 무참여 시 작전 기한에 결과가 확정되고, 병력과 영향력이 임의로 초기화되지 않는다.

3단계: 결과에 따른 후속 이야기

  • 실제 전제가 준비된 성공·실패 사례에서 서로 다른 필요를 반영한 후속 의뢰가 실행된다.
  • 모든 후속 사건이 원인 사건과 연결되고, 플레이어가 연결 이유를 이해할 수 있다.
  • 존재하지 않는 인물·물품·장소·미확인 사건을 전제로 한 후보는 게시되지 않는다.
  • 자금 부족·조건 변경·기존 계약 충돌 시 검증이 실패하고 자원과 약속이 보존된다.
  • 생성 요청 재전송·저장 실패·서버 재시작에도 같은 후속 의뢰가 중복 게시되지 않는다.
  • 첫 실험의 생성 수·연결 깊이·호출 및 수정 횟수 한도가 지켜진다.
  • 유효한 후보가 없거나 LLM이 실패해도 기존 사건의 결과가 보존된다.
  • 추가 의뢰 없이 일상으로 돌아가는 결말도 정상적으로 처리된다.

기존 거래 테스트에 수요 제한·예약·동시 요청·저장 실패·복구 사례를 추가합니다. 전투에는 처치·병력·영향력의 일관성을, 에이전트에는 조달 전환과 후속 후보 검증을 추가합니다. 실제 플레이에서는 단계별 소요 시간, 선택 이유, 지역 변화와 이야기 연결의 인지 여부를 확인합니다.

반복 테스트는 별도의 캐릭터와 초기 상태에서 진행합니다. 운영 NPC의 자원을 삭제해 의뢰를 다시 만들지 않습니다.

세 MVP 이후의 확장 방향

순서 확장 내용 먼저 확인할 것
1 직업 활동에 따른 반복 수요 실제 사용·소모·손실이 새로운 필요로 이어지는가
2 장기 신뢰와 위험 경험 여러 사건에서 쌓인 경험이 다음 조건과 판단을 바꾸는가
3 마을 식량과 지역 조달 개인의 행동이 지역 재고·비용·일정에 영향을 주는가
4 호위와 여러 참여자 역할별 수행과 기여도를 판정하고 보상을 나눌 수 있는가
5 여러 원인이 연결되는 후속 이야기 사건을 합치거나 분기해도 인과관계와 기존 계약이 유지되는가
6 소문·소속 평판·장기 경제 정보의 출처와 세계의 회복 경로를 관리할 수 있는가

예를 들어 지역 식량 조달에서는 빨리 도착하지만 비싸고 위험한 운송과 저렴하고 안전하지만 늦게 오는 상단을 비교할 수 있습니다. 같은 유형의 사건이라도 시간·비용·위험이 실제 선택을 바꾸도록 설계합니다.

이 단계에서는 지역의 생산·소비·재고를 별도로 설계해야 합니다. 현재 주민은 실제 지갑과 물품을 사용하지만, 카탈로그 상인은 상품을 생성해 판매하므로 거래량만으로 지역 재고를 계산할 수 없습니다. 공식 NPC도 허기 적용 대상에서 제외되어 있어, 기존 허기 기능을 그대로 마을 식량 소비에 연결할 수는 없습니다.

확장할 때도 다음 원칙을 유지합니다.

  • 공유 사건은 결과를 유지합니다. 해결된 사건을 다른 플레이어에게 다시 미해결 상태로 제공하지 않습니다. 늦게 온 플레이어에게는 남은 단계나 다른 실제 필요에 참여할 기회를 제공합니다.
  • 관계 외에도 참여 근거를 둡니다. 중요한 부탁에는 개인 신뢰뿐 아니라 능력, 소속의 보증, 긴급성도 고려합니다.
  • 사실과 주장을 구분합니다. NPC가 직접 확인한 정보, 전달받은 소식, 플레이어의 말에 출처와 확인 시점을 남깁니다.
  • 실패 이후의 행동을 설계합니다. 손실·지연·부상은 기억과 재계획으로 이어집니다. 위험 선호는 성격과 관계에 따라 달라질 수 있으며, 부상·포로를 도입할 때는 회복·석방 경로도 함께 만듭니다.
  • 경제에 회복 경로를 둡니다. 생산·교역·수입·배급을 명시하고, 기존 가격 지수와 지역 부족 효과가 중복 적용되지 않도록 합니다.

예상되는 문제와 대응

문제 대응 방향
이름만 다른 반복 심부름이 될 수 있음 사건 수보다 서로 다른 선택과 결과를 먼저 검증
10구리 차익이 이동 시간을 보상하지 못할 수 있음 실제 소요 시간과 참여 이유를 보고 보상·거리를 조정
NPC가 스스로 해결해 참여 동기가 약해질 수 있음 참여로 절약되는 시간과 유지되는 활동을 보여주고, 이후 후속 기회로 확장
호감도 쌓기가 진입 장벽이 될 수 있음 첫 공개 의뢰는 개인 거래의 호감도 조건과 별도로 제공
자연어 제안이 실행 가능한 범위를 넘을 수 있음 지원 행동에만 연결하고 불가능한 경우 이유와 대안을 설명
수락 후 NPC가 계획을 바꾸면 약속이 깨질 수 있음 수락된 계약 조건을 보존하고 명시적인 포기·실패 절차 적용
계약을 반복 점유하거나 자금을 중복 사용할 수 있음 재수락 제한, 동시 계약 한도, 지갑 예약, 정산 이력 적용
공유 사건이 소수에게 독점될 수 있음 이후 단계에서 역할별 모집과 후속 참여 기회 제공
LLM 지연과 장애가 세계 진행을 막을 수 있음 기존 호출 제한을 활용하고 대안 실행은 규칙 기반으로 처리
화면의 몬스터 수와 세력 규모가 혼동될 수 있음 지속 병력과 화면에 표현된 개체를 분리하고 확정된 처치만 반영
토벌이 숫자만 낮추고 체감 변화가 없을 수 있음 실제 출현 감소와 NPC 활동 변화로 결과를 확인
LLM이 다음 이야기를 위해 없던 사실을 만들 수 있음 원인·상태·자원 검증 후 실행하며, 새로운 전개도 서버가 승인한 행동으로 반영
후속 사건이 끝없이 늘어날 수 있음 생성 수·연결 깊이·지역별 활성 사건·호출 예산에 상한을 두고 같은 필요는 통합
성공할 때마다 더 큰 위기가 생겨 성취가 사라질 수 있음 회복과 일상 복귀도 결말로 인정하고, 재발에는 실제 원인을 요구

논의가 필요한 사항

다음은 구현 전에 합의할 제안값과 범위입니다.

  • 단계 구성: 개인 수요 → 지역 토벌 → 한 단계 후속 생성 순으로 같은 기반을 확장하는 것이 적절한가?
  • 보상과 기한: 총 60구리, 모집 1게임 시간, 수행 3게임 시간이 이동 부담과 플레이 흐름에 맞는가?
  • 공개 의뢰 접근: 작은 납품 의뢰를 기존 개인 거래 호감도와 별도로 제공하는 방향에 동의하는가?
  • 지역 토벌 규칙: 영향력의 초기 계산, 모집·종료 기준, 작전 기한과 기여 정산을 어떻게 설정할 것인가?
  • 후속 생성 범위: 첫 실험을 원인 사건당 최대 하나·연결 깊이 한 단계로 두고, 납품 행동부터 연결하는 것이 적절한가?
  • 성공 판단: 완료 여부뿐 아니라 지역 변화와 후속 이야기의 원인을 플레이어가 이해하는지 어떻게 평가할 것인가?
검토 근거: 현재 구현을 확인한 코드와 데이터

검토 기준은 커밋 daa45867입니다. 링크는 Issue에 붙여 넣어도 경로가 유지되도록 해당 커밋의 파일을 가리킵니다. 이 커밋이 있는 edgame1647/OpenMMO 체크아웃을 기준으로 하며, 다른 브랜치나 저장소의 현재 상태와는 차이가 있을 수 있습니다. 운영 DB, 실행 중인 NPC 수와 모델 설정은 확인하지 않았습니다.

영역 근거
NPC와 물품 데이터 NPC 정의, NPC 목록, 상인 목록, 아이템 목록
행동과 호출 제어 행동 모델, 행동 실행과 기억 저장, 호출 스케줄러, 에이전트 실행 루프
호감도와 대화 호감도 처리, 주민 거래 프롬프트, 상황 프롬프트
일과표 공유 일정 규칙, Karl의 순찰 일정
거래와 경제 상인·주민 거래, 흥정 검증, NPC 월급, 가격 지수
저장과 시간 저장과 거래 정산, 플레이어 거래, 세계 시간, 화폐 표시
NPC의 현재 제한 허기 처리, 좌판 거래
화면 NPC 메뉴, 거래창
관련 테스트 주민 거래, 상인 거래, 플레이어 거래
전투와 몬스터 출현 처치 판정, 이동에 따른 출현, 몬스터 관리, 몬스터 정의

현재 코드를 읽은 범위에서는 일반 퀘스트·계약의 지속 상태, 계약 이행 원장, 지역별 도적 세력과 영향력, 인과관계를 기록하는 후속 의뢰 생성, 마을 단위 식량 조달 계획은 확인하지 못했습니다. 위 완료 기준은 앞으로 수행할 검증이며, 이번 제안서 작성 중 테스트를 실행했다는 의미는 아닙니다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions