8. 랑그릿사2 병종 상성 데이터

랑그릿사2 PC판의 병종 목록은 7번 글에서 살펴봤습니다. 이번에는 병종 간의 상성을 살펴보겠습니다.

상성 데이터는 메모리 주소 00_44_31_60 (헥스에디터 기준 00_04_1F_60) 에 있습니다. 병종이 총 18개가 있으므로 병종간 조합은 총 18 x 18 = 324개가 있고 조합 하나당 2바이트씩 정보가 있으므로 총 324 x 2바이트 = 648바이트가 있습니다.

헥스에디터로 langpc2.exe를 열어봅시다.

Offset (h)
00000000 : 00 00 00 00 19 0A 00 00 00 00 00 00 00 00 00 00
00000010 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 05
00000020 : 05 05 00 00 00 00 00 00 19 0A 00 00 00 00 00 00
...

처음 36바이트는 보병-일반이 다른 병종을 상대할 때 갖는 상성보너스입니다.

00 00 : 보병-일반을 상대하는 경우 (상성보너스 없음.)
00 00 : 보병-승병을 상대하는 경우 (상성보너스 없음.)
19 0A : 장창을 상대하는 경우 (공격 +25%, 방어 +10%)
00 00 : 기마-일반을 상대하는 경우 (상성보너스 없음.)
00 00 : 기마-특수를 상대하는 경우 (상성보너스 없음.)
00 00 : 비병을 상대하는 경우 (상성보너스 없음.)
00 00 : 보병-도적을 상대하는 경우 (상성보너스 없음.)
00 00 : 수병-일반을 상대하는 경우 (상성보너스 없음.)
00 00 : 겔을 상대하는 경우 (상성보너스 없음.)
00 00 : 마족을 상대하는 경우 (상성보너스 없음.)
00 00 : 수병-해수를 상대하는 경우 (상성보너스 없음.)
00 00 : 보병-야복을 상대하는 경우 (상성보너스 없음.)
00 00 : 보병-법사를 상대하는 경우 (상성보너스 없음.)
00 00 : 불사-귀혼을 상대하는 경우 (상성보너스 없음.)
00 00 : 불사-일반을 상대하는 경우 (상성보너스 없음.)
05 05 : 궁병-일반을 상대하는 경우 (공격 +5%, 방어 +5%)
05 05 : 궁병-특수를 상대하는 경우 (공격 +5%, 방어 +5%)
00 00 : 용족을 상대하는 경우 (상성보너스 없음.)


마찬가지로 그 이후의 36바이트는 보병-승병이 다른 병종을 상대할 때 갖는 상성보너스이고, 그 이후의 데이터도 같은 방식으로 해석하면 됩니다.

이와 같이 상성 데이터를 분석해서 엑셀파일로 정리해서 올려놨습니다. (다음 파일 참고)
https://drive.google.com/open?id=1l0pJjmG7EI4nVCFncg7XsLRVm7G-Gk_p

그러면 이렇게 알아낸 상성보너스가 어떤 식으로 적용되는지 예를 들어 살펴보겠습니다.

