이 블로그 검색

2021년 1월 20일 수요일

heroes community 글 번역 작업. Hero Spell 전문성 처리 서브루틴.

 http://heroescommunity.com/viewthread.php3?TID=42152&pagenumber=10


Maurice의 글에서 발췌  2018년 2월 15일 


Heroes3.exe 파일을 탐색한후, Hero Spell 전문성을 처리하는 서브 루틴을 발견했습니다. 

그 어느 때보다 호기심이 많았던 나는 그효과와 각 여웅에 대한 때때로 비밀스러운 설명이 실제로 게임 내에서 어떻게 작동하는지 알아보기로 결정했습니다. 결과는 흥미롭습니다.


기본적으로 몇 가지 주문 범주가 있습니다. 각각 개별적으로 논의하겠습니다. 

정적 버프 : 일반
이 범주에서는 피의굶주림 (에쉬, 인테우스), 정확성 (주빈), 약화 (Cuthbert, 올레마, 미란다), 석갑(싸이(?), 다크스톤, 메리스트, 라베싸), 기원 (로이니스) 및 신속 ( 사이라, 테렉, 브리싸)는 동일한 효과적인 이점으로 그룹화됩니다.

제공되는 보너스는 버프하는 몬스터의 티어 (또는 약점의 경우 디 버핑)에 따라 평평한 것입니다. 이 보너스는 주문이 시전 된 모든 것에 대해 이미 가지고있는 효과에 추가됩니다.

Tier 1 & 2 : +3
Tier 3 & 4 : +2
Tier 5 & 6 : +1
Tier 7 : 추가 효과 없음

특정 보너스 유형은 주문에 따라 다릅니다. Bloodlust와 Weakness는 모두 ATK에 영향을 미치고 Precision은 Ranged ATK에 영향을 미치고 Stone Skin은 DEF에 영향을 미치며 Prayer는 ATK, DEF 및 Speed에 모두 영향을 미치고 Haste는 Speed에 영향을 미칩니다.

보시다시피이 주문은 하위 계층 생물에게 가장 큰 영향을 미칩니다. 플랫 보너스는 .exe 파일에있는 데이터 문자열에서 찾을 수 있습니다. 주소 0x0023EAA8h부터 찾을 수 있으며 다음과 같이 읽습니다. 03 00 00 00 03 00 00 00 02 00 00 00 02 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00. 각 몬스터 계층 효과는 4 바이트입니다. Tier 1부터 Tier 7까지 올라갑니다.

정적 버프 : Slayer
Slayer (Coronius)는 위 버프와 거의 동일하지만 그라디언트가 다릅니다. 주소 0x0023EAC4h부터 찾을 수 있습니다. 보시다시피, 그것은 위의 문자열의 이웃이고 04 00 00 00 03 00 00 00 02 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00을 읽습니다. 몬스터 티어, 우리는 다음을 얻습니다 :

티어 1 : +4 ATK
티어 2 : +3 ATK
티어 3 : +2 ATK
티어 4 : +1 ATK
티어 5, 6, 7 : 보너스 없음.

특정 주문 : Fortune
Fortune (Melodia, Daremyth)은 주문 학교 수준에 관계없이 3의 값으로 최대화됩니다. SPTRAITS 파일에 따르면 Fortune의 보너스는 다음과 같습니다.

미숙련 : +1 행운
기본 : +1 행운
고급 : +2 행운
전문가 : +2 행운

게임에서 영웅 전문화를 고려할 때 단순히 ( 3-SkillBonus). 즉, 총 공식을 적어
두면 효과는 다음과 같습니다. Fortune 효과 = SkillBonus (바로 위에있는 표 참조) + (3-SkillBonus)
괄호를 제거하고 빼기를 수행하면 간단합니다.
Fortune 효과 = +3 행운 .

(3-SkillBonus) 부분의 03 값은 주소 0x000E62CEh에서 찾을 수 있습니다. 행운에 대한 효과적인 보너스를 높이려면 값을 늘리십시오. 행운의 상한이 +3이므로 상한을 올리는 것은 상대적으로 무의미합니다.

특정 주문 : Fire Wall
Fire Wall (Luna)의 데미지가 두 배로 증가했습니다. 특수 효과로 데미지 구성 요소가 다시 추가됩니다. 그러나이 주문에 대해 쉽게 조작 할 주소는 없습니다.

특정 주문 : Disrupting Ray
Disrupting Ray (Aenain)는 시전시 방어력 감소에 +2 보너스를가집니다. 02의 값은 주소 0x000E62E6h에서 찾을 수 있습니다. 늘리거나 줄이면 추가 설명이 필요없는 효과가 있습니다.

