15. 랑그릿사2 캐릭터와 용병의 스프라이트

랑그릿사2의 캐릭터와 용병들은 스프라이트를 가지고 있습니다.
어떤 스프라이트를 가질 것인지는 다음과 같이 결정됩니다.
- 캐릭터 : 캐릭터 전용 스프라이트가 있다면 해당 스프라이트를 갖고, 그렇지 않다면 캐릭터의 클래스에 해당되는 스프라이트를 갖습니다.
- 용병 : 용병의 클래스에 해당되는 스프라이트를 갖습니다.

그러면 캐릭터 전용 스프라이트와 클래스 스프라이트에 대해 알아보겠습니다.

(1) 캐릭터 전용 스프라이트

Ghidra로 메모리 주소 00_44_1F_50 부터 00_44_1F_9F 를 살펴보면 주소로 채워져있는 것을 알 수 있습니다.
(헥스에디터 기준 00_04_0D_50 부터 00_04_0D_9F)
주소값은 little endian이고, 메모리 주소 기준이므로 헥스에디터 기준으로 변환하려면 00_40_12_00 을 빼줘야 합니다.

Offset (h)
00_44_1F_50 : 78 1B 44 00 => 00_04_09_78 (캐릭터 1: 엘윈)
00_44_1F_54 : C8 1B 44 00 => 00_04_09_C8 (캐릭터 2: 리아나)
00_44_1F_58 : 48 1C 44 00 => 00_04_0A_48 (캐릭터 3: 홀리라나)
00_44_1F_5C : 88 1C 44 00 => 00_04_0A_88 (캐릭터 4: 쉐리)
00_44_1F_60 : C8 1C 44 00 => 00_04_0A_C8 (캐릭터 5: 헤인)
00_44_1F_64 : F8 1C 44 00 => 00_04_0A_F8 (캐릭터 6: 스콧트)
00_44_1F_68 : 30 1D 44 00 => 00_04_0B_30 (캐릭터 7: 키스)
00_44_1F_6C : 68 1D 44 00 => 00_04_0B_68 (캐릭터 8: 아론)
00_44_1F_70 : A8 1D 44 00 => 00_04_0B_A8 (캐릭터 9: 레스터)
00_44_1F_74 : 08 1C 44 00 => 00_04_0A_08 (캐릭터 10: 다크라나)
00_44_1F_78 : D0 1E 44 00 => 00_04_0C_D0 (캐릭터 11: 로우가)
00_44_1F_7C : 10 1F 44 00 => 00_04_0D_10 (캐릭터 12: 소니아)
00_44_1F_80 : F0 1D 44 00 => 00_04_0B_F0 (캐릭터 13: 레온)
00_44_1F_84 : 30 1E 44 00 => 00_04_0C_30 (캐릭터 14: 발가스)
00_44_1F_88 : 98 1E 44 00 => 00_04_0C_98 (캐릭터 15: 이멜다)
00_44_1F_8C : 60 1E 44 00 => 00_04_0C_60 (캐릭터 16: 에그베르트)
00_44_1F_90 : 4C 1F 44 00 => 00_04_0D_4C (캐릭터 17: 에스트)
00_44_1F_94 : 4C 1F 44 00 => 00_04_0D_4C (캐릭터 18: 오스트)
00_44_1F_98 : 4C 1F 44 00 => 00_04_0D_4C (캐릭터 19: 레아드)
00_44_1F_9C : E0 1D 44 00 => 00_04_0B_E0 (캐릭터 20 : 제시카)
00_44_1F_A0 : 00 1C 44 00 => 00_04_0A_00 (캐릭터 21 : 다크프린세스)

해당되는 주소로 가서 데이터를 살펴보면 에스트, 오스트, 레아드는 데이터가 없으며
나머지 캐릭터들은 데이터가 있음을 알 수 있습니다.

예를 들어, 레온의 경우 헥스에디터로 00_04_0B_F0 를 살펴보면 다음의 데이터가 있습니다.

