매번 방을 생성할 때마다 구조가 유동적으로 변하는 디아블로2의 맵 생성 체계는
파밍이나 레벨링을 위해 같은 지역을 수없이 되풀이해 사냥해야 하는 게임에서
반복 플레이로 인한 지루함과 피로감을 조금이나마 덜어주는 장치라고 할 수 있는데요.

이번 글에서는 이 맵들이 게임 안에서 어떤 방식으로 생성되는지,
제가 조사하고 정리한 내용을 함께 공유드리고자 합니다.




디아2의 맵은 위 스샷처럼 사각형 타일들이 모여 하나의 구역을 완성하는 방식으로 만들어지는데요.
이 타일들은 맵 타일(map tiles)이라고 하며, 맵을 구성하는 기본 단위가 됩니다.

맵 타일은 지역과 던전 테마별로 여러 세트가 존재하는데,
한 예시로 1막 바위 벌판의 라카니슈가 등장하는 타일을 잠깐 살펴보겠습니다.



보시면 하나의 맵 타일은 다시 더 작은 단위의 타일들로 나눠지는데요.
이 타일들은 바닥 타일(floor tiles)로, 말 그대로 바닥을 구성하는 타일이며
게임에서는 이 바닥 타일의 개수로 구역의 크기를 측정합니다.

맵 타일의 크기는 종류마다 달라서 최소 8x8에서 최대 64x64에 이르기까지 매우 다양한데,
그 중에서 대표적인 파밍 장소들의 맵 타일 크기를 비교해보면 아래와 같습니다.



이런 맵 타일들이 맵 생성 알고리즘에 의해 배열되고 연결돼 맵이 만들어지는데요.
내부적으로 Dynamic Random Level Generation이라고 부르는 이 알고리즘은
온라인에서 방을 만들 때마다 32비트 정수형의 무작위 시드(Seed)값을 부여하고
그 값에 기반해 절차적 생성(Procedural generation) 기법으로 맵을 생성합니다.

정확한 생성 메커니즘은 소스 코드가 밝혀지지 않았기에 아직 미지의 영역이지만,
시드값과는 별개로 항상 일관되게 적용되는 최소한의 규칙들이 존재하기는 합니다.
(이런 규칙들 덕에 일부 구역에선 좌수법 등을 사용한 빠른 길찾기가 가능해집니다.)

맵 생성 관점에서 디아2의 구역들은 크게 미로(maze)형/고정(preset)형/야외(outdoor)형
세 가지 유형으로 나눌 수 있는데, 이제부터 각 유형별 맵 생성 규칙을 하나씩 살펴보겠습니다.

[막간 상식] 디아2 게임 내 동서남북 방위 <펼치기/접기>

디아블로2에서 내부 연산을 할 때는 일반적인 직교좌표계를 사용하지만

그래픽적으로는 아이소메트릭(isometric) 시점으로 변환해서 보여주기 때문에

게임 내 방위가 실제 화면의 동서남북과는 조금 차이가 나게 되는데요.


정확히는 아래 그림처럼 직교좌표계를 시계방향으로 45도 회전시킨 뒤에

세로를 1/2로 축약한 형태로 변환되고, 이에 따라 방위도 변해서

동/서/남/북이 화면 내 3/9/6/0시 방향이 아닌 4/10/8/2시 방향이 됩니다.




1. 미로형



미로형은 탈 라샤의 무덤이나 증오의 억류지처럼 지하 던전 구조를 갖는 유형으로,
스토리를 밀고 본격적으로 파밍에 돌입하면 수없이 반복해서 돌파하게 될 유형입니다.

이런 미로형 맵의 가장 큰 특징은 직소 퍼즐 조각처럼 맞물리는 맵 타일들이
정해진 규칙에 따라 일정한 갯수만큼 연결되어 생성된다는 점입니다.

여기서 타일이 갖는 이음새들의 방향을 그 타일의 '방향(orientation)'으로 정의하는데요.
미로형에선 아래 그림처럼 동서남북으로 조합 가능한 모든 방향의 일반 타일들과
그 외 동/서/남/북 방향의 특수 타일들을 사용해 미로를 완성합니다. 
(특수 타일은 순간이동진, 출구, 보물방처럼 해당 구역에 반드시 있어야하는 주요 타일)



