2009-12-03 12 views
18

저는 항상 RPG (롤 플레잉 게임)에 관련된 데이터 구조에 관심이있었습니다. 특히 대화 및 이벤트 기반 활동에 대해 궁금합니다.RPG 대화 엔진/구조

예를 들어

: 나는 항목 Y와 함께, 게임 X 점 에서 NPC를 접근하고 퀘스트 경우 Z, 나는 NPC 말 할 필요가 무엇을 어떻게 해결할 것인가? 브랜치 다이얼로그와 플레이어 입력에 응답하는 것은 정의 된 스크립트를 갖는 것만큼이나 사소한 것처럼 보입니다. 사용자 입력은 스크립트 리더가 스크립트의 특정 라인으로 점프하도록합니다. 스크립트에는 대응하는 응답 라인이 있습니다 (자신의 모험을 선택하는 것과 같습니다)

그러나 플레이어가 특정 항목을 가지고 있는지 확인하려면 로직을 연결하고 특정 퀘스트를 완료하면이 스크립트 기반 모델이 실제로 망가졌습니다.

나는 모든 대화와 논리에 접근하는 방법에 대한 아이디어를 필요로한다. (프로그래밍 언어 예제 일 필요는 없다.) 너무 많은 코드를 탐구하지 않고 새로운 분기 컨텐트를 추가하는 것이 매우 쉽다.

이것은 실제로 열려있는 질문입니다. 나는 하나의 해결책이 있다고는 생각하지 않지만 몇 가지 아이디어로 공을 굴리는 것이 좋을 것입니다. 프로그래머가 아닌 디자이너로서, 나는 항상 내용과 코드를 분리하는 방법에 관심이있다.

+0

커뮤니티 위키가 될 수 있도록 질문을 편집했습니다. –

답변

5

저는 RPG, 액션 게임, 기본 카드/보드 게임 이상의 모든 최신 게임은 일반적으로 디스플레이 엔진, 핵심 데이터 구조 및 일반적으로 2 차 스크립팅과 같은 몇 가지 구성 요소로 구성됩니다. 엔진. 몇 년 동안 인기가 있었던 한 가지 예가 루아 (Lua)였습니다.

스크립팅 언어가 유연하고 일반적으로 게임 디자이너에게 사용하기 쉽기 때문에 당신이 이야기하는 의사 결정 (이벤트, 대화 분지 등)은 일반적으로 보조 스크립팅 엔진에 의해 처리됩니다. 다시 말하지만 실제 스토리 중심 또는 게임 주도 로직의 대부분은 실제로 여기에서 발생합니다. 여기서는 스왑 아웃되고 비교적 쉽게 변경 될 수 있습니다. (적어도 모든 코드의 전체 빌드를 실행하는 것에 비해!)

기본 게임 엔진은 세계 (기하학 등)와 관련된 데이터 구조, 플레이어 및 기타 관련 데이터 구조를 결합합니다 배우, 필요한 것들, 그리고 만남을 유도하는 스크립트 등을 포함하고 있으며 모든 것을 사용하여 최종 통합 환경을 표시합니다.

+0

이 방법은 모든 의사 결정을 처리 할 수 ​​있도록 스크립팅 엔진과 엔진이있는 것처럼 보입니다. 어떻게 서로 잘 어울리는 지 알기나 해? –

+0

그 세계에서 프로가 아니기 때문에 나는 더 이상 할 일이별로 없다. 책꽂이를 치는 것이 좋습니다. CRPG 디자인 및 개발에 관한 책이 실제로 있습니다. 그들은 핵심 아키텍처를 안내해야합니다. 행운을 빕니다! –

4

확실히 대화를 처리하기 위해 스크립팅 언어를 사용할 수 있습니다. 기본적으로 스크립트는 다음과 같이 보일 수 있습니다.

ShowMessage("Hello " + hero.name + ", how can I help you?") 
choices = { "Open the door for me", "Tell me about yourself", "Nevermind" } 
chosen = ShowChoices(choices) 
if chosen == 0 
    if hero.inventory["gold key"] > 0 
     ShowMessage("You have the key! I'll open the door for you!") 
     isGateOpen = true 
    else 
     ShowMessage("I'm sorry, but you need the gold key") 
    end if 
else if chosen == 1 
    if isGateOpen 
     ShowMessage("I'm the gate keeper, and the gate is open") 
    else 
     ShowMessage("I'm the gate keeper and you need gold key to pass") 
    end if 
else 
    ShowMessage("Okay, tell me if you need anything") 