4A 00 3C 00 : 나이트마스터(4A)의 스프라이트 번호는 3C
67 00 3C 00 : 로얄가드(67)의 스프라이트 번호는 3C
D4 00 3C 00 : 로얄가드(D4)의 스프라이트 번호는 3C
C9 00 3C 00 : 나이트마스터(C9)의 스프라이트 번호는 3C
06 00 3C 00 : 나이트(06)의 스프라이트 번호는 3C
14 00 3B 00 : 로드(14)의 스프라이트 번호는 3B
19 00 3C 00 : 실버나이트(19)의 스프라이트 번호는 3C
2C 00 3B 00 : 하이로드(2C)의 스프라이트 번호는 3B
2F 00 3A 00 : 소드마스터(2F)의 스프라이트 번호는 3A
31 00 3C 00 : 하이랜더(31)의 스프라이트 번호는 3C
45 00 3B 00 : 제너럴(45)의 스프라이트 번호는 3B
48 00 3A 00 : 소드마스터(48)의 스프라이트 번호는 3A
4F 00 3D 00 : 드래곤로드(4F)의 스프라이트 번호는 3D
62 00 3A 00 : 히어로(62)의 스프라이트 번호는 3A
FF FF FF FF : FF FF FF FF는 데이터의 끝을 나타냄.

첫번째 바이트는 클래스 번호이고, 세번째 바이트는 스프라이트 번호입니다.
(클래스 번호가 어떤 클래스를 나타내는 지는 7번 글 참조)

따라서 레온의 각 클래스별 스프라이트 번호를 알아낼 수 있습니다.
이렇게 알아낸 스프라이트 번호를 십진수로 변환하고 64를 더한 값을 xxxx라고 하면
스프라이트 파일의 이름은 IMG[xxxx]A.pct가 됩니다.
예를 들어, 스프라이트 번호가 3C라면 스프라이트 파일 이름은 IMG0124A.pct가 됩니다.

이런 식으로 캐릭터 전용 스프라이트를 알 수 있습니다.

(2) 클래스 스프라이트

메모리 주소 00_44_1F_A8 (헥스에디터 기준 00_04_0D_A8)에는 클래스 스프라이트 정보가 있습니다.
총 255개 클래스이고 1개 클래스당 2바이트씩 정보가 있으므로 총 255 x 2바이트 = 510바이트가 있습니다. 
살펴보면 다음과 같습니다.

00 0C : (N/A)
4B 0C : 클래스 1 (파이터)
2F 0C : 클래스 2 (파이터)
2F 0C : 클래스 3 (파이터)
4A 0C : 클래스 4 (글래디에이터)
66 0C : 클래스 5 (뱀파이어)
4C 0C : 클래스 6 (나이트)
30 0C : 클래스 7 (나이트)
31 0C : 클래스 8 (파이어러트)
...

첫번째 바이트는 스프라이트 번호이고 두번째 바이트는 색상 팔레트를 나타냅니다.
스프라이트 번호에서 스프라이트 파일 이름을 알아내는 방법은 앞에서 설명한 캐릭터 전용 스프라이트와 동일합니다.

마지막으로 색상 팔레트에 대해 간단히 살펴보겠습니다.
13번 글을 보면, 엘윈이 고용할 수 있는 솔져는 7B인 반면에 아론이 고용할 수 있는 솔져는 7A입니다.
7번 글의 클래스 데이터를 살펴보면, 솔져(7B)와 솔져(7A)는 능력치는 동일합니다.
반면에, 솔져(7B)의 스프라이트 번호는 1, 색상 팔레트는 0D 이고
솔져(7A)의 스프라이트 번호는 1, 색상 팔레트는 0C 입니다.
둘은 같은 스프라이트 파일을 사용하지만 색상 팔레트가 다르므로, 화면 상에서 다르게 보입니다. (엘윈의 솔져는 파란색, 아론의 솔져는 흰색)

위의 방법에 따라 캐릭터 전용 스프라이트와 클래스 스프라이트 정보를 엑셀 파일로 정리해서 올려놨습니다. (다음 파일 참조)

댓글

  1. 정말 감사합니다 예전에 제가 물어봤었던 것 같은데
    덕분에 많은 도움이 되었습니다.

    답글삭제
  2. 캐릭터 전용 스프라이트의 경우 공간이 딱 맞게 할당되어있어서 헥스에디터만으로는 못 늘릴 것 같네요..

    답글삭제
  3. 음 전용 스프라이트가 없으면 범용 스프라이트를 쓰는거니까...
    short int 쓰는 캐릭터 전용 스프라이트 번호는 255보다 큰 숫자를 써도 가능할까요...
    구조가 똑같은데, 어떤건 1byte로 저장하고 어떤건 2byte로 저장하는건지 암청 골치 아프네요.

    답글삭제

댓글 쓰기

글 목록