그리고 이 타일 하나하나가 곧 미로의 '방(Room)'이 되는데요.
각 구역마다 가질 수 있는 방의 갯수는 내부적으로 정해져 있고
일부 구역에선 난이도가 높아질수록 방 수가 증가하기도 합니다.
(ex. 증오의 억류지 2층 - 보통 난이도 : 12개 → 악몽/지옥 난이도 : 48개)


미로형 맵의 생성 과정은 우선 방들을 연결해 미로의 골격을 먼저 만들고,
그 골격에 맞는 방향을 가진 맵 타일들을 차례대로 배정해나가는 식인데요.
간단한 그림과 함께 전반적인 순서를 설명드리자면 아래와 같습니다. 

 1. 먼저, 기초 골격대로 방을 배치한다.

 기초 골격은 앞으로 방을 덧붙여 나가며 미로를 완성하기 위한 토대로,
 각 구역마다 하나의 골격을 사용하는데, 대부분은 위의 가, 나, 다형 골격 중 하나를 사용합니다.
 (입구 타일의 이음새가 하나면 가 또는 나형, 여러 개면 다형을 사용. 라형은 3막 하수도의 고유 골격)


 2. 기초 골격을 중심으로 여분의 방을 나뭇가지 구조로 이어붙인다.

 여기서 나뭇가지 구조란 나무 기둥에서 가지가 뻗어나가는 모양처럼
 중심에서 말단으로 향하는 경로들이 서로 교차하지 않는 구조를 뜻하며,
 이때, 여분의 방이 뻗어나가는 형태는 시드값에 의해 무작위적으로 생성됩니다.


 3. 맞닿은 방들을 확인한 후, 맞닿는 부분 각각을 일정 확률로 연결한다.

 내부 데이터를 보면 0부터 1000 사이의 값을 갖는 Merge라는 수치가 있는데요.
 이 수치를 사용해 방들이 맞닿는 각각의 지점을 Merge/1000의 확률로 추가 연결합니다.
 (대부분의 경우 Merge값이 500이라, 실질적으론 50% 확률로 연결된다고 보시면 됩니다.)


 4. 맵에 들어갈 특수 타일들의 방향을 결정한다.

 상기한 과정들을 거쳐 미로의 골격이 완성되면, 이제부터 맵 타일들을 배정할 차례인데요.
 일단 배정에 앞서 해당 구역에 반드시 들어가야 할 특수 타일들의 '방향'을 먼저 결정합니다.

 이때, 특수 타일들 중에서 배정 우선순위가 가장 높은 타일의 방향을 먼저 무작위로 선택하고,
 나머지 타일은 그 앞 순위에서 시계 혹은 반시계 방향으로 90도만큼 돌아간 방향을 차례대로 부여합니다.

 대부분은 위와 같이 이전 구역에서 해당 구역으로 진입하는 '입구 타일'이 1순위가 되고
 이 입구 타일의 방향을 기점으로 나머지 타일들의 방향이 순번대로 정해지는데요.

 이처럼 특수 타일들의 방향은 서로 연관이 되어있기 때문에
 그 관계만 알면, 특정 타일의 방향을 토대로 다른 타일의 방향을 유추하는 것도 가능합니다.
 (저는 보통 입구 타일을 기준으로 삼아 아래처럼 기억을 해두는 편입니다.)
 
 물론 여기에도 예외는 있어서, 지하 묘지(카타콤)나 세계석 성채같은 경우에는
 입구 타일의 방향이 독립적으로 결정돼 다른 타일들과 연관성이 없기 때문에
 입구 타일 방향에 기반한 추리는 불가능합니다.
 
 이때는 차순위 타일의 방향이 무작위로 결정되고 이게 나머지 타일들의 기준이 되는데요.
 1, 3층은 특수 타일이 입구와 출구밖에 없기 때문에, 출구가 차순위가 되어 결국 둘의 방향이 전부 랜덤이 되지만
 2층에선 웨이가 차순위 타일이 되어 웨이<->출구 간에는 연관 관계가 성립합니다.


 5. 3에서 완성된 골격에 특수 타일들을 순차적으로 배정한다.
     만약 특수 타일과 방향이 일치하는 방이 없다면, 골격 외곽에 방을 하나 추가연장해 배정한다.


 특수 타일의 방향이 결정되면, 골격 안에서 해당 방향을 갖는 방을 찾아 타일을 배정합니다.
 이 때 방 수가 적거나 특수 타일의 종류가 많으면 적합한 방이 없는 일이 종종 발생하는데,
 그런 경우엔 골격 외곽에 방을 한 개 추가로 이어붙여 배정을 완료합니다.


 6. 나머지 일반 타일들을 배정해 맵을 완성한다.

 일반 타일은 맵의 다양성을 위해 같은 방향을 갖는 타일이 여러 종류 갖춰져 있는데요.
 각 방에 타일을 배정할 때 이 중에서 하나를 무작위로 선택해 배정을 합니다.

 이렇게 일반 타일까지 배정을 끝마치면, 비로소 아래와 같이 한 구역의 맵이 완성됩니다.



