디아블로2는 아이템으로 시작해 아이템으로 끝난다고 해도 될 정도로,
아이템은 디아블로2 플레이에 있어 매우 중요한 위치를 차지합니다.

지금 이 순간에도 더 강한 아이템, 더 고가에 거래되는 아이템,
얻어보지 못한 아이템, 나만의 빌드를 완성시켜 줄 아이템들을 얻기 위해
수많은 방들이 생성되고 수많은 거래가 이루어지고 있으며,
이는 20년이 넘는 시간 동안 게임이 유지될 수 있었던 원동력이기도 합니다.

이렇듯 디아블로2라는 게임의 정수라 할 수 있는 아이템.
이번 글에서는 이 아이템이 게임 내에서 어떻게 생성되고 드랍되는 지
그 알고리즘에 대해 상세히 설명을 드려보고자 합니다.


[글을 시작하며...]

디아블로2의 아이템 생성 및 드랍 절차는 크게 세 가지 과정으로 나눠집니다.

첫째, 드랍시킬 아이템의 종류 결정 (미드랍 여부 포함)
둘째, 드랍시킬 아이템의 품질 결정
셋쩨, 변동 옵션 수치 및 무형/홈 생성 여부 결정 후 아이템 드랍

여기서 흔히 말하는 TC는 아이템 종류를 결정하는 첫번째 과정에 영향을 끼치고,
매찬은 종류가 결정된 이후 아이템 품질을 결정하는 두번째 과정에 영향을 끼치는데,

우선 첫번째 과정부터 차근차근 살펴보도록 하겠습니다.


◆ 첫째, 드랍시킬 아이템의 종류 결정

몬스터를 처치하면, 드랍시킬 아이템을 결정하기 위해 몬스터의 TC를 불러옵니다.
몬스터들의 TC 정보는 Monstats.txt에 아래와 같이 담겨있습니다.



여기서 각 열의 의미는 다음과 같습니다.

TreasureClass : 일반 몬스터를 처치한 경우에 호출하는 TC
TreasureClassChamp : 챔피언 등급 몬스터를 처치한 경우에 호출하는 TC
TreasureClassUnique : 유니크 등급 몬스터를 처치한 경우에 호출하는 TC
TreasureClassQuest : 퀘스트 연계 몬스터를 처치한 경우에 호출하는 TC (퀘드랍)
TreasureClassDesecrated : 공포의 영역 일반 몬스터를 처치한 경우에 호출하는 TC
TreasureClassDesecratedChamp : 공포의 영역 챔피언 등급 몬스터를 처치한 경우에 호출하는 TC
TreasureClassDesecratedUnique : 공포의 영역 유니크 등급 몬스터를 처치한 경우에 호출하는 TC

이름 뒤에 붙은 (H)는 지옥 난이도일 때 호출하는 TC임을 의미하며,
만약에 공포의 영역 TC (Desecrated)가 공란이면 대응되는 일반 TC를 호출합니다.


그 다음, 불러온 TC의 내부 정보 값을 토대로 아이템 드랍 체크를 실시합니다.
TC들의 상세 정보는 Treasureclassex.txt에 모여있으며, 구조는 아래와 같습니다.



Group은 TC들을 그룹으로 묶고 분류하기 위해 사용되는 값으로,
만약 몬스터를 처치했을 때 호출된 TC와 동일한 Group값을 갖는 TC들이 존재한다면
해당 TC들의 Level값을 조회해 몬스터 레벨이 닿는 곳까지 TC를 승격시킵니다.

예를 들면, 일반 몬스터 '해골'의 지옥 난이도 TC는 'Act 1 (H) H2H A'인데,
지역 레벨이 85인 영묘에서 등장하는 해골을 잡으면
TC가 'Act 1 (H) H2H A'에서 'Act 5 (H) H2H C'로 승격이 된다는 것입니다.

반대로 몬스터 레벨이 낮다고해서 지정된 TC보다 낮은 등급의 TC로 강등되진 않으며,
Group 값이 없다면 별다른 변동없이 Monstats에 지정된 TC를 그대로 따라갑니다.

(이러한 TC 승격은 '몬스터를 처치하고 최초로 TC를 호출하는 순간에만 일어나며
그 외 한다리 건너 호출되는 경우엔 해당 TC가 어떤 Group에 속해있다 하더라도 승격이 이루어지지 않습니다.)