특정 주문 : 매직 애로우
매직 애로우 (Ciele)는 자체 보너스 규정이있는 두 번째 데미지 스펠입니다. 이 경우 보너스로 피해가 50 % 증가합니다. 게임은 단순히 스펠 데미지를 취하고 2로 나누고 (데미지 양을 보유하는 변수의 레지스터 시프트를 통해 exe 내에서 쉽게 편집 할 수 없도록) 스펠 데미지 위에 추가하여이를 수행합니다.

주문 : 일반 공식
다른 모든 주문은 보너스를 계산하기 위해 특정 공식을 따릅니다. 두 가지 형태가 있습니다 :

비 데미지 주문 :
축복 (아델라)
치료 (올란드)
데드 애니메이트 (싼트)
부활 (알라마, 제다이트)
최면술 (아스트랄)

데미지 주문 :
체인 조명 (솔미르)
데스 리플 (셉티나)
Fireball (Xarfax)
Frost Ring (Adelaide)
Ice Bolt (Alagar)
Inferno (Xyron)
Meteor Shower (Aislinn, Deemer)

이러한 주문의 기본 효과는 SpellPower * Effective Power (각 주문에 대한 SPTRAITS 파일에 있음) + Schoollevel로 계산됩니다. 효과. 예를 들어, Magic Arrow는 유효 능력이 10이고, 주문 학교에 따라 추가 능력이 10 (미숙련), 10 (기본), 20 (고급) 또는 30 (전문가)입니다. 따라서 Advanced Magic School과 10 주문 력을 가진 영웅의 경우 Magic Arrow는 10 * 10 + 20 = 120 피해를 입 힙니다.

이 피해는 Hero Specialty 보너스가 계산되기 전에 마법 또는 아티팩트 (4 개의 요소에 대한 4 개의 오브와 같은)와 같은 효과에 의해 추가로 증가합니다.

이 Hero Specialty 보너스가 계산되면 다음 공식에 따라 수행됩니다.

Bonus = ROUND_UP (SpellEffect * 0.03 * TRUNC ((Hero Level) / (Creature Level + 1)))

보시다시피, Creature Level이 역할을합니다. : 크리처 레벨이 높을수록 전반적인 보너스가 낮아집니다. 대부분의 생물의 경우 생물 수준은 모집 할 수있는 계층보다 1이 적습니다 (본질적으로 1이 아닌 0에서 계산 됨).
(그냥 우리가 아는 레벨이 +1한값.. 단순 데이터의 대한 이야기)
예를 들어, 레벨 10의 Alagar, 10 Spell Power를 보겠습니다. Expert Water Magic School을 사용하면 보너스를 제외하고 Ice Bolt는 250 데미지를 입힐 것입니다. 그가 레벨 1 생물 (즉, Tier 2)에 그것을 시전했다고 가정 해 봅시다. 보너스는 250 * 0.03 * TRUNC (10 / 2) = 37,5가되며, 이는 38로 반올림됩니다. 레벨 1 생물에 대해,이 특별한 경우 그의 아이스 볼트는 288의 피해를 입 힙니다.

이제 대신 레벨 6 생물을 가정 해 봅시다. 그런 다음 계산은 250 * 0.03 * TRUNC (10/7) = 7,5가되며, 이는 8로 반올림됩니다. 레벨 6 생물에 대해이 특별한 경우 그의 아이스 볼트는 258 피해를 입 힙니다.

(Creature Tier + 1)의 01 값은 주소 0x000E6309h에서 찾을 수 있으며 0.03은 참조를 통해 찾을 수 있습니다. 주소 0x000E631Dh 및 추가 문자열 DC 0D 08 AC 6300, 여기서 굵은 부분은 리틀 엔디안의 메모리 참조입니다. 그것을 반전하면 포인터는 런타임 동안 0x0063AC08h 주소를 지정하는데, 이는 exe 자체에있는 위치보다 0x00400000h 더 높습니다. 따라서 포인터가 목표로하는 값은 exe 내의 주소 0x0023AC08h에서 찾을 수 있습니다. 문자열은 0.03의 16 진수 표현 인 B8 1E 85 EB 51 B8 9E 3F를 읽습니다. 주변 주소 (각각 8 바이트)에는 다른 값이 포함됩니다.