여기까지가 일반적인 미로형 맵의 생성 과정입니다.
디아2에는 다양한 구역이 존재하는 만큼, 이 과정에서 약간 벗어나는 예외도 있지만
그 부분까지 다루기엔 내용이 너무 방대하므로 여기서 마무리하고 다음 유형으로 넘어가겠습니다.


2. 고정형



고정형은 마을이나 증오의 억류지 최하층, 파괴의 왕좌처럼 맵의 구조가 늘 일정한 유형으로
주로 퀘스트와 관련된 NPC나 몬스터가 등장하는 구역들이 여기에 해당하는데요.

고정형 맵의 특징은 구역 전체가 통째로 포함된 단일 타일로 맵이 만들어진다는 점입니다.



이런 류의 '갖춰진' 타일을 프로그램에선 프리셋(preset)이라 부르는데,
각 구역에는 보통 하나에서 많게는 여러 개의 프리셋이 마련되어 있고
맵을 생성할 때마다 이 중에서 하나를 무작위로 선택해 사용합니다.

이처럼 고정형은 맵이 단 한 개의 타일로만 이루어지기 때문에,
미로형같이 여러 개의 타일을 사용해 생기는 무작위성이 전혀 없이,
맵 구조가 항상 프리셋의 형태로만 고정됩니다.


3. 야외형



야외형은 차가운 평야나 절망의 평원처럼 사방이 탁 트인 넓은 벌판 구조를 갖는 유형으로,
안타깝게도 플레이어들에겐 마을에서 주요 던전으로 이동하기 위해
어쩔 수 없이 거쳐가야 하는 길목 정도로만 여겨지는 비운의 유형입니다.

야외형은 지역별로 각기 다른 분위기를 연출하기 위해 규칙에 조금씩 차이를 두고 있어,
이를 전부 파악하기가 쉽지 않고 맵 생성 과정을 일원화해 설명하기도 굉장히 어려운데요.

그래도 최대한 포괄적으로 설명하자면, 야외형 맵은 일정한 크기의 공간을 설정한 뒤 
안팎에 경계선을 세우고 그 내부를 분위기에 맞는 타일들로 채워 생성된다고 할 수 있습니다.
이번에도 간단한 그림과 함께 전반적인 과정을 살펴보겠습니다.

 1. 먼저, (정해진 크기를 갖는) 공간을 설정한다.

 내부 데이터에는 각 구역의 크기가 '가로 O타일 x 세로 O타일' 꼴로 저장되어 있는데,
 이 수치를 읽어와 직사각형의 공간을 설정합니다.
 (엄밀히는 바닥 타일을 길이 단위로 사용하지만, 편의상 맵 타일로 환산해 설명하겠습니다.)


 2. 최외곽에 입구와 출구의 위치를 지정한 뒤, 경계 타일을 배치해 틀을 완성한다.

 여기서 입구와 출구는 각각 이전 구역과 다음 구역으로 이어지는 연결점으로,
 다른 구역들과의 충돌을 피하기 위해 항상 최외곽 변에 자리하며
 그 위치는 연결되는 구역의 성격에 따라 완전 랜덤, 완전 고정, 혹은 반랜덤으로 결정됩니다.
 (ex. 완전 랜덤 - 1막 들판,  완전 고정 - 혹한의 고산지,  반랜덤 - 2막 사막, 3막 정글)

 입구와 출구의 위치가 정해지면, 경계 타일을 배치해 구역의 틀을 완성합니다.
 이 경계(border) 타일은 울타리, 절벽, 낭떠러지 등으로 한두 면이 막혀 있어
 플레이어가 구역 바깥으로 이탈하지 않도록 막는 역할을 하는데,
 보통 구역의 외곽을 감싸면서 내부에도 공동 형태로 경계를 세우는 식으로 배치가 됩니다. 


 3. 완성된 틀 안에 (해당 구역에 맞는) 테마형 타일을 배치한다.

 테마형 타일(가칭)은 각 액트와 구역별 특색에 맞게 지형지물을 구현해 제작한 특수 타일로,
 대부분 구조물을 포함하고 있어 필드 안에 구조물을 배치하는 데 활용됩니다.
 또한 구조물 외에도 독특한 지형, 몬스터 캠프, 퀘스트 관련 오브젝트 등이 포함된
 다양한 '테마'를 가진 타일들이 앞서 완성된 틀 안에 무작위로 배치됩니다.
 (※ TMI : 사실 순간이동진은 1~2막에서는 테마형 타일이 아니고 다른 방식으로 배정되나, 설명의 편의를 위해 여기선 따로 분리하지 않았습니다.)




 4. 신전과 우물을 배치한다.

 1막과 2막에서는 각 구역별로 테마형 타일을 배치하고 남은 공간에 신전과 우물을 배치하는데요.
 이때 신전과 우물은 합쳐서 총 5개가 배치되며, 맵 타일 하나에 최대 한 개까지만 배치됩니다. 
 (3막부터 5막까지는 제가 시간이 부족해 규칙을 자세히 확인하진 못했습니다)


 5. 나머지 공간에 바닥 타일을 적절히 채워 맵을 완성한다.

 바닥 타일을 채우는 정확한 알고리즘은 프로그램 역설계에 가까운 영역이라 알기 어렵지만,
 제 추측으로는 먼저 맵 타일이 할당되지 않은 공간을 기본(디폴트) 바닥 타일로 채운 뒤에
 그 일부를 특정한 규칙이나 로직에 따라 다른 바닥 타일로 변환하는 방식이 아닐까 싶습니다.

 이렇게 일련의 과정을 거쳐 모든 공간이 채워지면, 마침내 아래와 같이 한 구역의 맵이 완성됩니다.




