MMO 퀘스트 메커니즘을 구현하기위한 팁?


14

아래 나열된 요구 사항에 따라 퀘스트 메커니즘을 구현하기 위해 권장하는 도구, 패턴 또는 모범 사례는 무엇입니까?

소프트웨어 아키텍처 (일반적인 수준)와 객체 배선, 이벤트 구독 및 조건 표현 선택에 대해 이야기하고 있습니다. 성공적으로 사용한 도구 / 라이브러리를 환영합니다. 편집 : 스크립팅을 사용하는 경우 어떤 설정을 권장합니까?

요구 사항 :

  • 간단한 2D mmo (rpg)
  • 퀘스트를 포함한 모든 게임 데이터는 관계형 데이터베이스에 저장됩니다
  • 게임의 모든 이벤트는 플레이어를위한 새로운 퀘스트를 유발하거나 기존 퀘스트를 진행시킬 수 있습니다.
  • 퀘스트는 플레이어가 퀘스트를하기 전에 충족해야하는 임의의 수의 조건을 가질 수 있습니다.
  • 퀘스트는 임의의 수의 하위 퀘스트 / 단계로 구성 될 수 있습니다.
  • 퀘스트는 단순한 것에서부터 시작됩니다.

    A와 대화-B 5 처치-A와 대화-영구적으로 건강 증진

  • 매우 관련있는 :

    X 구역에서 아이템 사용-Y 구역으로 이동-봇이 생성됩니다-10 % 이상의 데미지를 입지 않고 봇을 죽이십시오-봇 방울 아이템-아이템을 수령하십시오-포털 잠금 해제-포털 뒤 J에게 아이템을 전달하십시오-금과 경험을 얻으십시오- 포털을 다시 한 번 통과하도록 허용-이 플레이어의 포털 잠금

  • 레벨 인스턴스는 가능합니다 (플레이어는 팀이나 격리에서 특정 퀘스트를 완료하여 해당 참가자를위한 레벨 위치를 생성 할 수 있습니다)

  • 퀘스트는 스크립팅이나 프로그래밍 지식없이 월드 에디터를 사용하여 관리 할 수 ​​있어야합니다 ( 편집 : 스크립팅은 일반적으로 옹호하지 않음)
  • C ++을 구현 언어로 가정합니다.

이벤트와 조건 체인을 결합 할 수 있으면 더 복잡하고 더 매력적인 퀘스트를 모델링 할 수 있다고 생각했습니다. 내 ECA (Events-Conditions-Actions) 엔진을 롤링하여 실험했지만 너무 과도 할 수 있습니다. 어떤 종류의 스크립팅도 사용하지 않고 일반적인 조건을 모델링하는 것은 특히 어렵습니다.


스크립팅을 건너 뛰기로 선택한 특별한 이유가 있습니까? (루아 / gamemonkey 등).
Simon

경험이 부족하고 이것이 성능에 부정적인 영향을 줄 수있는 방법에 대한 가정으로 인해 발생합니다. 또한 세계 편집을 가능한 한 단순하게 유지하고 싶었습니다. 그러나 스크립팅을 사용할 수 있습니다.
jmp97

1
스크립트 지원이 없으면 엔진 프로그래머가 개입하지 않고 퀘스트에 다양성을 추가하는 것이 어려울 것입니다.
drxzcl

1
스크립팅 언어는 문제가되지 않을 정도로 빠른 경향이 있습니다. 나는 그들을 사용하는 것이 좋습니다. 즉, WoW의 스크립팅의 대부분은 주문 및 이벤트 트리거링을 기반으로합니다. "토크 A"는 무대 뒤에서 A가 플레이어에게 "주문을 캐스트"하도록하며, 퀘스트는 실제로 "주문 # 55728이 플레이어에게 캐스트 될 때 성공"으로 코딩됩니다. 그런 다음 생물체가 플레이어에게 주문을 시전하려면 AI 코딩이 약간 필요합니다.
ZorbaTHut

1
최신 스크립팅 언어 (예 : Lua Vm)가 충분히 빠릅니다. 사용하기 쉽고 구현하기 쉬우 며 런타임에 스크립트를 다시로드하고 런타임에 스크립트를 디버그 및 단계화할 수 있으며 컨텐츠를 작성하는 동안 MUCH를 더 빠르게 반복 할 수 있습니다. 퀘스트를 스크립팅하기 위해 스크립팅 엔진 (예 : lua 및 gamemonkey)을 살펴 보는 것이 좋습니다.
Simon