0x0023ABF8h : 7B 14 AE 47 E1 7A C4 3F = 0.16
0x0023AC00h : 8F C2 75 3D 00 00 00 00 (적절한 Double이 아님, 0.06의 부동 소수점 값)
0x0023AC08h : B8 1E 85 EB 51 B8 9E 3F = 0.03
0x0023AC10h : B8 1E 85 EB 51 B8 8E 3F = 0.015
0x0023AC18h : 9A 99 99 99 99 99 F1 3F = 1.1
0x0023AC20h : 33 33 33 33 33 33 F3 3F = 1.2
0x0023AC28h : 00 00 00 00 00 00 08 40 = 3.0
0x0023AC30h : 00 00 00 00 00 40 7F 40 = 500.0
0x0023AC38h : 00 00 00 00 00 00 00 00 = 0.0
0x0023AC40h : 00 00 00 00 00 00 00 40 = 2.0
0x0023AC48h : 00 00 00 00 00 00 14 40 = 5.0
0x0023AC50h : 00 00 00 00 00 00 F0 3F = 1.0
0x0023AC58h : 9A 99 99 99 99 99 A9 3F = 0.05

메모리 위치 포인터를 변경하여 0.03 승수의 다른 값을 선택할 수 있습니다. . 게임이 exe 내의 다른 위치에서 이러한 값을 참조하기 때문에 실제 16 진수 이중 표현을 변경하는 것은 권장되지 않습니다.
_______


어떤 이유로, 게임이 게임 내에서 무엇을 보여주고 있는지와 관련하여 위의 계산이 꺼져 있습니다. 방금 Alagar로 간단한 테스트 맵을 만들고 레벨 10에 도달 할 수있는 충분한 경험을 제공했습니다. 그의 주문 력은 제가 위에서 작성한 10을 초과하여 여러 테스트 실행에서 대신 13과 14로 펌핑했습니다. 나는 순수함을 유지하기 위해 그에게 마법 같은 스킬을주지 않도록했습니다. 나는 그에게 Expert Water Magic을 주었다.

13 및 14 Spell Power에서 그의 기본 피해는 예상대로 각각 310 및 330입니다 (이 경우 Ice Bolt의 경우 Spell Power * 20 + 50 인 Spell Power * Base Power + Spell School Bonus의 공식을 확인합니다. Expert Water Magic의 경우).

그러나 보너스 피해는 꺼져 있습니다. 7 단계 생물에 대한 보너스 피해는 두 경우 모두 +10입니다. 티어 1 생물에 대해서는 각각 +93과 +99입니다. 그러나 exe 내에서 볼 수있는 공식은 다음과 같습니다.

(signed __int64) ceil ((double) (Damage * HeroLevel / (MonsterLevel + 1)) * 0.03)

세부 정보를 입력하면 다음과 같은 결과가 나타납니다.

At Spell Power 13, 영웅 레벨 10, 파이크 맨에 대항 :

(signed __int64) ceil ((double) (310 * 10 / (1 + 1)) * 0.03) = 1550 * 0.03 = 46,5 (이것은 게임이 제공하는 것의 절반입니다. 재생 중).

그리고 Spell Power 14, Hero Level 10 :
(signed __int64) ceil ((double) (330 * 10 / (1 + 1)) * 0.03) = 1650 * 0.03 = 49,5 (이것은 다시 게임의 절반입니다 재생 중에 제공).

그러나 동시에 Angel에 대해 계산은 다음과 같습니다.
At Spell Power 13, Hero Level 10, against the Pikeman :

(signed __int64) ceil ((double) (310 * 10 / (7 + 1)) * 0.03) = 387,5 * 0.03 = 11,625 (게임 플레이 중에 게임이 제공하는 것보다 더 많음).

그리고 Spell Power 14, Hero Level 10 :
(signed __int64) ceil ((double) (330 * 10 / (7 + 1)) * 0.03) = 412,5 * 0.03 = 12,375 (이것은 게임보다 더 많은 것입니다. 재생 중에 제공).

그러나보고 된 피해는 사상자를 고려할 때 실제로 정확합니다. Spell Power 14에서 Pikemen에 대한 각각 429의 피해를 입었을 때 실제로 42 명이 죽었고 스택의 최상위는 1의 남은 HP로 살아 남았습니다. 천사들에게도 유사하게 적용됩니다. 이상한 일이 벌어지고 있습니다 ...

나는 어떻게 든 생물 계층이 1에서 7이 아닌 0에서 6으로 계산 될 것이라고 의심하고 있습니다. 그러면 파이크 맨이 오른쪽 괄호에 놓이게 될 것입니다. 그러나 천사들은 더 멀리 떨어져 있습니다.

업데이트 : .exe 파일에서 생물 특성을 자세히 설명하는 테이블을 찾았습니다. 생물 수준은 실제로 마을에 정기적으로 나타나는 0에서 6까지 세고 있습니다. Conflux만이 일부 Elemental에 대해 약간 ...

