자동퀘스트로 구동되는 사냥 퀘스트를 수행할 때 인원을 분산하는 방법

자동퀘스트 전투 스텝을 자동전투에 의존하는 사례에서 자동퀘스트의 사냥 스텝이 목적지까지 이동한 다음 자동전투를 켜서 자동퀘스트처럼 진행하는 방법을 설명한 적이 있습니다. 여기서 흔히 기차놀이라고 부르는 현상이 일어납니다. 여러 플레이어들이 비슷한 시점에 비슷한 퀘스트를 주동으로 수행하면 플레이어들이 한 줄로 이동하거나 서로 겹쳐 이동해 보기 싫은 상황이 생깁니다. 수동으로 플레이어를 이동 시켜야 하는 게임에서는 이동을 조금이라도 편하게 만들기 위해 따라가기 기능을 넣어 이런 상황을 의도하기도 하지만 자동이동 게임에서는 이런 상황을 다들 별로 보고 싶어 하지 않았습니다.

사냥 퀘스트의 이동 목표 지점이 동일할 때 이 현상이 더 심해집니다. 메인퀘스트는 오픈 후나 복귀 이벤트 시작 시점을 제외하면 잘 일어나지 않지만 반복해서 수행할 수 있는 사냥 퀘스트에서는 이런 현상이 더 자주 일어날 수 있습니다. 리니지2M 플레이를 생각해 보면 마을의 아인하사드 신상 앞에 나와 함께 서 있던 사람 여러 명이 동시에 같은 방향으로 움직이기 시작하기도 합니다. 개인적으로는 플레이어끼리 충돌한다면 이 현상을 굳이 막을 필요는 없다고 생각합니다.

히트2를 보니 사냥 퀘스트 하나에 목표 지점을 여러 개 만들어 놓고 그 중 하나를 선택하는 것 같았습니다. 목표 지점 여러 개 중 항상 가장 가까운 곳으로 이동하는 것인지 아니면 무작위로 선택하는 것인지는 확실하지 않습니다. 같은 사냥 퀘스트를 수행하며 계속해서 퀘스트가이드 인터페이스를 터치해 보면 여러 지정된 장소로 이동합니다. 이 방법을 통해 플레이어가 몰리는 사냥터의 복잡도를 완화할 수 있을 뿐 아니라 같은 퀘스트를 수행하는 플레이어들이 서로 다른 지점으로 이동해 기차놀이를 완화할 수도 있습니다.

로직을 데이터 모양으로 표현한 간단한 스킬 시스템

더 나은 쿠폰 서비스에 대한 아이디어 기록을 읽고 온라인 MMO 게임에서 스킬, 퀘스트, 업적 등 로직을 데이터 모양으로 만들어 팀에 여러 스탭들이 데이터를 양산할 수 있도록 하는 개발과 비슷하다는 생각을 했습니다. 또 상태에 따른 대미지 계산 파이프라인과 비슷하다는 트윗도 읽었는데 스킬 시스템을 예로 들어 온라인 게임 쪽에서 비슷한 상황을 처리하는 요령을 설명하겠습니다.

이커머스에서 쿠폰이 겪는 문제를 거칠게 요약해 서로 다른 시점에 서로 다른 대상을 근거로 하는 조건 여러 개가 일치할 때 쿠폰이 동작하는 로직을 만들어야 하는데 이를 항상 하드코드로 개발할 때 여러 가지 문제가 생기므로 이를 데이터 모양으로 기술할 수 있도록 간단한 언어로 만들어 쿠폰 요구사항을 발주하는 스탭들이 직접 쿠폰을 디자인할 수 있게 하는 아이디어로 이해했습니다.

온라인 MMO 게임의 스킬 시스템은 게임 안에서 개체들 사이에 일어나는 상호작용 거의 대부분을 기술하는데 사용됩니다. 개발 초기에 플레이어캐릭터와 몬스터 사이에 대미지를 주고 받는 과정을 스킬 데이터구조로 만들어 확장하기 시작하면 나중에는 포션을 마실 때 플레이어가 받는 체력 증가 효과나 1개월 짜리 유료 아이템의 버프 효과 역시 스킬 데이터구조를 사용해 기술하기에 이릅니다.