Picks는 아이템 드랍 체크를 반복 실시하는 횟수로,
보스들(7회)과 일부 슈퍼유니크 몬스터들(3~5회)은 횟수가 여러 번으로 설정되어 있기에
1회로 설정된 일반 몬스터들과 다르게 동시에 여러 아이템을 드랍하게 됩니다.

Unique, Set, Rare, Magic은 0(공란)부터 1024 사이의 값을 가지는 상수로,
이후에 아이템 품질을 결정하는 단계에서 해당 등급이 나올 확률을 높여줍니다.
(자세한 내용은 두번째 과정을 설명할 때 말씀드리겠습니다.)

NoDrop은 아이템을 드랍하지 않을 확률로, 해당 정수값은 선택비(比)를 의미하며,
Item1~10은 드랍할 아이템의 코드명이나 하위 TC명을,
Prob1~10은 해당 아이템이나 TC가 선택될 선택비 값을 나타냅니다.

따라서, 저 목록 안에 있는 어떤 아이템이나 TC가 선택될 확률은
해당 Prob값을 (NoDrop + 모든 Prob값들의 합)으로 나눈 값이 됩니다.
즉, Act 5 (H) H2H C에서 Act 5 (H) Equip C가 호출될 확률은
16/(100+21+16+21+2) = 16/160 = 1/10 이 되는 것이죠.

여기서 NoDrop 수치를 낮추거나 Prob값을 높이면 아이템 드랍 확률은 높아질텐데,
다인방에서는 둘 중에 NoDrop 수치를 낮추는 방식으로 드랍률을 상향시킵니다.
이 때는 '유효 인원수'라는 개념을 사용하며, 이에 따른 NewNoDrop 수치를 아래와 같이 산출합니다.

  유효 인원수 = ⌊ 1 + (본인을 제외한 방에 있는 총 인원 수)/2 + (본인 제외한 근처 파티원 수)/2 ⌋
                     ( ⌊  ⌋ 는 내림 기호로, 소수점 아랫값은 버림 )

  ProbSum = 모든 Prob값들의 합계라 하면,

   ※ NewNoDrop = ⌊ ProbSum / { ( 1 + ProbSum/NoDrop )^(유효 인원수) - 1 } ⌋

(위 수식의 특성 상, NoDrop 수치가 높은 TC일수록 상대적으로 드랍률 증가 효과를 더 많이 받으며,
 반대로 NoDrop = 0인 TC는 드랍률 증가 효과를 전혀 보지 못 합니다.)


자, 그러면 Act 5 (H) H2H C에서 1/10 확률을 뚫고
하위 TC인 Act 5 (H) Equip C가 호출되었다면, 그 이후는 어떻게 되는 걸까요?

하위 TC 또한 TC이기 때문에, 마찬가지로 Treasureclassex.txt에 정보가 있으며
이 정보 값을 토대로 앞과 동일한 방법으로 드랍 체크를 계속합니다.
(최종적으로 아이템 코드가 선택될 때까지 이 과정을 반복한다고 보시면 됩니다.)

예를 든 Act 5 (H) Equip C의 구성을 살펴보면,



이렇게 weap, armo라는 코드들과 한단계 낮은 TC인 Act 5 (H) Equip B로 이루어진 걸 볼 수 있는데요.
weap[N], armo[N]은 N-2부터 N까지의 고유 레벨을 갖는 무기/방어구들로 구성된 TC를 의미합니다.

이 TC들은 Treasureclassex.txt에 별도로 정의되어 있진 않고 대신
weapons.txt와 armors.txt를 조회해서 해당 레벨 범위에 속한 아이템 목록을 불러와 드랍 체크를 실시합니다.



위 목록은 weapons.txt에 담긴 85~87의 고유 레벨을 갖는 무기들로,
만약 weap87이 호출된 경우 저 무기들 중 하나를 택해 최종적으로 드랍을 결정합니다.

이 때, 각 무기(또는 방어구)들의 선택비는 아이템의 type값에 따라 결정되는데,
셉터/원드/지팡이와 직업 전용 아이템들은 1, 암살자 무기는 2, 그 외 장비들은 3의 값을 갖습니다.
(장비류 아이템들의 type별 선택비는 itemtypes.txt에 rarity라는 값으로 담겨있습니다)