답변:


6

먼저 경고를하고 나서 몇 가지 조언을합니다.

마지막으로 이와 같은 시스템을 구현해야 할 때 원래 MMO와 같은 응용 프로그램을위한 엔진을 사용하지 않았습니다. 함께 제공되는 퀘스트 시스템은 싱글 플레이어 노력을 위해 만들어졌으며 사용할 수 없었습니다.

나는 퀘스트와 관련된 모든 객체에 대해 스크립트를 작성해야합니다.

Lever004_on_activate() {
    if isOnQuest(player, QUEST_0012) do_something();
    if isOnQuest(player, QUEST_0015) do_something_else();
}

이것은 완전한 악몽이다. 게임 전체를 청소하지 않고 퀘스트가 어떻게 작동하는지 알 수있는 방법이 없습니다. 이러지 마십시오.

전체 퀘스트 (라인)가 유한 상태 머신으로 표시되는 시스템을 만드는 것이 좋습니다. 전이를 확인하는 이벤트와 해당 전이에 반응하는 스크립트가 있습니다. 이를 통해 주어진 퀘스트 (라인)의 위치를 ​​쉽게 추적하고 모든 퀘스트 상태를 깔끔하게 캡슐화 할 수 있습니다.

원한다면 월드 에디터에서 일반적인 출현을 위해 스크립트 / 스크립트 템플릿 라이브러리를 만들 수 있습니다 (플레이어는 NPC와 대화, 플레이어 킬 몹 등).

이벤트 스크립트를 너무 자주 실행하지 않는 한 스크립트 성능에 대해 너무 걱정하지 않아도됩니다. 경험상, 스크립트는 "핵심"게임 로직 (애니메이션, 물리 등)보다 최소 10 배나 작아야합니다. 조건이 충족되었는지 확인하기 위해 주기적으로 발사하는 대신 이벤트에 반응해야합니다.


3
퀘스트 경로가 외부 요인에 의해 영향을 받거나 퀘스트가 비교적 복잡한 경우 상태 머신은 매우 빠르게 복잡 해지는 경향이 있습니다. 또한 여러 퀘스트 상태 머신 (여러 퀘스트가 활성화 될 수있는 경우)은 악몽 일 수 있습니다. 그러나 본질적으로 모든 프로그램은 상태 머신이므로 수행 할 수 있습니다. 그러나 복잡한 문제는 어떻게 캡슐화하든 복잡합니다. 좋은 예 (imo)는 일부 개조가 다른 개조가 작동하지 못하게하는 망각입니다. 상태에 대한 사전 및 사후 조건은 매우 견고하거나 극도로 용서하거나 오류를 용인해야합니다.
Kaj

그래, 카이가 맞아. 바로 지금 WoW 포럼으로 가서 미완성 퀘스트에 대해 불평하는 사람들에 대해 읽어보십시오. 메이저 리그에서도 항상 발생합니다. 모든 것을 올바르게 얻는 것은 정말 어렵습니다.
drxzcl

3

우리의 시스템은 기본적으로 각 미션 단계마다 각 서버 프레임에 표현식 (맞춤형 미니 스크립팅 언어이지만 tcl / lua / python도 잘 작동하거나 직접 만들 것입니다)을 실행합니다. 이것은 특정 플레이어와 관련된 "개인 미션"을위한 것입니다. 그런 다음 각 하위 단계는 미션 자체 (다른 미션의 하위 단계 일 수 있음)에 대한 FSM (유한 상태 머신)의 일부입니다. FSM이 하나이고 플레이어 대신 맵에 연결된 "맵 미션"도 있지만 (WA의 공개 퀘스트 생각) 하위 단계는 기본적으로 동일합니다.

이러한 표현이 실제로 보는 것은 "NPC 사망"또는 "상호 작용 완료"와 같은 시스템에 의해 브로드 캐스트 된 이벤트입니다. 즉, 게임 플레이 시스템은 다양한 부분을 다소 분리 할 수 ​​있으며, 필요에 따라 이벤트를 전송하기 때문에 미션 스크립트는 이벤트를 듣고 어디에서 왔는지 걱정하지 않아도됩니다. 또한 FSM이 월드 상태와 상호 작용하도록 할 수 있다면 (미션 상태 X에있을 때만이 연락처 표시) 시스템에서 많은 전원을 끌 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.