이 간단한 가상의 스킬 시스템은 대략 ‘스킬’ 데이터구조와 ‘스킬이펙트’ 데이터구조로 구분합니다. ‘스킬’은 게임 상의 누군가(플레이어캐릭터, 몬스터, 소환수 등)가 스킬 사용을 시도할 때 사용 조건과 타겟팅 조건, 그리고 스킬이 발동될 때 사용할 ‘스킬이펙트’로 구성됩니다.

스킬을 사용하려면 먼저 스킬 사용을 시도할 때 조건을 확인해야 합니다. 현재 플레이어가 이 스킬을 소지하고 있는지, 스킬에 걸려 있는 레벨 조건은 일치하는지, 마나는 충분한지, 같은 스킬이나 같은 스킬 계열의 글로벌 쿨타임은 끝났는지, 같은 계열 스킬을 사용할 수 없게 만드는 디버프에 걸려 있지 않은지 등을 확인해야 합니다. 각 단계마다 스킬을 사용할 수 없다면 단계에 해당하는 메시지를 표시하고 스킬 사용을 멈춥니다. ‘마나가 부족합니다.’나 ‘레벨이 부족합니다.’ 같은 메시지가 이 과정에서 표시됩니다.

스킬을 사용할 수 있다면 이어서 스킬을 시전할 대상이 유효한지 확인해야 합니다. 흔히 타겟팅 시스템이라고 부르는데 스킬 시전 대상 역시 여러 단계에 걸쳐 확인해야 합니다. 먼저 스킬 사용 대상이 제대로 타겟팅 되었는지 확인합니다. 타겟은 스킬 메커닉에 따라 플레이어 캐릭터 반경 내, 타겟팅 인터페이스를 통해 가리킨 대상, 타겟팅 인터페이스를 통해 가리킨 바닥 등이 있습니다. 다음으로는 사용 대상이 스킬의 최대 사거리 안에 있는지 확인하고 대상이 아군인지 적군인지 확인합니다. 특히 아군과 적군 구분은 상황에 따라 달라질 수 있어 별도 판별 로직을 통해 스킬 사용 시점 및 피격 시점마다 확인해야 합니다.

스킬 사용 조건과 대상이 모두 유효함을 확인한 다음에는 이들에게 적용할 ‘스킬이펙트’를 실행합니다. 일반적으로 스킬이펙트는 실행될 때 스킬과 달리 독립적으로 조건을 확인하지는 않지만 독립적인 타겟팅 시스템을 포함하고는 있습니다. 가상의 체인 라이트닝 스킬이 있습니다. 플레이어 캐릭터가 마나를 소모해 적에게 전기를 발사하고 여기에 맞은 대상이 주변의 다른 대상에게 2단계에 걸쳐 전기를 전파하는 스킬입니다. 대상은 플레이어 캐릭터의 실린더로부터 20미터 안에 있어야 하고 적군이어야 하며 항상 정확한 대상에게만 사용할 수 있어 대상이 없는 땅바닥에는 사용할 수 없습니다.

스킬을 발사하면 타겟팅 한 첫 번째 대상에게 3초 동안 1초에 한 번 ‘전기 대미지 레벨 3’ 디버프를 주는 ‘감전 1’ 스킬이펙트가 실행됩니다. ‘감전 1’ 스킬이펙트는 이어서 피격자로부터 반경 10미터 안에 있는 적군에게 ‘감전 2’ 스킬이펙트를 부여합니다. ‘감전 2’ 스킬이펙트는 대상에게 ‘전기 대미지 레벨 2’ 디버프를 주고 피격자로부터 반경 5미터 안에 있는 적군에게 ‘감전 3’ 스킬이펙트를 부여합니다. ‘감전 3’ 스킬이펙트는 대상에게 ‘전기 대미지 레벨 1’ 디버프를 주고 끝납니다. ‘전기 대미지 레벨 #’ 디버프는 원거리 전기 대미지 연산 공식에 의해 대미지를 구해 대상의 체력을 감소 시킵니다. 대미지 연산 공식에는 대상의 버프 및 디버프, 스킬 시전자와 피격자 사이의 레벨 차이, 피격자의 장비에 따른 대미지 증감 규칙을 포함하고 있습니다.