이런 식으로 여러 TC를 거치고 나서야 비로소 드랍될 아이템의 '종류'가 결정됩니다.


Treasureclassex.txt에는 수많은 TC들의 정보가 단순히 병렬로 나열되어있기 때문에
TC들이 어떤 식으로 연결되어있는지, 그 전체적인 구조를 파악하기가 굉장히 곤란합니다.
그래서 제 나름대로 TC들을 분류해서 계층 구조 차트를 만들어보았습니다.



뭔가 화살표가 정신없이 많긴 하지만.....
전반적으로 드랍 체크가 어떤 TC들을 거쳐 진행되는지 이해하시는 데 도움이 되리라 생각합니다.


추가로 두 가지만 더 말씀드리고, 품질 결정 단계에 대한 설명으로 넘어가겠습니다.

1. 일부 TC들은 아래처럼 Picks가 음수로 설정되어 있는 걸 볼 수 있는데요.



이건 해당 횟수만큼 Item1부터 순차적으로 호출을 진행하겠다는 의미이며,
이 때 Prob값은 선택비가 아니고, 최대로 호출받을 수 있는 횟수가 됩니다.
즉, 이 경우에는 총 3회 호출을 할 것이고
첫번째로 Act 5 (H) Uitem을 한번 호출하고나면, Uitem은 최대 호출 횟수(1회)에 도달하므로
다음 아이템으로 바톤이 넘어가 나머지 두 번은 Act 5 (H) Cpot을 호출합니다.

2. 만약 한 몬스터(주로 보스)의 아이템 드랍 체크가 이미 6번을 성공한 경우,
   드랍 체크 횟수가 남아있어도 진행하지 않고 넘어갑니다.

이 때문에 한 몬스터가 드랍할 수 있는 아이템의 갯수는 6개까지로 제한되며,
특히 5회 아이템 드랍 체크 이후에 3회 룬 드랍 체크를 하는 백작은
아이템 드랍률이 올라가는 다인방에선 오히려 룬 드랍 체크 기회가 줄어들어
룬 드랍률이 떨어지는 기이한 현상이 발생합니다.


◆ 둘째, 드랍시킬 아이템의 품질 결정

아이템 드랍 체크가 성공하여 드랍시킬 아이템이 결정되었으면,
그 다음으로 아이템의 품질을 결정합니다.

아이템 품질은 고유>세트>희귀>마법>고급>일반 순으로
아래의 품질 체크를 실시해 가장 먼저 체크에 성공한 품질로 결정되며,
만약 일반 품질 체크마저도 실패하면 '질 낮은' 품질이 됩니다.

<품질 체크 절차>

기본적으로 품질 체크의 성공 확률은 128 / N 꼴로 정해지는데,
아래 과정은 분모인 N 값을 계산하는 과정이라 보시면 됩니다.
(모든 계산은 완료 후에 소수점 이하는 버립니다.)

1. 가장 먼저, 품질의 기초Chance 값을 계산합니다.

        기초Chance = { Quality - (몬스터 레벨 - 아이템의 고유 레벨) / Divisor } * 128

    Quality와 Divisor는 itemratio.txt에 담겨있는 내부 데이터 값으로,
    좋은 품질일수록 Quality 수치는 높고, Divisor 수치는 낮습니다.
    고유 레벨은 앞에서 아이템 종류를 결정할 때 보셨던 (weapons.txt 등에 있는) level 값입니다.

2. 그 다음, 매찬을 적용해 기초Chance에서 Chance 값을 계산합니다.

       유효 매찬 = 매찬 * α / (매찬 + α)  (※ 마법 품질의 경우, 유효 매찬 = 매찬)
       Chance = 기초Chance * 100 / (100 + 유효 매찬)

   α는 점감 효과를 부여하기 위한 상수로, 고유는 250, 세트는 500, 희귀는 600의 값을 갖습니다.
   (단, 매찬이 +10%이하인 경우, 점감 효과 없음 [유효 매찬 = 매찬])

[참고] 매찬 수치에 따른 유효 매찬값 [펼치기/접기]


     