용병 파이크의 기본 공방은 18/18이고 엘윈의 보정치가 7/8이므로 보정후의 공방은 25/26입니다. 파이트의 병종은 장창이고 헬하운드의 병종은 기마-일반이므로 상성보너스는 공격 +20%, 방어 +22%입니다. 따라서 파이크의 상성보너스 적용후 최종 공방은 25 x 1.2 = 30, 26 x 1.22 = 31 (소수점 이하 버림) 이므로 30/31 이 됩니다. 헬하운드는 상성보너스가 없으므로 화면에 보이는 그대로 30/17이 최종 공방이 됩니다.
파이크의 공격은 30이고 헬하운드의 방어는 17이므로 둘의 차이는 13입니다. 헬하운드의 지형방어가 5%이므로 약간 경감되어 파이크의 최종 공방차는 13 x (100 - 5) / 10 = 123 (소수점 이하 버림) 이 됩니다. 화면에서 보이지는 않지만 엘윈의 레벨은 4이고, 상대 지휘관의 레벨은 6이므로 공격판정기준값은 100 - (4 - 6) x 2 = 104가 됩니다. 이후 계산과정은 랜덤하게 이뤄지며, 공방차(123)가 공격판정기준값(104)보다 크고 HP가 10이므로 거의 10의 데미지가 들어가게 됩니다.
반면에 헬하운드의 공격은 30이고 파이크의 방어는 31이므로 둘의 차이는 (-1)입니다. 1보다 작은 값이므로 보정되서 1이 됩니다. 파이크의 지형방어가 5%이므로 헬하운드의 최종 공방차는 1 x (100 - 5) / 10 = 9 가 됩니다. 공격판정기준값은 100 - (6 - 4) x 2 = 96이 됩니다. 공방차(9)가 공격판정기준값(96)의 1/10 보다 작은 수준이고 HP가 10이므로 0~1 정도의 데미지가 들어가게 됩니다.

댓글

  1. 리바이어선이 닉시한테 얻어 터지는 이유가 있었네요...
    그리고 리바이어선(쫄따구??)이 드라군한테는 잘 버티더만 다 이유가 있군요.

    승병으로 다른거 다 잡더니 아크데몬이랑 싸울 때는 같이 죽거나 더죽는 이유도 보이네요...
    보너스가 상대적으로 다른거에 비해서 작으니... 능력치 차가 극복이 안되는구나...

    답글삭제
    답글
    1. 그리고 데미지 공식은 자세히 다른글 더 읽어보겠습니다.

      삭제
  2. 오랜만에 다시왔습니다. 데미지 판정공식은 다른데서 찾아볼 수가 없는데, 관련문서가 있으면 링크를 좀 주시면 안될까요. 아니면 리버스 엔지니어링으로 직접 알아내신건가요.
    레벨보정이나 이런 부분들은 어떻게 알게 되신지 궁금합니다.

    답글삭제
    답글
    1. 데미지 계산 공식은 리버스 엔지니어링으로 제가 직접 알아낸 것입니다. 0x00411300 주소에 있는 함수에서 공방차, 공격판정기준값 등을 계산하고, 0x0041D7C0 주소에 있는 함수 등을 통해서 랜덤하게 데미지를 계산합니다. (주소는 Ghidra 기준)

      삭제
    2. 삽질을 열심히 해보니... 진짜 고생 많으셨겠어요. 감사합니다.

      삭제
  3. 안녕하세요. 제 버전이 이상해서 같은 위치는 아니긴 한데, 해당 코드를 저도 찾았습니다.

    지형보너스보정_공방차값 < 공격판정기준 값일 때,(방어자가 강력일 때) 위에 적힌 것처럼 작동하고,

    공격자가 강력한 경우는, 그냥 바로 체력이 최종 데미지 값으로 들어가는 것 같습니다.
    랜덤함수까지 해서, 실제로 몇번치면 한번씩 공격이 성공하거나 하는 부분은 ghidra가 해당 메모리 참조하는 코드들(xref)연결을 다 찾아도 안보여서 잘 모르겠네요.

    위 적힌 부분을 다시 쓰자면 이렇게 되는거 같습니다.

    HP보정 공격력 x Min[ 1, 최종공방차/ 공격판정기준값 ]
    HP 보정 공격력은, 지휘관 타입(오우거, 소환수 포함) 은 5+ [체력/2]이고, 용병은 HP입니다.

    답글삭제
    답글
    1. 데미지 계산 관련해서는 꽤 복잡해서 파악하기가 쉽지 않아서 저도 어느 정도 분석하다가 그만뒀습니다. 더 깊게 분석하고 싶다면, 정적분석(Ghidra같은 디스어셈블러)만으로는 한계가 있으니 동적분석(디버거)도 같이 하는 것을 추천드립니다.

      삭제

댓글 쓰기

글 목록