사실 이런 상황에서 가장 빨리 스킬을 개발하는 방법은 이 로직 일체를 하드코딩하는 것입니다. 하지만 위에서 설명한 여러 단어 조각들로부터 예상할 수 있듯 체인 라이트닝 스킬은 이와 비슷하면서도 또 조금씩 다른 수많은 다른 스킬 중 하나일 뿐입니다. 가상의 파이어볼 스킬은 체인 라이트닝 스킬과 아주 비슷하지만 ‘화염 계열 대미지’를 주며 피격자가 입은 갑옷은 ‘전기 계열 대미지’를 잘 막아 주지만 ‘화염 계열 대미지’에는 취약할 수 있습니다.

가상의 게임에는 클래스 10개와 각 클래스마다 사용할 수 있는 스킬 30개가 있습니다. 여러 스킬을 개발하기 위해 전투디자인팀의 클래스 담당자가 스킬 로직을 위에서 설명한 형식의 데이터로 기술하는데 팀에 따라 다르지만 요구사항이 크게 변하는 초기 단계에는 스킬 저작도구를 갖추지 못하고 엑셀에 로직을 기입하곤 합니다. 상황에 따라 엑셀에 스킬을 코딩하는 개발 환경은 게임 서비스가 끝날 때까지 유지될 수도 있습니다.

스킬, 스킬이펙트, 버프 및 디버프를 각기 다른 엑셀 파일이나 각기 다른 워크시트에 기술하는데 팀에 따라 한 셀에 전기 대미지 레벨 1의 형식으로 기입하게 하기도 하고 전기 대미지(1)이나 전기 대미지, 1의 형식으로 기입하게 하기도 합니다. 위 체인 라이트닝 사례에서 스킬 하나는 서로 다른 세 가지 스킬이펙트를 차례로 실행하는데 이 때는 각 스킬이펙트를 서로 다른 행에 기입한 다음 각 스킬이펙트 칼럼 중 하나에 ‘이어서 실행할 스킬이펙트 번호’를 기입해 이들이 연속으로 실행되도록 합니다.

이런 데이터구조는 대략 지난 20여년에 걸쳐 MMO 게임의 스킬, 퀘스트, 업적 등을 표현하는데 일상적으로 사용되며 조금씩 개선 되어 왔습니다. 팀에 따라 스킬, 스킬이펙트, 버프 및 디버프의 연결 관계를 시각화한 도구를 제공하기도 하고 엑셀 형식으로 표현하기 상당히 난해한 구조를 별도의 스크립트로 기술할 수 있도록 하기도 합니다. 다만 시간이 흘러 성능 문제가 생기면 가장 먼저 데이터 모양으로 바뀌는 것이 이 스크립트 모양으로 기술된 로직이어서 엑셀 모양으로 기술된 데이터를 끝까지 유지하는 보수적인 접근을 더 자주 만났습니다.