3. 만약 계산된 Chance 값이 하한값(MinChance)보다 낮을 경우, Chance 값을 MinChance로 변경합니다.
   (좋은 품질일수록 MinChance 수치가 높습니다.)

4. 마지막으로, 품질 보정 상수를 적용해 최종Chance 값을 구합니다.

       최종Chance = Chance * { 1 - (품질 보정 상수) / 1024 }

   여기서 품질 보정 상수는 앞서 Treasureclassex.txt에서 살펴보았던 Unique, Set, Rare, Magic 수치입니다.

5. 0부터 (최종 Chance - 1) 사이의 무작위 정수를 뽑아, 그 수가 128 미만이면 품질 체크 성공,
   128 이상이면 한 단계 낮은 품질로 넘어가서 1~5번 과정을 반복합니다.


만약 고유나 세트 품질로 결정되었다면,
Uniqueitems.txt와 Setitems.txt를 조회하여 드랍 가능한 고유/세트 아이템이 있는지 확인합니다.

이 때, 고유나 세트 아이템들은 고유 레벨과 별개로 각자 문턱 레벨이라는 게 또 존재해서
몬스터 레벨이 문턱 레벨보다 낮은 경우, 해당 고유/세트 아이템은 드랍불가 처리됩니다.
(Uniqueitems.txt와 Setitems.txt에 있는 level값이 바로 그 문턱 레벨입니다.) 

 드랍가능 아이템이 둘 이상이면, (선택비에 따라) 둘 중 하나를 드랍.
 드랍가능 아이템이 하나 뿐이면, 그 하나를 드랍.
 드랍가능 아이템이 없으면, 고유는 내구도가 3배인 희귀 아이템을
                                      세트는 내구도가 2배인 마법 아이템을 드랍합니다.


만약 희귀나 마법 품질로 결정되었다면, (+위에서처럼 고유/세트 아이템이 없어 미끄러진 경우)
아이템의 옵션을 결정하기 위해 접사를 부여합니다.
이에 관한 자세한 내용은 제 이전 글에 정리를 해두었으니 이쪽을 참고해주시면 감사하겠습니다.


◆ 셋쩨, 변동 옵션 수치 및 무형/홈 생성 여부 결정

상기한 과정을 거쳐 드랍할 아이템의 종류와 품질까지 결정이 완료됐으면,
마지막으로 변동 옵션의 수치와 무형 및 홈 생성 여부를 결정한 뒤에 아이템을 드랍합니다.

변동 옵션의 경우, 각각의 수치가 나올 확률은 전부 동일하고
무형 특성은 희귀 품질 이하의 아이템에서 5% 확률로 등장하며
은 고급, 일반 품질 아이템에서 33% 확률로 생성되고, 
       생성 가능한 범위 내 홈 갯수 별 확률은 모두 동일합니다.


이렇게 수많은 계산 과정이 끝나고, 마침내 우리의 화면 앞에 아이템이 떨어집니다.


[글을 마치며...]

제 나름대로 최선을 다해 개념들을 보기좋게 풀어서 설명드리고자했지만
알고리즘이라는 주제가 원체 딱딱하기도 하고, 제 필력이 부족해 내용이 잘 전달되었을지 모르겠습니다...
파악한 알고리즘을 바탕으로 직접 제작한 드랍률 계산기를 같이 첨부해드리니,
간절히 원했던 답을 찾으시는데 조금이나마 보탬이 되었으면 좋겠습니다.

혹시 내용 중에 궁금하신 점이 있거나, 계산기 사용에 문의사항이 있으시면
댓글로 말씀해주시면 여건이 되는대로 답변드리겠습니다.

긴 글 읽어주셔서 감사합니다.
모두 즐거운 디아되시고, 득룬, 득템하시길 기원합니다. :)

※ 드랍률 계산기 v1.1 업데이트 [23. 03. 24]
   - 일부 계산식 오류 수정 (미세 오차 보정항 수정)

※ 드랍률 계산기 v1.2 업데이트 [23. 03. 25]
   - 무기/방어구 아이템 드랍률 계산 오류 수정.
      (오차가 조금 치명적이라 꼭 이 버전으로 바꿔서 사용해주셔야 합니다!)