3막의 정글 구역(거미 숲, 거대 습지, 약탈자 밀림)은 재밌게도 야외형과 미로형의 특징을 동시에 갖는데요.
정글 구역의 맵 타일은 미로형처럼 '방향'을 갖는 타일로 구성되어 있고,
이 타일들로 가로 2타일 x 세로 6타일 크기의 공간을 채워 한 구역을 완성합니다.

그리고 저 세 구역은 특정한 규칙에 따라 순차적으로 연결되는데
먼저 거대 습지를 거미 숲의 남쪽으로부터 세로 3, 5번째 타일의 양 측면이나 가장 끝부분에 연결한 뒤에,
같은 방식으로 약탈자 밀림을 거미 숲 또는 거대 습지에 이어 붙입니다.
(단, 약탈자 밀림은 반드시 거대 습지보다 북쪽이거나 최소한 대등한 높이에 위치하도록 배치합니다.)



이때 약탈자 밀림이 항상 거대 습지에만 연결되는 게 아니기 때문에,
맵이 아래처럼 만들어지면 정글을 돌파하다가 거대 습지에서 길이 막혀버리는 상황이 연출됩니다.

그리고 위 그림의 오른쪽처럼 세 구역이 한 지점에서 모두 맞닿는 경우엔
일정 확률로 맞닿은 부분이 추가로 연결돼 세 구역이 전부 이어집니다.
(이 경우에도 연결 지점은 세로 3, 5번째 타일 또는 끝 타일 위치로 고정됩니다.)


야외형 맵의 생성 과정은 이 정도로 설명드릴 수 있을 것 같습니다.
제가 모든 구역을 면밀히 조사하진 못했기에 미처 발견하지 못한 규칙이나 오류가 있을 수도 있지만
대략 어떤 흐름으로 맵이 만들어지는 지 이해하시는 데 도움이 되었으면 좋겠습니다.


[글을 마치며...]

제가 말씀드릴 내용은 여기까지입니다.
사실 자료 조사는 2년 전에 완료했지만, 이 내용을 글로 엮으려고 할 때마다
부족한 글솜씨에 발목을 붙잡혀 계속 포기하기 일쑤였는데,
늦었지만 지금이라도 이렇게 글을 완성해 보여드릴 수 있게 되어 정말 다행으로 생각합니다.

긴 글 끝까지 읽어주셔서 감사드리며, 언제나 즐거운 디아2 되셨으면 좋겠습니다. :)

 ※ 25.11.23 업데이트
미로형 맵들의 정보를 한데 모아 정리한 총괄표를 부록으로 첨부드리니
길을 찾으실 때나 추가적인 탐구 시 참고 자료로 활용해 주시면 감사하겠습니다.

[부록] 미로형 맵 총괄표 <펼치기/접기>