이런 개발 방법은 오랜 시간에 걸쳐 검증되었지만 개발이 진행됨에 따라 엉망이 되는 상황을 피할 수는 없었습니다. 개발에 참여하는 게임디자이너나 엔지니어가 항상 스킬이펙트와 버프 및 디버프에 사용될 각 컴포넌트를 설계하는데 익숙하지 않았고 또 개발기간은 항상 부족했습니다. 그래서 개발에 관여한 스탭에 따라 각 기능은 더 이상 쪼갤 수 없는 바람직한 형태로 개발되기도 하지만 때에 따라서는 그 시점의 편의에 따라 이미 존재하는 컴포넌트 몇몇의 기능을 포함하거나 이들과 일부 기능이 겹치지만 나머지 기능은 겹치지 않는 미묘한 컴포넌트를 만들어내 엑셀 파일에 복잡한 코멘트를 따라야만 예상대로 동작하는 스킬을 만들어낼 수 있는 상황을 자주 겪습니다. 또 스킬이펙트나 버프 이름이 2014_겨울이벤트_빙결대미지_레벨3 처럼 의도적으로 여러 컴포넌트를 묶은 형태로 개발되기도 합니다.

더 나은 쿠폰 서비스에 대한 아이디어 기록에서도 단점으로 한번 만든 컴포넌트를 삭제할 수 없음을 꼽고 있는데 이렇게 한 번 만들어진 스킬이펙트나 버프 및 디버프는 설계가 잘못되었다고 해서 삭제하고 다시 만들기가 아주 어렵습니다. 아직 개발 중이라 하더라도 게임 내 온갖 장소에서 스킬이펙트가 광범위하게 사용되고 있어 잘못 설계된 컴포넌트를 변경하거나 삭제함에 따라 광범위한 오동작을 일으킬 수 있고 또 이 오동작을 바로잡기 위한 비용이 높습니다. 이런 상황이 반복되다 보면 위에서 예를 든 가상의 체인 라이트닝 스킬에서 사용하는 전기 계열 대미지 디버프와 거의 비슷하지만 조금씩 다른 디버프 수 십 개가 있는 상태로 서비스를 진행하게 되며 세월이 흐름에 따라 부실한 문서화와 계속된 담당 스탭의 변경에 따라 똑같은 역할을 하는 컴포넌트 여러 개가 서로 다른 이름으로 개발되어 있기도 합니다.

이런 단점이 있지만 로직을 데이터 모양으로 표현해 게임디자이너 수준에서 게임 동작을 확장할 수 있게 하고 스킬을 양산해야 하는 상황에 여러 게임디자이너를 투입할 수 있는 장점을 포기할 생각은 없습니다. 때문에 데이터에 로직을 직접 표현하는 입력 방식은 앞으로도 느린 발전을 거치며 계속해서 사용될 거라고 예상합니다.

잘 동작하지 않는 보물상자

제2의나라를 플레이 하다가 필드에서 보물상자를 봤습니다. 필드에 보물상자는 이 장르 게임에 흔한 경험입니다. 너무 익숙해서 최근에 플레이 한 Disney Dreamlight Valley에서 남의 집 안에 있는 보물상자를 너무 자연스럽게 뒤지며 ‘아 이러면 안되는 것 아닌가?’라고 잠깐 생각했을 뿐입니다. 또 이전에 플레이 했던 디아블로 이모탈에서도 똑같은 메커닉을 자주 만났습니다.

이전 경험을 생각해보면 보물상자를 만나면 고민하게 됩니다. 저 보물상자를 열어 보상을 먹을지 아니면 그 시간에 미니맵에 나타난 다른 몬스터에게 달려가 전투를 계속할지를요. 아니면 퀘스트를 계속할 수도 있을 겁니다. 이 고민의 핵심은 보물상자에서 나올 보상과 몬스터 사냥을 통해 얻을 보상의 효율에 차이가 있기 때문입니다. 보물상자는 잠깐 쉬는 동안에 할 거리를 만들어 주는 역할을 합니다. 직접 전투하는 것에 비해 더 좋은 보상을 주기 어렵습니다. 전투에서는 또 여러 가지 보상을 함께 얻으므로 항상 효율이 더 좋을 수밖에 없습니다. 몬스터가 죽을 때 내놓는 보상을 비롯해 경험치, 같은 공격에 의해 스플래시 대미지를 입은 주변 몬스터들을 더 수월하게 잡을 기회를 함께 제공 받습니다.