end if 

대부분의 게임에 적합합니다. 스크립팅 언어는 간단 할 수 있으며 더 복잡한 논리 분기를 작성할 수 있습니다. 엔진은 스크립팅 언어에 노출 된 세계를 표현합니다. 이 예에서는 영웅의 이름과 인벤토리의 항목을 의미하지만 마음에 드는 것을 노출 할 수 있습니다. 스크립트를 통해 호출 할 수있는 함수를 정의하여 메시지를 표시하거나 사운드 효과를 재생하는 등의 작업을 수행 할 수도 있습니다. 문이 열려 있는지 또는 퀘스트가 완료되었는지 (예 :지도 및 퀘스트 클래스의 일부로)와 같이 스크립트간에 공유되는 일부 전역 데이터를 추적해야합니다.

그러나 일부 게임에서는 대화가 더욱 역동적이며 여러 조건 (예 : 캐릭터 분위기 및 통계, npc 지식, 날씨, 항목 등)에 따라 스크립팅이 지루할 수 있습니다. 여기에서 전제 조건 및 결과를 쉽게 지정할 수있는 형식의 대화 트리. 이것이 그 일을하는 방법인지 나는 모른다. 그러나 나는 한 번 질문했다. question about storing game logic in XML files.이 방법이 내 게임에 효과적이라는 것을 알았습니다 (대화는 많은 요소에 크게 의존합니다). 특히 앞으로는 많은 스크립팅이 필요없는 간단한 대화 편집기를 쉽게 만들 수 있으며 그래픽 사용자 인터페이스로 대화와 분기를 정의 할 수 있습니다.

예를 들어
+0

게시 한 링크와 함께 매우 유용한 의견입니다. 필자는 XML로 이것을 수행하는 것에 대해 생각해 보았습니다. 예제는 매우 논리적으로 보입니다. 이것도 json에서 할 수있을 것 같아요? 또한 GUI를 사용하여 대화와 브랜치를 정의하는 것에 대한 좋은 아이디어를 얻을 수 있습니다. –

17

: 나는 Y 항목과 퀘스트 Z와 함께, 게임에서 x 점에서 NPC에 접근하면 어떻게 는 NPC 말을해야 알아 작동합니다? 대화 브랜칭 플레이어 입력에 응답하는 것은 정의 된 스크립트를 갖는 것으로 사소한 것, 그리고 사용자 입력 훨씬 응답 라인의 대응하는 세트 (갖는다 스크립트에 특정 라인으로 이동할 스크립트 리더 원인 A는 플레이어가 특정 항목이

그러나 논리에 묶는 것은 경우 해결하기 위해) 자신의 모험을 선택하고 특정 퀘스트를 완료처럼 정말이 스크립트를 기반 모델을 파괴 것 같다.

전혀 아닙니다. 간단히 조건을 데이터에 포함시킵니다.

1에서 400까지 번호가 매겨진 대화 목록이나 자신 만의 모험 게임 선택과 같은 내용이 있다고 가정 해 봅니다. 각 대화는 NPC가 말한 텍스트와 플레이어가 사용할 수있는 응답 목록으로 구성 될 수 있다고 가정합니다.

다음 단계는 각 응답에 조건을 첨부하여 조건을 추가하는 것입니다. 가장 쉬운 방법은 스크립팅 언어를 사용하는 것이므로 플레이어가이 응답을 사용할 수있는 경우 True를 반환하고 그렇지 않은 경우 False를 반환하는 간단하고 간단한 코드를 사용합니다.

예 : 당신은 당신이 문제의 값을 검색하기 위해 호출 할 수있는 'rats_left_in_world'기능을 필요 했어, 스크립트 언어에서

<dialogue id='1'> 
    <text> 
    Couldst thou venture forth and kill me 10 rats, perchance? 
    </text> 
    <response condition="True" nextDialogue='2'> 
    Verily! Naught could be better than slaying thy verminous foes. Ten ratty 
    carcasses shall I bring unto thee. 
    </text> 
    <response condition="rats_left_in_world() < 10" nextDialogue='3'> 
    Nay, brother! Had thou but ten rats remaining, my sword would be thine, 
    but tis not to be. 
    </response> 
</dialogue> 

(XML 형식은 아무것도하지만 될 수있다).

스크립팅 언어가 없다면 어떻게 될까요? 글쎄, 프로그래머가 대화의 각 상황에 대한 개별 조건을 코드화 할 수 있습니다. 약간 지루하고 대화가 앞면으로 쓰여지기도 어렵지 않습니다. 그런 다음 대화 스크립트에서 이름을 기준으로 조건을 참조하십시오.

