자가회복
오프셋 0041729e에 턴을 받을 때 자가회복을 하는 코드가 담겨 있습니다.
모든 지휘관에 대해서 루프를 돕니다.
참이 걸려있을 때는 권한이 이리저리로 넘어가서 복잡하게 작동합니다. 이게 진짜 내꺼지
체크하는 코드들이 여기저기 있는데, 이건 무시합시다.
가장 먼저 자가회복이 가능한지 체크합니다. 먼저 지휘관의 classNum이 0xffff인지를 봅니다. 아니면 없는 부대입니다.
이어서 체크는 armyFlag(spell)가 0x80인지, forceFlag(Spell)이 0x80인지 를 체크합니다. 아직 잘모르겠어서,
첫번째 플레그는 MayBeDie라고 이름짓고, 다음 스테이트는 NoSelfHealState라고 이름을 붙였습니다. 나중에 이름이 바뀔 수도 있겠죠.
이 플레그들을 하나만이라도 가지면, 회복이 되지 않는 Force가 됩니다.
이걸 통과하면, 어떤 함수가 호출됩니다. 저는 heal_nearMyArmy()라고 이름을 지었습니다.
해당 유닛의 옆의 자기 지휘관이 있는지를 체크한 후, 해당 위치에 회복을 거는 코드가 호출됩니다.
해당위치의 회복을 거는 함수는, 해당위치의 forceNumber와 Army넘버(서수 0 지휘관 1-6 부대원 7 소환물)를 회복 시키는, healStack함수를 호출합니다. (이름은 다 제가 짓는 겁니다. )
healStack함수는 healPosition함수 외에도 한군데에서 호출이 되네요.
오프셋 00417061입니다. 들어가서 보니, 마나를 +2하는 코드가 들어있습니다. 회복 명령을 찾았습니다. 이걸 따라 올라가면 명령체계가 분석이 되겠죠.
자 일단 하던거 마저 합시다.
근처의 부대원을 회복하는 코드가 끝나면, 이제부터 잘 알려지지 않은 내용이 나옵니다.
갑자기 착용아이템의 마방값을 구하는 코드가 들어옵니다.
이어서, 레지스트 마법이 걸려있는지 체크합니다.
다음 100보다 큰 마방을 다 100으로 고정합니다.
디클레인은 여기 없습니다.
마방을 다 구한 후, 디버프 마법의 자가회복이 시작됩니다.
먼저 부대단위의 마법부터 시작합니다.
처음은 참입니다. 플레그가 잔뜩있습니다. 이 플레그를 다 통과하고 나면, 마지막으로 랜덤함수를 호출한 후, MDF %만큼의 확률로 참을 해제합니다.
다음은 존 마법입니다. 존 마법의 플레그는 존이 걸려있냐 하나 밖에 없습니다. 존이 걸려있다면,
마법방어력의 확률로 존 비트를 해제합니다.
다음 부대단위 마법 플레그에 0xe1f8의 & 연산을 합니다.
위 값의 1의 보수는 1e07입니다.
뒤의 7을 구성하는 1,2,4는 어택2, 프로텍트2, 레지스트 입니다. 모두 끕니다.
두번째 Hex는 그대로 갑니다.
세번째 Hex는 Attack(2), Protect(4), Quick(8)입니다. 끕니다.
네번째 Hex는 1은 디클레인 입니다.
매 턴, 시작 때마다, 어택,프로텍트, 퀵, 디클레인, 레지스트를 끕니다. 강제사항입니다.
부대원별 마법해제
이제 부대원별 자가해제 코드로 갑니다.
부대원넘버 루프를 0--> 7까지 돕니다. (리더->>용병->> 소환물)
classNum이 0xffff가 아닌지 확인합니다.
지휘관이 아닐 경우, 기존에 쓰던 마법 방어력 변수에 부대원 클래스 테이블 마방값을
더합니다.
아무래도 버그로 보입니다. 마법 데미지 공식에서, 부대원의 마방은
레지스트+아뮬렛 +자체 마방인데, 영웅의 마방만큼 뺑튀기가 되었습니다.
이러니, 게임에서 슬립을 걸면 발리스타가 걸렸다가 한턴만에 해제하는 것 아니겠습니까...
(뭐... 적들도 같은 루프 코드인지는 의문)
이 부분은 패치를 해야할 것으로 보입니다.
그리고 100으로 제한하는 코드가 없습니다만, 앞의 값이 100으로 제한되고, 유닛 자체값이
최대 255(엔젤 FF)이므로 다 더했을 때, 355인데, 데이터 저장 공간이 Int(4byte)라서
마방이 100일 때와 같은 결과를 얻습니다.
위와 같은 방식으로 얻은 마방 값으로,
슬립이 걸려있으면, RNG를 돌려 마방%의 값으로 마법을 해제합니다.
이어서 뮤트가 걸려있으면, RNG를 돌려 마방%의 값으로 마법을 해제합니다.
유닛이 마법이 쓸 수있는지 없는지는, 마법을 걸 때 판단을 하는 것 같습니다.
루프를 마친 후, 로직을 마치고 게임 이펙트를 처리하는 부분으로 넘어갑니다.
결론
부대단위의 자가회복은 Resist + 마방아이템 + 지휘관 자체마방으로 이루어진다.
부대원 단위의 마법은 지휘관은 위와 같은 마방으로 계산하고,
지휘관이 아닌 경우는 Resist + 마방아이템 + 지휘관자체마방 + 용병(or소환수) 자체 마방을
사용하며,
마방%의 확률로 마법을 해제한다.
공, 방, 마방, 속도의 영향을 주는 마법은 턴시작시 모두 해제한다.
위에서 말하는 자가회복 마법 중,
부대단위의 마법은 참과 존이다.
위에서 말하는 자가회복 마법 중,
부대원 단위의 마법은 슬립과 뮤트이다.
댓글 없음:
댓글 쓰기