D2S는 .d2s 파일을 구문 분석하는 데 사용되는 GO에 작성된 이진 파서입니다. 이것은 게임 디아블로 II가 특정 문자에 대한 모든 정보를 저장하기 위해 사용하는 이진 형식입니다.
이 패키지는 Slash Diablo라는 Diablo II의 개인 서버 용으로 구축되어 서버의 모든 문자를위한 무기고를 구축했습니다. 어느 시점에서 특정 캐릭터에 대한 모든 것을 볼 수있는 곳. 다음은 몇 가지 예입니다.
$ go get github.com/nokka/d2s package main
import (
"fmt"
"log"
"os"
"github.com/nokka/d2s"
)
func main () {
path := "nokka.d2s"
file , err := os . Open ( path )
if err != nil {
log . Fatal ( "Error while opening .d2s file" , err )
}
defer file . Close ()
char , err := d2s . Parse ( file )
if err != nil {
log . Fatal ( err )
}
// Prints character name and class.
fmt . Println ( char . Header . Name )
fmt . Println ( char . Header . Class )
} 헤더는 대부분의 문자 메타 데이터를 포함하는 765 byte 길이의 구조물입니다.
| 오프셋 | 바이트 | 설명 |
|---|---|---|
| 0 | 4 | 식별자 |
| 4 | 4 | 버전 ID |
| 8 | 4 | 파일 크기 |
| 12 | 4 | 체크섬 |
| 16 | 4 | 활성 무기 |
| 20 | 16 | 캐릭터 이름 |
| 36 | 1 | 캐릭터 상태 |
| 37 | 1 | 캐릭터 진행 |
| 38 | 2 | 알려지지 않은 |
| 40 | 1 | 캐릭터 클래스 |
| 41 | 2 | 알려지지 않은 |
| 43 | 1 | 캐릭터 레벨 |
| 44 | 4 | 알려지지 않은 |
| 48 | 4 | 마지막으로 플레이했습니다 |
| 52 | 4 | 알려지지 않은 |
| 56 | 64 | 할당 된 기술 |
| 120 | 4 | 왼쪽 마우스 버튼 스킬 ID |
| 124 | 4 | 오른쪽 마우스 버튼 스킬 ID |
| 128 | 4 | 왼쪽 스왑 마우스 버튼 스킬 ID |
| 132 | 4 | 마우스 버튼 기술 ID를 오른쪽 스왑합니다 |
| 136 | 32 | 캐릭터 메뉴 모양 |
| 168 | 3 | 어려움 |
| 171 | 4 | 지도 ID |
| 175 | 2 | 알려지지 않은 |
| 177 | 2 | 용병 사망 |
| 179 | 4 | 용병 ID |
| 183 | 2 | 용병 이름 ID |
| 185 | 2 | 용병 유형 |
| 187 | 4 | 용병 경험 |
| 191 | 144 | 알려지지 않은 |
| 335 | 298 | 퀘스트 |
| 633 | 81 | 웨이 포인트 |
| 714 | 51 | NPC 소개 |
캐릭터 이름은 [16]byte 로 삐걱 거리는 byte 당 하나의 문자가 포함됩니다. 이름의 길이는 16 자일 수 있으며, 짧은 이름은 16 bytes 에 도달 할 때까지 이름의 0x00 을 패딩했습니다.
- 또는 _ 포함 할 수 있습니다. 문자 상태는 캐릭터의 상태에 따라 다른 비트가 설정되는 byte 입니다. 여전히 그들 모두를 알아 내지 못했지만 여기에 가장 중요한 것들이 있습니다.
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|
| ? | 사다리 | 확장 | ? | 죽었다 | 하드 코어 | ? | ? |
아직 구현되지 않았습니다.
ACT 보스를 죽일 때마다 가치가 증가합니다.
| 값 | 기준 | 하드 코어 |
|---|---|---|
| 0-3 | - | - |
| 4-7 | 선생님/Dame | 수/카운트 |
| 8-11 | 주님/레이디 | 공작/공작 부인 |
| 12 | 남작/남작 | 왕/퀸 |
| 값 | 확장 | 확장 하드 코어 |
|---|---|---|
| 0-3 | - | - |
| 5-8 | 살해자 | 파괴자 |
| 10-13 | 챔피언 | 정복자 |
| 15 | 가부장/족장 | 보호자 |
문자 클래스는 다른 값이 클래스를 나타내는 byte 입니다.
| 수업 | 값 |
|---|---|
| 아마존 | 0x00 |
| 마법사 | 0x01 |
| 점쟁이 | 0x02 |
| 무협가 | 0x03 |
| 야만인 | 0x04 |
| 드루이드 | 0x05 |
| 암살자 | 0x06 |
마지막으로 플레이 한 것은 unit32 Unix Timestamp EG 1495882861 로 저장됩니다.
할당 된 기술 섹션은 각각 4 byte 정수 (UINT32)의 16 개의 스킬 ID 배열입니다. 기술이 할당되지 않으면 값은 0x00 입니다.
Quests Struct는 게임의 모든 퀘스트를 설명하는 298 byte 섹션이며 ACT Traveling 및 NPC 소개에 대한 데이터도 포함되어 있습니다. 각 퀘스트는 2 byte 길이입니다.
| 오프셋 | 바이트 | 콘텐츠 |
|---|---|---|
| 335 | 4 | 우호! |
| 339 | 6 | 알려지지 않은 |
퀘스트는 2 byte 이며, 퀘스트가 완료되었는지 여부에 대한 가장 중요한 데이터를 보유하는 일반 quest 구조를 만들었습니다. 각 퀘스트에는 퀘스트의 다양한 이정표에 따라 많은 고유 한 비트가 있습니다. 예를 들어 퀘스트 "감옥의 Ice"에서 저항 스크롤을 소비 한 경우.
| 조금 | 설명 |
|---|---|
| 0 | 퀘스트가 완료되었습니다 |
Ice of Ice는 캐릭터가 두루마리에서 저항이 증가했는지 여부를 알아야했기 때문에 내가 구현하려는 유일한 퀘스트입니다.
| 조금 | 설명 |
|---|---|
| 0 | 퀘스트가 완료되었습니다 |
| 7 | 소비 된 스크롤 |
이 구조는 정상적이고 악몽과 지옥을 위해 한 번만 3 번 반복합니다. 오프셋은 퀘스트 구조물로의 오프셋입니다.
| 오프셋 | 바이트 | 설명 |
|---|---|---|
| 0 | 2 | Act I에서 Warriv에 소개 된 경우 1 로 설정하십시오. |
| 2 | [6]quest | Act I에 대한 6 가지 퀘스트 모두 |
| 14 | 2 | Act II로 여행 한 경우 1 로 설정하십시오. |
| 16 | 2 | Jerhyn에 소개 된 경우 1 로 설정하십시오. |
| 18 | [6]quest | ACT II에 대한 6 가지 퀘스트. |
| 30 | 2 | Act III을 방문한 경우 1 로 설정하십시오. |
| 32 | 2 | Hratli에 소개 된 경우 1 로 설정하십시오. |
| 34 | [6]quest | Act III에 대한 6 가지 퀘스트. |
| 46 | 2 | Act IV로 여행 한 경우 1 로 설정하십시오. |
| 48 | 2 | Act IV에 소개 된 경우 1 으로 설정하십시오. (여행 한 경우 가지고있는 것) |
| 50 | [6]quest | Act IV에는 3 개의 퀘스트 만 있으므로 구조물에는 6 개의 빈 바이트가 있습니다. |
| 62 | 2 | ACT V를 방문한 경우 1 로 설정하십시오. |
| 64 | 2 | 테러가 끝나고 행위 IV에서 카인과 대화 한 후 1로 설정된 것 같습니다. |
| 66 | 4 | 일종의 패딩 인 것 같습니다. |
| 70 | [6]quest | ACT V에 대한 6 가지 퀘스트 |
| 82 | 14 | 모든 퀘스트 데이터 후에 일종의 패딩. |
구현되지 않았습니다
구현되지 않았습니다
헤더는 속성 섹션이며,이 섹션 레이아웃은 9 bit 속성 ID 배열로 구성되며 n bit 길이 속성 값이 이어집니다. 섹션은 0x1ff 의 9 bit 값으로 종료됩니다. 이 필드는 약간 반전되어 있음을 언급 할 가치가 있습니다. 기본적으로 비트 00100111 찾으면 11100100 으로 역전됩니다.
| ID | 기인하다 |
|---|---|
| 0 | 힘 |
| 1 | 에너지 |
| 2 | 재치 |
| 3 | 활력 |
| 4 | 사용되지 않은 통계 |
| 5 | 사용되지 않은 기술 |
| 6 | 현재 HP |
| 7 | 맥스 HP |
| 8 | 현재 마나 |
| 9 | 맥스 마나 |
| 10 | 현재 체력 |
| 11 | 맥스 체력 |
| 12 | 수준 |
| 13 | 경험 |
| 14 | 금 |
| 15 | 보관 된 금 |
| 비트 길이 | 기인하다 |
|---|---|
| 10 | 힘 |
| 10 | 에너지 |
| 10 | 재치 |
| 10 | 활력 |
| 10 | 사용되지 않은 통계 |
| 8 | 사용되지 않은 기술 |
| 21 | 현재 HP |
| 21 | 맥스 HP |
| 21 | 현재 마나 |
| 21 | 맥스 마나 |
| 21 | 현재 체력 |
| 21 | 맥스 체력 |
| 7 | 수준 |
| 32 | 경험 |
| 25 | 금 |
| 25 | 보관 된 금 |
for {
// 1. read 9 bits id. (reverse them)
// 2. if the id is 0x1ff, terminate the loop
// 3. read bit length from attribute map for that id.
// 4. read bit length nr of bits.
} 기술은 if 와 30 byte 의 기술 데이터를 가진 2 byte 헤더가 포함 된 32 byte 섹션입니다. 각 수업에는 30 개의 기술이 제공되므로 각 기술은 각각 1 byte 얻습니다. 기술 매핑에 대한 까다로운 부분은 각 클래스가 클래스 별 기술이 시작되는 기술 맵에 다른 오프셋을 가지고 있다는 것입니다. 예를 들어 Assassin의 오프셋은 251 입니다. 이는 암살자 기술이 정확히 30 인덱스 인 251 과 281 의 지수 사이에 있음을 의미합니다.
| 유형 | 바이트 | 값 |
|---|---|---|
| 헤더 | 2 | if |
| 기술 | 30 | [30] 기술 |
| 수업 | 오프셋 |
|---|---|
| 아마존 | 6 |
| 마법사 | 36 |
| 점쟁이 | 66 |
| 무협가 | 96 |
| 야만인 | 126 |
| 드루이드 | 221 |
| 암살자 | 251 |
이것은 읽기가 가장 까다로운 부분입니다. 항목 섹션은 값 JM 포함하는 4 byte uint16 로 시작합니다. 장착, 재고, 보관소, 큐브 및 벨트가 모두 포함되어 있습니다.
각 항목의 비트 길이는 품질, 소켓 수 및 마법의 속성에 따라 다르기 때문에 섹션의 바이트 길이는 전체적으로 읽기 전에 알려지지 않았습니다.
각 항목은 특정 패턴을 따릅니다.
각 항목은 모든 항목에 포함 된 111 비트의 간단한 데이터로 시작합니다. 이것은 항목 유형과 같은 정보입니다. 소켓이있는 경우 장비 또는 보관함 등과 같은 위치 ID 등이 있습니다.
각 항목에는 또한 1 비트 길이의 SimpleItem 이라는 부울이 있습니다. 1 으로 설정되면 항목에는 더 이상 비트가 포함되지 않으며 다음 항목이 시작됩니다.
항목이 간단한 항목이 아닌 경우 초기 111 비트에 따라 수많은 데이터가 있음을 의미합니다. 이것의 몇 가지 예는 희귀 수준, 마법의 접미사, 마법의 접미사입니다. 만약 그것이 런 워드, 개인화, 세트의 일부, 클래스 별 등이라면.
마지막으로, 항목에 항목이있는 경우 런 워드, 마법, 희귀, 제작, 독특한 부분 등에 따라 마법 속성 목록이 있습니다.
이 목록은 다음을 읽을 속성 섹션과 유사합니다.
9 bit idn bits of magical properties0x1ff terminator 터미네이터 0x1ff 에 닿으면 다음 항목이 시작됩니다.
마법의 속성은 품목에서 발생할 수있는 고유 한 속성이며, 각 속성은 비트 길이가 다르며지도는 엄청납니다.
이것은 3 비트 길이 각각 2 비트 필드를 포함하는 ID 83 있는 마법의 속성입니다.
83 : {Bits: [] uint { 3 , 3 }, Name : "+{1} to {0} Skill Levels" },모든 마법 속성은 item.go 파일에 매핑됩니다.
당신의 캐릭터가 현재 죽었고 게임에 들어갈 때 시체가 지상에 있다면, 장착 된 아이템은이 아이템에 있습니다. 헤더 JM 포함하는 시체 헤더 16 bytes 와 항목 목록과 유사한 항목 수입니다.
시체 항목을 읽는 것은 이전 항목의 이전 섹션과 같이 정확한 방식으로 수행됩니다.
당신의 캐릭터가 확장에서 만들어지면 파괴의 군주에 2 개의 더 많은 섹션이 포함되어 있다면.
용병 섹션은 값 jf 의 2 byte 헤더로 시작하며 용병이 현재 착용하고있는 품목의 수를 포함하는 4 byte 아이템 헤더가 이어집니다. 항목은 다른 항목 목록과 같이 읽습니다.
캐릭터가 네크로맨서와 확장 문자 인 경우,이 섹션은 3 byte 헤더로 시작합니다. 여기서 첫 두 바이트는 헤더 kf 와 hasGolem 이라는 부울이 뒤 따릅니다.
Contributing.md를 참조하십시오.