제2의나라 필드에서 만난 보물상자는 잘 동작하지 않을 것 같아 보입니다. 디아블로 이모탈의 필드에서 만난 보물상자가 고민의 대상이 되는 이유는 전투를 직접 해야 하기 때문입니다. 제2의나라에서 자동전투는 보물상자를 무시합니다. 보물상자에 인터랙션 하려면 전투가 끝나기를 기다린 다음 전투를 멈추고 수동으로 이동해야 합니다. 자동전투에 익숙해지면 수동이동을 할 생각 자체를 잘 하지 않게 됩니다. 자동전투를 관찰하다가 자동전투 상태를 깨고 직접 이동해 보물상자에 인터랙션 해야 하는 상황이기 때문에 디아블로 이모탈과 비교해 전투보다 낮은 보상을 주기 어렵습니다. 보물상자가 충분한 가치를 제공하지 않는다면 항상 무시하고 퀘스트와 전투에 집중하는 편이 이득입니다. 때문에 제2의나라 보물상자는 잘 동작하지 않을 가능성이 높습니다.

만약 이를 개선하려면 보물상자가 확실히 항상 높은 보상을 준다고 유저들에게 각인시키거나 필드에 자동전투를 잠깐 멈출 이유를 만들어야 합니다. 가령 뷰포인트에서 스크린샷을 찍으려고 잠깐 멈췄더니 옆에 보물상자가 있어 보상을 추가로 얻는 경험을 주는 식입니다.

헛갈리는 상점의 자동담기 설정

리니지라이크 게임의 버프 인터페이스는 캐릭터의 항상성을 유지하는 역할을 합니다. 게임 상에서 캐릭터에 재화를 투입해 초기 상태보다 더 나은 상태를 만들 수 있습니다. 가령 포션을 더 많이 들고 있으면 연속으로 전투를 계속할 수 있습니다. 같은 시간을 더 효율적으로 사용할 수 있게 됩니다. 여러 능력치를 일시적으로 올려주는 포션과 주문서들은 캐릭터의 초기 상태를 재정의하기에 이릅니다.

이를 기본 상태라고 해 봅시다. 기본 상태는 항상성 유지 아이템을 통해 여러 능력치들이 더 증가한 상태를 말합니다. 기본 상태를 만족하지 못하면 플레이에 손해를 보게 됩니다. 몬스터를 예상보다 더 오래 걸려 잡게 됩니다. 인벤토리 무게에 더 빨리 반응해 마을에 다녀와야만 해서 시간을 낭비하게 될 뿐 아니라 공격력이나 방어력이 낮아 체력 포션을 더 많이 소모하게 됩니다.

상점은 빠르게 항상성을 유지하는 역할을 합니다. 만약 아주 오래된 대항해시대라는 게임을 플레이 해 본 적이 있다면 항구에 들러 항상 똑같은 행동을 한 경험이 있을 겁니다. 먼저 항해에 필요한 주요 아이템을 구입해 인벤토리를 채웁니다. 마지막으로 항구에 들러 남은 적재량을 2로 나눠 절반은 물, 나머지 절반은 식량을 채웁니다. 이 행동을 반복하다 보면 아무 숫자나 2로 굉장히 빨리 나눌 수 있게 됩니다. 리니지라이크 게임의 상점은 이와 같은 역할을 합니다. 캐릭터를 기본 상태로 만들기 위해 언제나 똑같은 보급 행동을 해야 합니다. 이전에는 물과 식량만 채우면 됐지만 이제 다양한 아이템을 채워야 하므로 이를 자동으로 수행하게 해서 고객의 시간을 아껴야 합니다.