더 진보 된 방식은 여전히 ​​스크립트 언어를 필요로하지 않는, 그래서 같이 각 조건에 대한 태그를 사용할 수 있습니다

<response> 
    <condition type='min_level' value='50'/> 
    Sadly squire, my time is too valuable for the likes of thee. Get thyself a 
    farm hand or stable boy to do thy bidding! 
</response> 

당신이 필요로하는 당신은 그들만큼, 거기에 많은 조건을 추가 할 수 있습니다 하나 또는 두 개의 값으로 쉽게 지정할 수 있습니다. 모든 조건이 충족되면 응답을 사용할 수 있습니다.

+6

보너스 포인트에 대해 잘못된 XML 속성을 찾으십시오 - XML을 편집기에서 수행해야하는 이유는 무엇입니까? – Kylotan

+2

좋은 답변입니다. 잘못된 속성을 찾기에 XML foo가 충분하지 않습니다. 그래서 스크립팅은 실제로 꽤 쉽습니다, 다른 한편으로는 파싱은 괜찮은 프로그래머에게 파싱 되야합니까? (내가 뭘했는지 보시라.) –

+0

또한, 플레이어가 어떤 대화 브랜치를 방문했는지 또는 다음에 방문해야 하는지를 어떻게 추적하는지 궁금합니다. 예 : NPC로 돌아 가면 퀘스트가 제공되었는지 여부에 따라 어떤 라인을 말할 수 있을까요? 다음 방문시 발생할 nextDialogue를 저장하는 캐릭터마다 변수가있을 수 있습니까? –

6

흥미로운 점은 여기서 핵심 아이디어가 누락 된 것 같습니다. 우리는 프로그래머가 작업을 수행하는 것과 관련된 토론을하고 있습니다. 실제로 위의 코드 예제는 내용이 아닌 코드와 결합되어 있습니다.

게임 개발에서는 프로그래머가 권한을 부여하고자하는 콘텐츠 개발자입니다. 그들은 코드를 보지 않습니다 (이것은 매우 중요합니다). 기간. 당신은 기술 아티스트 또는 기술 디자이너를 몇 번이고 다시 만날 수 있습니다. 그러나, 내용 저자의 대다수는 기술적으로 기울어지지 않습니다.

나는 당신의 도덕성에 대한 질문을 이해합니다. 그러나 업계에서 이러한 유형의 문제를 해결할 때 최종 사용자 (우리가 개발중인 기술을 사용하는 사람들)는 엔지니어가 아니라는 점을 지적해야합니다.

이와 같은 시스템 (분기 대화 상자)은 비교적 직관적 인 도구로 표현해야합니다. 예를 들어 Unreal의 Kismet 비주얼 스크립팅 시스템을 활용할 수 있습니다.

본질적으로 데이터 구조 (스크립트를 표현/표현하는 것이 쉬운 것처럼 보이는 분기점 트리)는 스크립트에서 객체를 나타내는 노드와 마찬가지로 프로그래머가 만듭니다. 월드 오브제와 연결될 수있는 시스템 (비주얼 스크립팅에서 노드로 표현 될 가능성이 높다) 등이 만들어지고 전체 고양이 새끼 고양이가 멋진 코드로 영광스럽게 연결됩니다.

결국 디자이너는 시각적 스크립팅 언어로 대화 분기를 시각적으로 표현할 수있게되었습니다. 이것은지도 - 만남 특유의 것일 것입니다. 물론 이들을 절차 적으로 생성 할 수 있습니다. 하지만 이것은 디자이너의 욕구보다 프로그래머가 원하는 것입니다.

그냥 지식과 통찰력의 비트를 추가 할 줄 알았는데.

편집 : XML 예제가 있습니다. 다른 디자이너/아티스트/기타가 무엇인지 잘 모르겠습니다. 그것에 대해 느끼십시오; 하지만 텍스트 파일을 만지려는 생각에 내가 멍청이들과 함께 일한 사람들.

+1

매우 지연된 응답으로 ... 시각 도구가 이상적인 접근 방법이라는 데는 동의하지만 실제로는 편집을 필요로하는 모든 것에 리소스를 할당하는 것이 불가능합니다. 그런 이유로 나는 아마 구조화 된 텍스트를 두려워했던 디자이너를 고용하는 것을 고려하지 않을 것이다. 필자의 XML 예제는 디자이너를위한 사용자 경험을 그다지 중요하게 다루지 않았으며 복잡한 조건을 데이터에 쉽게 포함 할 수 있음을 보여주었습니다. – Kylotan

