본문 바로가기

Dev./React

도스 삼국지2 - 에디터 (#4) / 플레이어 데이터 분석

 

장수 데이터(9180 byte) 이후 offset 9212 부터 6 byte까지는 아직 분석전이다.

편의상 dummy1으로 부르도록 하자

const [dummy1, setDummy1] = useState([])

 

start = 9212

length = 6

offset = start + length

const unknownDummy1 = data.slice(start, offset)

setDummy1(unknownDummy1)

totalSum += length

 

// 여기까지가 헤더(32) + 장수 데이터(9180) + dummy1(6)의 내용이다.

 

원래는 각 땅 정보를 분석 하기로 했으나

 

땅 정보가 담겨있는 offset 전에 각 플레이어의 정보가 먼저 나오므로

플레이어 정보를 먼저 분석해보자.

(라고는 했지만 아직 분석된 것이 몇개 없어서.... 그래서 건너 뛰려고 했었다.)

 

일단 장수 데이터이후의 내용을 보다보면

255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0의 내용이 여러번 반복 되는 것을 발견 할 수 있었다.

이 반복되는 내용의 길이는 41 byte이며 시작점이 장수 데이터 이후에 6 byte를 더 지나쳐야 시작되는 것이 보였으므로

앞의 6 byte는 아직 확인 된바 없기에 dummy1으로 정하고 그냥 건너뛰려 한다. ㅎㅎ

 

자 그럼 그 뒤의 반복되는 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0로 끝나는 41byte의 내용을 살펴보면,

(시나리오 1로 게임 시작후 바로 저장했을 경우이다.)

 

반복되는 개수가 총 16개이다.

장수가 총 255명이며, 땅 번호는 41번이다. 16개하고는 거리가 멀다.

 

곰곰히 생각해보니 최대로 플레이 할 수 있는 군주가 역사인물 15+신군주1 해서 16명이다.

즉, 뭔지는 모르겠지만 41byte의 내용이 각 플레이어(군주)의 게임 저장값이지 않을까 생각이 든다.

 

먼저 맨 앞의 2 byte를 보면

let tmpInfo = (data[pos++] | data[pos++] << 8)으로 보면 익숙한 값이 나온다.

첫번째 41byte의 index 0, 1의 값이 88이다...

두번째 41byte의 index 0, 1의 값이 124이다.

 

첫번째 시나리오로 플레이 했을 경우 군주의 번호 1이 조조이며, 2가 유비이다. (신군주는 16)

(조조와 유비는 군주 번호 뿐만 아니라 장수 번호도 각각 1과 2이다... 신군주는 254)

 

88과 124의 차이는 36이며 이는 장수 데이터의 크기 임을 알 수 있었다.

이전 글에서 만들었던 함수를 이용하면 장수의 idx를 얻어 올 수 있지 않을까?

const idxFromOffset = (offset) => {
    return offset>0?((offset - 88)/36 + 1):0
}

const rulerIdx = idxFromOffset(tmpInfo)

이를 이용해서 로그를 남겨보니

조조, 유비, 손견, 원소... 신군주까지 각 군주의 idx를 확인 할 수 있었다.

 

다음 세번째 / 네번째 2byte

tmpInfo = (data[pos++] | data[pos++] << 8)

 

그 다음 세, 네번째는 값이 1000을 넘어가는 값들이어서 처음에는 당췌 알 수가 없었고,

1번 조조의 그것(10210)과 2번 유비의 그것(10035)이 한참이나 차이나고 오히려 유비의 저 값이 작아서 오리무중이었다. (3번의 손견은 10630)

그러다가 모든 군주의 값들의 차이를 보니 35라는 숫자의 배수들이었다.

 

(공손찬이 10000이며, 유비가 10035, 원소가 10105, 한복이 10140

즉, 공손찬과 유비의 차가 35이며, 유비와 원소의 차가 70, 원소와 한복의 차가 35였음)

여기서 35를 하나의 단위로 본다면

공손찬과 유비의 차가 1, 유비와 원소의 차가 2, 원소와 한복의 차가 1... (한복, 공융, 조조도 각각 1씩 차이다.)

 

한참을 들여다보니 저 차이는 바로 땅 번호의 차이인 것을 알 수 있었다.

공손찬은 3번땅에서, 유비는 4번땅에서, 원소는 6번땅에서, 한복은 7번땅에서... (공융, 조조, 동탁이 각각 8, 9, 10이다.)

 

공손찬이 3번이 되려면 인덱스 2이므로 저 값에서 9930을 빼고 남은 수를 35로 나누면 된다.

const homeIdx = (tmpInfo - 9930)/35+1 (0기반이 아닌 1기반으로 하기 위해서 1을 더한다.)

 

이렇게 해서 땅 번호를 알 수 있었다.

 

다음 다섯,여섯번째 2 byte를 보니 어떤 군주는 값이 있고 어떤 군주는 값이 없었는데,

있는 군주의 값을 역시 대입해보면 (아닐 수도 있지만...)

tmpInfo = (data[pos++] | data[pos++] << 8)

이 값 역시 어디서 많이 보던 값이라 혹시 몰라 idxFromOffset을 해봤더니 장수의 idx가 나왔다.

 

군주가 자기 값이 아닌 다른 장수의 idx를 가지고 있는 경우.

그리고 처음 시작했을때 (값이 있는 경우만) 아래와 같았다.

조조 -> 진궁

손견 -> 정보

원소 -> 전풍

유표 -> 괴량

동탁 -> 가후

 

뭔가 반응이 오는가?

그렇다. 각 군주의 군사였던 것이다. (유비의 경우 값이 없었음. 당연히 유비(with 관우, 장비)로 시작할 시에 군사가 없었으므로)

 

다음 일곱, 여덟, 아홉, 열번째까지의 4byte는 아직까지 전혀 알 수가 없었다.

offset 6~9까지

 

const unknown7 = data[pos++]

const unknown8 = data[pos++]

const unknown9 = data[pos++]

const unknown10 = data[pos++]

 

 

그다음 2byte는 뭔가 규칙적이었는데 (0이니까.. ㅎㅎ)

구글링을 해보니 2byte는 16bit로 각 군주에 대한 동맹 값 (1, 0)인 걸 알았다. (콘솔게임 기준)

앞의 1 byte(8 bit)는 1~8번 군주에 대한 동맹 값 (뒤에서 부터이다)

뒤의 1 byte(8 bit)는 9~16번 군주에 대한 동맹 값이다.

(본인 X 본인 값도 포함인건 함정)

 

offset 10~11까지

 

const allianceFirst = data[pos++]

const allianceSecond = data[pos++]

 

const ruler1Alliance = allianceFirst & 0x01

const ruler2Alliance = allianceFirst & 0x02

...

const ruler8Alliance = allianceFirst & 0x80

const ruler9Alliance = allianceSecond & 0x01

...

const ruler16Alliance = allianceSecond & 0x80

 

이렇게 구할 수가 있었다.

 

그 다음 2byte는 값이 다들 있는데 아직 못찾고 있다. ㅠㅠ

offset 12~13

const unknown13 = data[pos++]

const unknown14 = data[pos++]

 

 

다음 값은 대놓고 50이라는 숫자값이 16개 있다.

offset 14~29

 

각 군주가 본인 포함 16개에 50이라는 숫자를 가질수 있는 것은 아마도 적대감이겠지??? 라고 생각하고

선물을 한번 주고 다시 봤더니 이 값이 해당 군주에 대해서 오른것을 알 수 있었다.

 

const correspond1 = data[pos++]

...

const correspond16 = data[pos++]

 

다음 11byte 는 이 플레이어 정보 분석에 힌트를 줬던 반복되는 값

255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0 인데....

잘 모른다... ㅠㅠ

 

위 255중 4번째 값의 경우

조조와 혼인을 시켰더니 0으로 바뀌었다.

다시 한번 시키려고 하니까 이미 딸이 시집갔단다...

이 값을 255로 수정한 후에 다시 시도하니 또 혼인이 가능했다.

(이때 조조의 offset 9가 0x08 -> 0xff로 바뀌었다.)

255 4번째 값이 혼일시킬 딸의 유무임을 알 수 있었다.

 

이렇게 총 41byte의 분석을 대충 해봤다.

각 unknown 값들은 분석이 되는 대로 수정할 예정이다.

 

 

 

 

 

다음은 각 땅의 정보를 알아 보도록 하자.