4. 랑그릿사2 맵 데이터
랑그릿사2 PC판에서 전투가 이뤄지는 필드 맵과 관련된 파일은 다음과 같습니다.
1. resmap/LAND*.HF
2. resmap/ST*.pct
3. resmap/wST*.pct
4. scendat.res >> attr*.dat
5. spr.res >> IMG0005A.pct
많은 2D 게임들이 그렇듯 필드 맵은 타일(tile)들로 구성돼있습니다. LAND*.HF 파일은 필드 맵이 어떤 타일들로 구성됐는지 알려줍니다. 그리고 각 타일들에 대한 그림 파일이 ST*.pct 과 wST*.pct 이고, 각 타일의 지형 정보는 attr*.dat 에 있습니다.
우선 ST01.pct 파일을 살펴봅시다.
ST.pct 파일은 16 x 16 = 256개의 타일로 이뤄져있습니다. 가장 왼쪽 위가 0x00번 타일이고, 그 오른쪽은 0x01번 타일, ... 가장 오른쪽 위가 0x0F번 타일입니다. (편의상 16진수로 나타냈습니다.) 즉, 첫번째 줄은 0x00번 ~ 0x0F번 타일을 나타냅니다. 마찬가지 방식으로 두번째 줄은 0x10번 ~ 0x1F번 타일을 나타냅니다. 마지막 줄은 0xF0번 ~ 0xFF번 타일을 나타냅니다.
wST.pct 파일은 ST.pct 파일과 비슷하며, 차이는 음영처리가 됐다는 것입니다.
자 이제 LAND01.HF를 살펴봅시다. 헥스에디터로 열어보면 다음과 같이 나타납니다.
Offset(h)
00000000 : 1B 00 00 00 2C 00 00 00 00 00 00 00 00 00 00 00
00000010 : 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F
00000020 : 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 1D 1E 1D 1E
00000030 : 1D 0E 23 3C 61 61 61 61 62 63 0A 0B 0B 0C 31 18
00000040 : 21 21 21 21 21 7F 7F 15 16 15 16 15 06 08 04 61
00000050 : 61 61 61 62 63 12 13 13 11 18 21 21 21 29 29 2A
...
앞의 16바이트는 헤더에 해당됩니다. 처음 4바이트(1B 00 00 00)는 맵의 너비(width) 또는 열을 나타내고, 그 다음 4바이트(2C 00 00 00)는 맵의 높이(height) 또는 행을 나타냅니다. little endian 방식으로 해석해보면, 맵은 행이 44, 열이 27인 배열이 됩니다.
헤더가 끝나고 그 뒤의 44 x 27 = 1188 바이트는 실제로 필드 맵이 어떤 타일들로 구성되는지 알려줍니다. 보기 좋게 정리하면 다음과 같습니다.
7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F
7F 1D 1E 1D 1E 1D 0E 23 3C 61 61 61 61 62 63 0A 0B 0B 0C 31 18 21 21 21 21 21 7F
7F 15 16 15 16 15 06 08 04 61 61 61 61 62 63 12 13 13 11 18 21 21 21 29 29 2A 7F
7F 1D 1E 1D 1E 1D 0E 12 11 01 61 34 4D 25 56 61 01 61 18 21 21 21 2A 08 66 09 7F
7F 15 16 0E 0D 0E 23 34 61 61 61 4D 25 56 5A 61 61 18 21 21 21 2A 08 64 13 65 7F
7F 0D 0E 34 3C 18 19 07 07 1A 61 55 63 01 18 07 19 21 21 21 2A 61 0A 0C 35 0A 7F
...
필드 맵이 어떤 타일로 구성됐는지도 알고 각 타일의 그림도 알고 있으니 이를 조합하면 다음과 같이 필드 맵을 만들어 낼 수 있습니다.
이제 attr01.dat 를 살펴봅시다. (scendat.res 파일 안에 들어있습니다.) 파일크기는 512 바이트이며, 타일의 개수가 256개이므로, 타일 1개당 2바이트의 정보를 갖습니다.
Offset(h)
00000000 : 00 00 03 6E 03 6B 03 6C 03 6D 04 05 04 06 06 07
00000010 : 00 6B 00 6D 03 73 03 74 03 75 04 0D 04 0E 01 0F
00000020 : 00 7B 00 7D 03 7B 03 7C 03 7D 04 15 04 16 0D 7E
00000030 : 14 18 06 19 14 1A 14 1B 14 1C 04 1D 04 1E 01 1F
00000040 : 06 20 06 21 06 22 04 23 00 6E 02 71 02 69 0D 7E
00000050 : 14 28 06 29 14 2A 00 6E 00 1F 02 6E 02 79 0D 7E
...
예를 들어, 00번 타일은 00 00, 01번 타일은 03 6E, 02번 타일은 03 6B, 03번 타일은 03 6C, ... , FF번 타일은 01 FF 입니다.
여기서 두번째 바이트는 사용하지 않고 첫번째 바이트만 사용합니다. (두번째 바이트는 메테오 등의 마법으로 지형이 파괴됐을 때 대체되는 타일 번호를 나타냅니다.)
이 첫번째 바이트 정보는 다음과 같이 지형의 종류를 나타냅니다.
(참고로, 필드 맵에서 특정 지형을 선택했을 때 왼쪽 아래에 지형 정보를 나타나는 그림은 spr.res 파일 안에 IMG0005A.pct 에 있습니다.)
위의 표를 이용하면 다음과 같이 타일의 지형 정보를 알 수 있습니다.
이렇게 알아낸 지형 정보는 지형보너스 계산과 전투화면 구성에 사용됩니다. 이 부분은 나중에 살펴보겠습니다.
1. resmap/LAND*.HF
2. resmap/ST*.pct
3. resmap/wST*.pct
4. scendat.res >> attr*.dat
5. spr.res >> IMG0005A.pct
많은 2D 게임들이 그렇듯 필드 맵은 타일(tile)들로 구성돼있습니다. LAND*.HF 파일은 필드 맵이 어떤 타일들로 구성됐는지 알려줍니다. 그리고 각 타일들에 대한 그림 파일이 ST*.pct 과 wST*.pct 이고, 각 타일의 지형 정보는 attr*.dat 에 있습니다.
우선 ST01.pct 파일을 살펴봅시다.
ST.pct 파일은 16 x 16 = 256개의 타일로 이뤄져있습니다. 가장 왼쪽 위가 0x00번 타일이고, 그 오른쪽은 0x01번 타일, ... 가장 오른쪽 위가 0x0F번 타일입니다. (편의상 16진수로 나타냈습니다.) 즉, 첫번째 줄은 0x00번 ~ 0x0F번 타일을 나타냅니다. 마찬가지 방식으로 두번째 줄은 0x10번 ~ 0x1F번 타일을 나타냅니다. 마지막 줄은 0xF0번 ~ 0xFF번 타일을 나타냅니다.
wST.pct 파일은 ST.pct 파일과 비슷하며, 차이는 음영처리가 됐다는 것입니다.
자 이제 LAND01.HF를 살펴봅시다. 헥스에디터로 열어보면 다음과 같이 나타납니다.
Offset(h)
00000000 : 1B 00 00 00 2C 00 00 00 00 00 00 00 00 00 00 00
00000010 : 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F
00000020 : 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 1D 1E 1D 1E
00000030 : 1D 0E 23 3C 61 61 61 61 62 63 0A 0B 0B 0C 31 18
00000040 : 21 21 21 21 21 7F 7F 15 16 15 16 15 06 08 04 61
00000050 : 61 61 61 62 63 12 13 13 11 18 21 21 21 29 29 2A
...
앞의 16바이트는 헤더에 해당됩니다. 처음 4바이트(1B 00 00 00)는 맵의 너비(width) 또는 열을 나타내고, 그 다음 4바이트(2C 00 00 00)는 맵의 높이(height) 또는 행을 나타냅니다. little endian 방식으로 해석해보면, 맵은 행이 44, 열이 27인 배열이 됩니다.
헤더가 끝나고 그 뒤의 44 x 27 = 1188 바이트는 실제로 필드 맵이 어떤 타일들로 구성되는지 알려줍니다. 보기 좋게 정리하면 다음과 같습니다.
7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F
7F 1D 1E 1D 1E 1D 0E 23 3C 61 61 61 61 62 63 0A 0B 0B 0C 31 18 21 21 21 21 21 7F
7F 15 16 15 16 15 06 08 04 61 61 61 61 62 63 12 13 13 11 18 21 21 21 29 29 2A 7F
7F 1D 1E 1D 1E 1D 0E 12 11 01 61 34 4D 25 56 61 01 61 18 21 21 21 2A 08 66 09 7F
7F 15 16 0E 0D 0E 23 34 61 61 61 4D 25 56 5A 61 61 18 21 21 21 2A 08 64 13 65 7F
7F 0D 0E 34 3C 18 19 07 07 1A 61 55 63 01 18 07 19 21 21 21 2A 61 0A 0C 35 0A 7F
...
필드 맵이 어떤 타일로 구성됐는지도 알고 각 타일의 그림도 알고 있으니 이를 조합하면 다음과 같이 필드 맵을 만들어 낼 수 있습니다.
이제 attr01.dat 를 살펴봅시다. (scendat.res 파일 안에 들어있습니다.) 파일크기는 512 바이트이며, 타일의 개수가 256개이므로, 타일 1개당 2바이트의 정보를 갖습니다.
Offset(h)
00000000 : 00 00 03 6E 03 6B 03 6C 03 6D 04 05 04 06 06 07
00000010 : 00 6B 00 6D 03 73 03 74 03 75 04 0D 04 0E 01 0F
00000020 : 00 7B 00 7D 03 7B 03 7C 03 7D 04 15 04 16 0D 7E
00000030 : 14 18 06 19 14 1A 14 1B 14 1C 04 1D 04 1E 01 1F
00000040 : 06 20 06 21 06 22 04 23 00 6E 02 71 02 69 0D 7E
00000050 : 14 28 06 29 14 2A 00 6E 00 1F 02 6E 02 79 0D 7E
...
예를 들어, 00번 타일은 00 00, 01번 타일은 03 6E, 02번 타일은 03 6B, 03번 타일은 03 6C, ... , FF번 타일은 01 FF 입니다.
타일
|
바이트 정보
|
|
첫번째
|
두번째
|
|
00
|
00
|
00
|
01
|
03
|
6E
|
02
|
03
|
6B
|
03
|
03
|
6C
|
04
|
03
|
6D
|
05
|
04
|
05
|
06
|
04
|
06
|
...
|
...
|
...
|
FF
|
01
|
FF
|
여기서 두번째 바이트는 사용하지 않고 첫번째 바이트만 사용합니다. (두번째 바이트는 메테오 등의 마법으로 지형이 파괴됐을 때 대체되는 타일 번호를 나타냅니다.)
이 첫번째 바이트 정보는 다음과 같이 지형의 종류를 나타냅니다.
바이트
|
지형 종류
|
00
|
평지
|
01
|
황무지
|
02
|
도로
|
03
|
숲
|
04
|
모래언덕
|
05
|
산
|
06
|
수중
|
07
|
성
|
08
|
실내바닥
|
09
|
벽
|
0A
|
실내
|
0B
|
신전
|
0C
|
왕좌
|
0D
|
다리
|
0E
|
현수교
|
0F
|
빈공간
|
10
|
동굴
|
11
|
용암
|
12
|
묘지
|
13
|
배위
|
14
|
수상
|
15
|
지붕
|
16
|
뱃전
|
17
|
모래바닥
|
18
|
거리
|
19
|
이공간
|
1A
|
폐허
|
1B
|
높은벽
|
1C
|
금지구역
|
(참고로, 필드 맵에서 특정 지형을 선택했을 때 왼쪽 아래에 지형 정보를 나타나는 그림은 spr.res 파일 안에 IMG0005A.pct 에 있습니다.)
위의 표를 이용하면 다음과 같이 타일의 지형 정보를 알 수 있습니다.
타일
|
지형 정보
|
|
바이트
|
지형 종류
|
|
00
|
00
|
평지
|
01
|
03
|
숲
|
02
|
03
|
숲
|
03
|
03
|
숲
|
04
|
03
|
숲
|
05
|
04
|
모래언덕
|
06
|
04
|
모래언덕
|
07
|
06
|
수중
|
08
|
00
|
평지
|
09
|
00
|
평지
|
0A
|
03
|
숲
|
0B
|
03
|
숲
|
...
|
...
|
...
|
FF
|
01
|
황무지
|
이렇게 알아낸 지형 정보는 지형보너스 계산과 전투화면 구성에 사용됩니다. 이 부분은 나중에 살펴보겠습니다.
제 바이너리에서는 썬더마법함수가 0040f5e9(Ghidra)에 있습니다.
답글삭제첫번째 바이트에서 수상이거나(or) 두번째 바이트에서 수중이면, 썬더마법에
방무뎀(?)1이 추가되는군요.
맵을 커스터마이징 해서, 새롭게 미션을 만들거나 할 때는 두번째 바이트도 신경써야할 것 같네요.