처음 이 상점 인터페이스를 접할 때 잘못된 의사소통으로 기능을 잘못 이해한 적이 있습니다. 상점에는 자동구매 설정이 있는데 이 기능은 내 인벤토리에 특정 아이템의 갯수를 항상 똑같이 유지하도록 모자른 갯수만큼 아이템을 구입해 주는 기능입니다. 가령 1000으로 설정하면 상점에서 자동구매를 누를 때 인벤토리에 아이템이 1000개가 되도록 만들어 줍니다. 인벤토리에 아이템이 100개 남아 있었다면 900개를 구입합니다.

그런데 인터페이스를 봐선 이 동작을 추측하기 쉽지 않습니다. 상점에서는 상품을 구입하기 전에 먼저 화면 중앙의 장바구니 인터페이스에 올려놓는데 ‘자동 담기’는 마치 장바구니에 아이템을 자동으로 담겠다는 의미처럼 보이기도 합니다. 때문에 아이템 1000개를 담는다는 말이 항상 1000개를 추가로 구입한다는 의미처럼 느껴졌습니다. 위 사례의 게임에서는 인벤토리 무게가 정해진 비율을 초과하면 패널티를 받기 때문에 항상 정해진 수량만큼 아이템을 구입하면 안됩니다. 그래서 아이템 수량을 결정할 때 패널티를 받는 무게 직전까지 최대한 구입하는 기능이 있기도 합니다. 이런 상황에서 자동 담기는 당연히 절대량을 담는다는 의미가 아니라 이 수량에 도달할 때까지 남은 양을 상대적으로 담는 기능이라고 예상할 수 있습니다.

하지만 여전히 저 표현은 좀 더 다듬을 여지가 있다고 생각합니다. 자동 담기보다는 자동 수량 유지에 더 가깝고 너절하기는 하지만 설명을 좀 더 추가하거나 인터페이스 형태를 고쳐 인벤토리에 남아 있는 같은 아이템의 ㅅ구량에 근거한 새롭게 담을 수량을 보여줘 더 확실한 의사소통을 할 여지가 있습니다.

제2의나라 랜덤보상 사례

전에 리니지2M의 랜덤선택보상히트2랜덤선택보상에 어떤 의미가 있는지 고민했습니다. 이 두 게임 모두 랜덤선택보상은 그저 그런 보상에서 그럭저럭 괜찮은 보상을 랜덤으로 주는데 실상은 터치 횟수를 늘리는 귀찮은 메커닉이라고 이야기했었습니다. 이들 둘 모두 랜덤 선택 대상인 전체 보상 목록을 볼 수 있기 때문에 만약 확률이 낮은 보상이 나오면 운이 좋은 상황이라는 것을 알 수 있었습니다. 어떤 유저들은 낮은 확률을 뚫고 평소보다 기분이 좋아질 수도 있습니다. 하지만 평균적인 유저는 그런 감정을 느끼지 못할 겁니다.

이건 제2의나라 스크린샷입니다. 히트2의 랜덤선택보상 사례에서 제2의나라 이야기를 했는데 정작 저 글을 쓸 때는 제2의나라 스크린샷이 없어서 직접 인용하지 못했습니다. 제2의나라에서는 랜덤보상을 줄 때 유저의 선택을 요구하지 않습니다. 유저가 선택하지 않으므로 랜덤보상의 전체 집합을 정확하게 보여줄 필요도 없습니다. 잘 보면 볼 수야 있겠지만 빠른 연출을 보며 전체 목록을 파악하기는 아주 어려울 겁니다. 제2의나라 랜덤보상은 보상 집합에서 보상 하나를 뽑아 준다는 느낌만 유지하고 운이 더 좋거나 나쁜 상황을 없앴습니다. 또한 추가 터치 조작을 요구하지 않아 경쾌한 느낌입니다.

개인적으로 랜덤보상이나 랜덤선택보상을 집행해야 한다면 제2의나라 형식이 더 적절한 방식이라고 생각합니다. 개발자 입장에서 평균적으로 적당한 수준의 보상을 지급하고 때에 따라서 더 좋은 보상을 얻게 할 수 있을 뿐 아니라 추가 조작을 요구하지도 않기 때문입니다.