1

최근에 나는 Chat Mapper을 만드는 동안 이와 같은 문제를 해결했습니다. 내가하는 일은 대화 상자를 트리의 노드로 그래픽으로 플롯 한 다음 각 노드에 조건과 스크립트를 연결하는 것입니다. 트리를 탐색하여 노드를 히트 할 때 조건을 검사하여 해당 노드가 유효한지 여부를 확인한 다음 해당 노드와 관련된 스크립트를 실행합니다. 꽤 간단한 생각이지만 우리의 테스트에서 잘 작동하는 것 같습니다. 우리는 스크립트에 .NET 루아 인터프리터를 사용하고 있습니다.

1

제 해결책으로 노드 당 7 줄의 텍스트로 구성된 사용자 지정 텍스트 파일 형식을 개발했습니다. 각 라인은 스트라이드리스트 또는 텍스트 라인 일 수 있습니다. 각 노드에는 위치 번호가 있습니다. 숫자의 마지막 숫자는 유형이므로 새 질문, 확인, 이전 결과를 바탕으로 한 반복 작업 등 10 가지 유형의 노드가 있습니다.

각 대화 상자 활성화는 데이터에 대한 선택 쿼리로 시작됩니다 스트라이드리스트의 멤버와 비교할 수있는 결과를 저장하여 해당 노드와 일치시킵니다. 이것은 if/then보다 더 잔인한 일이지만 스트라이드 구분 기호 외에 어떤 구문도 필요로하지 않기 때문에 텍스트 설정 파일을 작게 만듭니다. 나는 와일드 카드 시스템을 사용하여 선택된 쿼리 결과가 NPC의 음성에 삽입 될 수 있도록합니다.

마지막으로 쉬운 구성 파일로는 충분하지 않은 경우 사용자 지정 스크립트가 인터페이스 할 수 있도록 API 후크가 있습니다. 사람들이 시각적으로 설정 파일을 스크립트 할 수 있도록 nodejs에 웹 응용 프로그램 GUI를 만들 계획입니다. D

2

최근에 뭔가를 개발해야하고 매우 기본적인 텍스트 파일 구조를 선택했습니다. 비 프로그래머를위한 스크립트의 세련과 편집의 용이성 사이에 상충 관계가있다

https://github.com/scottbw/dialoguejs

: 당신은에 결과 코드 및 텍스트 형식을 볼 수 있습니다.

나는 대화를위한 매우 간단한 해결책을 선택했고, 보조 게임 언어로 관련된 게임 이벤트의 트리거링을 별도로 처리했다.

최종적으로 보조 스크립트 엔진에서 이벤트를 트리거하는 데 사용되는 텍스트 대화 형식에 "스테이지 지시"를 추가하는 방법을 추가 할 수 있지만 대화 파일 자체에 코드와 비슷한 내용을 넣지 않아도됩니다.

+0

기본 예제는 런타임 동적 선택에 대해 생각하게합니다. 당신의 자식 : 안녕하세요! OSSland에 오신 것을 환영합니다!처음 방문입니까? [1,2, ifSomeFlag> 3] 1 예, 방금 도착했습니다 -> 4 2 아니요, 전에도 여기에 왔습니다 -> 5 3 비즈니스에 임명 -> 6 –

2

훌륭한 질문입니다. 나는 클라이언트를 위해 몇 번 해결해야했다. 우리는 당신과 매우 유사한 XML 구조로 시작했고 이제는 JSON을 사용합니다. 여기에 예 : http://www.branchtrack.com/projects/on029pq6.json 또는 https://dl.dropboxusercontent.com/u/11433463/branchtrack/on029pq6.json (가독성을 위해 표기)을 볼 수 있습니다.

전체 공개 : 위 링크는 브랜치 대화를위한 온라인 편집기 인 BranchTrack에서 생성되며, 저는 CEO입니다. 언제든지 물어보십시오.

+1

그냥 시도해보십시오. - BranchTrack은 시원합니다. – mcintyre321

+0

이 링크는 이제 무단 액세스를 반환합니다. 후손을 위해 표시 한 화면을 캡쳐 할 수 있습니까? – sanjaypoyzer

+1

@sanjaypoyzer이 링크를 확인하십시오 : https://dl.dropboxusercontent.com/u/11433463/branchtrack/on029pq6.json –

관련 문제