퀘스트 시스템 설계 (2)
지난 퀘스트 시스템 설계 (1)에서는 디아블로 이모탈의 현상금 사냥 퀘스트를 기준으로 퀘스트 동작과 플레이시나리오를 살펴보고 요구사항을 간단히 정리해 봤습니다. 이번에는 현상금 사냥 게시판에서 ‘카즈라의 위협’ 퀘스트를 데이터로 표현하기 위해 퀘스트 정보를 데이터로 구성해 보겠습니다.
- 단일 퀘스트
- [1]
- 종류: 현상금 퀘스트
- 이름: ‘카즈라의 위협’
- 장소: ‘자베인 산’
- 보상: ‘보상 시스템 연결’
- [1]
일할 때를 생각헤사 긴 목록이 나올 거라고 생각했는데 퀘스트 데이터는 이 네 줄로 끝입니다. 하나씩 설명해보면 먼저 퀘스트 데이터에는 서로 다른 종류의 퀘스트가 섞여 있을 겁니다. 가령 메인퀘스트도 들어있고 가이드 퀘스트도 들어있으며 현상금 퀘스트도 들어있습니다. 때문에 각 퀘스트 종류를 구분해 줘야 합니다. 그래서 ‘종류: 현상금 퀘스트'
로 종류를 구분합니다. 처음에는 같은 파일에서 시작했다가 각 종류마다 양이 많아지거나 서로 다른 부서에서 작업하며 파일을 머지할 일을 최소화 해야 할 수도 있습니다. 그러면 그때 가서 '종류’별로 데이터를 파일 단위로 분할해 사용하면 됩니다. 처음에 데이터 파이프라인을 구성할 때 같은 네임스페이스를 공유하는 데이터가 서로 다른 파일에 분산되어 있어도 이를 하나로 묶어 처리하도록 해 두면 개발팀이 확장되는 상황에 편하게 대응할 수 있습니다.
퀘스트 하나는 여러 단계의 세부 목표로 구성되어 있습니다. 저는 이를 ‘스텝’이라고 부를 겁니다. 즉 퀘스트는 퀘스트 데이터와 퀘스트에 포함된 여러 가지 스텝으로 구성되어 있습니다. 스텝은 캐릭터가 수행할 목표와 기계가 수행할 목표를 함께 가지고 있습니다. 가령 퀘스트에 의해 원래 레벨에 배치되지 않은 몬스터가 나타나야 한다면 이 역시 스텝에 기입됩니다. 단 이 스텝은 플레이어에게 노출되지 않은 채로 기계가 수행하고 다음 스텝으로 넘어가게 됩니다. 이번에는 퀘스트 시스템 설계 (1)에서 본 퀘스트가이드 스크린샷에 근거해 스텝 데이터를 구성해 보겠습니다.
- 스텝
- [1]
- 퀘스트: '1'
- 순서: '1'
- 종류: ‘유저 | 기계’
- 이름: ‘달혈족 야영지의 카즈라 처치’
- 목표: ‘몬스터 처치’
- 장소: ‘달혈족 야영지 볼륨’
- 대상: ‘카즈라’ …
- 수량: ‘50’
- [1]
스텝 데이터 역시 한 파일에 여러 퀘스트의 스텝이 나열되어 있을 겁니다. 먼저 이 스텝이 어느 퀘스트의 하위 스텝인지, 그리고 몇 번째 스텝인지 구분해야 합니다. 여기서 퀘스트: 1
은 이 스텝이 1번 퀘스트의 하위 스텝이라는 것을 나타내며 순서: 1
은 이 스텝이 1번 퀘스트의 첫 번째 스텝이라는 것을 나타냅니다. 여러 스텝은 같은 퀘스트 안에서 ‘순서’의 오름차순에 따라 진행됩니다. 만약 순서: 2
인 스텝이 있다면 카즈라 50마리를 처치한 다음에는 그 스텝으로 넘어가게 됩니다.
스텝의 종류를 구분했습니다. 스텝은 유저가 수행하는 스텝과 기계가 수행하는 스텝의 두 가지입니다. 유저가 수행해야 하는 스텝은 유저가 이 스텝의 목표를 달성할 때까지 기다려야 합니다. 플레이어가 카즈라 50마리를 잡을 때까지 이 스텝은 다음으로 넘어가지 않고 기다리다가 카즈라 50마리를 모두 처치할 때 다음 스텝으로 넘어갑니다. 기계가 수행할 스텝은 스텝을 수행하자마자 바로 다음으로 넘어가야 합니다. 가령 주변 환경을 어둡게 만드는 기계가 수행할 스텝이 있다면 주변을 어둡게 만들고 나서 다음 스텝으로 바로 넘어가야 합니다. 플레이어를 이 데이터 상에서 유저라고 표현한 이유는 기계의 반대말을 기계 입장에서 명확히 구분하기 위해서입니다.
‘이름’은 퀘스트가이드 인터페이스에 나타날 실제 스텝 이름입니다. 게임에 따라 퀘스트가이드에 표시될 텍스트를 목표를 구성하는 대상의 이름을 조합해서 나타내기도 합니다. 그런 게임은 달혈족 야영지의 카즈라 처치
에서 장소를 나타내는 ‘달혈족 야영지’와 몬스터 이름인 ‘카즈라’ 부분이 다른 색상으로 표시될 겁니다. 디아블로에서는 그렇지 않으므로 전체 텍스트를 한 덩어리로 취급했습니다. 또 한 퀘스트에서 몬스터 여러 종류를 처치해야 할 때 몬스터 이름을 조합해서 스텝 이름을 만들면 스텝 이름이 너무 길어지는 등 통제가 잘 안 될 수 있어 스텝 이름은 텍스트 한 덩어리로 만드는 것을 추천하기도 합니다.
‘목표’는 이 스텝에서 수행할 구체적인 목표입니다. 명령어에 가깝다고 보면 됩니다. 이번 스텝의 목표는 ‘몬스터 처치’인데 이 목표에 따라 이어지는 ‘장소’, ‘대상’, ‘수량’ 등의 옵션이 바뀝니다. 가령 특정 장소까지 이동한다면 스텝 목표는 ‘이동’이 되고 목표 하위의 옵션은 ‘장소 볼륨’이 됩니다. 또 목적이 ‘오브젝트와 인터랙션’이라면 옵션은 ‘오브젝트 이름'이 될 겁니다. 여기서는 목표가 ‘몬스터 처치’여서 여기에 대응되는 장소, 대상, 수량을 옵션으로 입력했습니다. 방금 예로 든 것들이 자동퀘스트의 주요 목표들인데 여기에 목표 이름과 목표 별 옵션을 나열해 놓겠습니다. 이 세 가지가 퀘스트 목표 대부분을 차지합니다.
- 몬스터 처치 ( 장소, 대상[…], 수량 )
- 이동 ( 장소, 볼륨이름 )
- 오브젝트 인터랙션 ( 장소, 오브젝트 이름)
바로 이어서 ‘카즈라의 위협’ 퀘스트를 위에 설명한 데이터에 근거해 나타내 보겠습니다.
- 퀘스트
- [1]
- 종류: ‘현상금 퀘스트’
- 이름: ‘카즈라의 위협’
- 장소: ‘자베인 산’
- 보상: ‘보상 시스템 연결’
- [1]
- 스텝
- [1]
- 퀘스트: '1'
- 순서: '1'
- 종류: ‘유저’
- 이름: ‘달혈족 야영지의 카즈라 처치’
- 목표: ‘몬스터 처치’
- 장소: ‘달혈족 야영지 볼륨’
- 대상: ‘카즈라’
- 수량: ‘50’
- [1]
현상금 사냥 게시판 인터페이스에서는 종류가 현상금 퀘스트인 퀘스트들을 나열해 보여줍니다. 이들 중 하나를 수락하면 퀘스트가이드에 이 퀘스트 정보가 나타납니다. 만약 캐릭터가 위치한 현재 위치와 퀘스트의 장소가 다르다면 퀘스트가이드에 ‘장소로 이동’ 스텝을 보여줍니다. 반대로 캐릭터가 퀘스트 장소와 같은 곳에 있다면 바로 첫 번째 스텝을 퀘스트가이드에 보여줍니다. 이 스텝은 유저가 수행하는 스텝이어서 플레이어가 목표인 ‘몬스터 처치’를 완료할 때까지 기다려야 합니다. 퀘스트가이드를 터치하면 ‘달혈족 야영지 볼륨’을 향해 자동이동합니다. 볼륨 안에 진입하면 주변에 ‘대상’을 검색해 이동한 다음 멈춥니다. 디아블로 이모탈에서 전투는 플레이어가 직접 수행해야 합니다. 대상인 카즈라를 처치할 때마다 수를 세어 50마리가 되면 스텝을 완료합니다. 여기서는 다음 스텝이 없으니 퀘스트가 완료되는데 ‘현상금 퀘스트’는 서부원정지에 돌아가서 보상을 받아야 하므로 퀘스트를 완료했다 하더라도 바로 보상을 받지는 않습니다.
퀘스트 시스템 설계 (1)을 시작할 때 예상한 것보다 훨씬 간단하게 끝났는데 다음 편에서는 퀘스트의 주요 목표를 나열하고 각 목표 별로 어떤 값이 필요한지, 또 이 목표들을 연결한 가상의 퀘스트는 어떻게 작성하는지 알아보겠습니다.