업데이트 2 : 범인을 찾았습니다! 실제로 버그라고 생각합니다 ...

어쨌든 위에서 설명한 공식은 다음과 같습니다.
(signed __int64) ceil ((double) (Damage * HeroLevel / (MonsterLevel + 1)) * 0.03)

여기서 Damage, HeroLevel 및 MonsterLevel은 모두 정수입니다. 그러면 HeroLevel을 (MonsterLevel + 1)로 나눈 값도 정수로 캐스팅됩니다. 기본적으로 점 뒤의 모든 것은 단순히 슬래시됩니다. 즉, 결과는 내림됩니다. 나누기는 곱셈이 적용되기 전에 계산되므로 문제가 복잡해집니다.

각 몬스터 레벨 (티어 1이 레벨 0이고 티어 7이 레벨 6)에 대해 레벨 10의 영웅에 대해 HeroLevel을 MonsterLevel + 1로 나누면 다음 결과가 나타납니다.

레벨 0 : 10
레벨 1 : 5
레벨 2 : 3
레벨 3 : 2
레벨 4 : 2
레벨 5 : 1
레벨 6 : 1

여기에 330 (주문 력 14 및 Expert Water Magic이있는 아이스 볼트의 피해)과 0.03을 곱하면 결과는 다음과 같습니다.

레벨 0 : +99
레벨 1 : +50
레벨 2 : +30
레벨 3 : +20
레벨 4 : +20
레벨 5 : +10
레벨 6 : +10

게임 내에서이 모든 숫자를 확인할 수있었습니다. 개인적으로 나는 이것이 실제로 버그라고 생각하며 계산에는 몇 가지 대괄호가 누락되었습니다. 다음과 같이 표시되는 경우 :

(signed __int64) ceil ((double) ( ( Damage * HeroLevel ) / (MonsterLevel + 1)) * 0.03)

대신 보너스 피해는 다음과 같습니다.

레벨 0 : +99
레벨 1 : +50
레벨 2 : +33
레벨 3 : +25
레벨 4 : +20
레벨 5 : +17
레벨 6 : +15

는 상위 단계에서 동일 해지는 대신 모든 단계에서 달라 지므로 더 자연스럽게 보입니다.


길게 썼지만, 게임내부에서 1티어유닛은 레벨0으로 취급된다는 이야기를 하고 있을 뿐이다. 

그리고 개인적으로 이 데미지 계산식이 버그 같다는 주장을 하고 있다. 나누기 연산 후 정수 캐스팅 과정에서 

상위 티어 유닛들에게 똑같은 보너스가 들어가는 것에 불만을 표하고 있다. 


Conflux Town과 함께 Elementals의 레벨과 그들이 나타나는 Tier에서 불일치를 발견했습니다. 나는 이것이 Conflux Town이 추가되기 전에 존재했고 아마도 제대로 수정되지 않았기 때문에 이것이 Elementals에서 남은 것이라고 생각합니다. Hero Spell Specialties로 인한 주문의 데미지 보너스와 관련하여 게임은 티어와 관련하여 잘못된 레벨을 사용합니다.

공기와 폭풍의 정령은 정확하지만 다른 3 가지 유형 중 기지와 업그레이드 사이에 불일치가 있습니다.

물 정령 : 2레벨, 3Tier (정답)
얼음 정령 : 3레벨, 3티어 (잘못됨)
얼음 정령은 주문전문화에 따른 추가 데미지가 적게 들어 온다. 

불의 정령 : 3레벨 4티어 (정답)
에너지 정령 : 4레벨 4티어 (잘못됨)
얼음 정령과 마찬가지로 에너지 정령도 예상보다 한 단계 높습니다.

지구 엘리멘탈 : 4레벨, 5티어 (올바른)
마그마 엘리멘탈 : 2레벨, 5티어 (잘못된)
얼음과 에너지 정령이 한단계 높은 레벨로 인해 적은 주문전문화 데미지가 적은 대신에, 마그마 정령은 2단계가 낮아쳐 원래 받아야 하는 데미지보다 많이 받는다. 

나는 그들이 어떤 엘리멘탈을 어떤 티어에서 갖고 싶어하는지를 엉망으로 만들고 최종 버전에서 생물 레벨을 수정하는 것을 잊었다 고 생각합니다. 발견되지 않았거나 수정하기에는 너무 낮은 우선 순위가없는 사소한 버그입니다.

댓글 없음:

댓글 쓰기

가장 많이 본 글