Я ставил хуки на функции вычисления Fight Value и AI value отрядов и умножал базовые показатели командира на треугольные числа по порядку его уровней.
Code:
proc Учёт_командира_ИИ
mov [Temp], 4; AI value
jmp Учёт_командира_ИИ3
endp
proc Учёт_командира_ИИ2
sub edx, 1Ch
mov [Temp], 0; Fight Value
endp
proc Учёт_командира_ИИ3; можно использовать EBX, EDI, ESI без сохранения
xchg eax, ebx; передать значение в долгосрочный регистр
lea esi, [edx-_Hero_.Количество_существ_в_слоте_0]; смещаем до начала структуры героя
GetHeroStruc HERO_Макс
lea ecx, [eax+156*sizeof._Hero_]
.if signed esi >= eax & signed esi < ecx; структура слотов для вычисления лежит в пределах структуры героя
stdcall Вычисление_AI_value_командира, esi
add ebx, eax
.endif
xchg eax, ebx; возвратить в eax
ret
endp
proc Вычисление_AI_value_командира
push ebx
mov ecx, [esp+8]
xor ebx, ebx; обнуляем для инициализации
.if Option_Commanders; опция "Командиры" включена
imul eax, [ecx+_Hero_.Номер], Размер_структуры_командира
add eax, Адрес_структуры_командиров
.if [eax+_Commander_.Доступность] & ~[eax+_Commander_.Жив_или_мёртв]; командир доступен и жив
mov ecx, [eax+_Commander_.Тип]
add ecx, CR_Паладин_Атакующий; получить тип монстра
imul ecx, sizeof._Creature_
add ecx, [Temp]; Fight Value или AI value
mov ecx, [ecx+Адрес_структуры_монстров+_Creature_.Fight_Value]; получить базовое значение из структуры монстра
mov eax, [eax+_Commander_.Текущий_уровень]; начинается с нуля
mov eax, [eax*4+Треугольные_числа]; получить условный множитель, зависящий от уровня командира
imul eax, ecx; умножить на базовое значение
add ebx, eax; добавить к общему показателю
.endif
.endif
xchg eax, ebx; вернуть результат функции
pop ebx
ret 4
endp
Треугольные_числа: dd 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465, 496, 528, 561, 595, 630, 666, 703, 741, 780, 820, 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275, 1326, 1378, 1431,1485,1540,1596,1653,1711,1770,1830,1891,1953,2016,2080,2145,2211,2278,2346,2415,2485,2556,2628,2701,2775,2850,2926,3003,3081,3160,3240,3321,3403,3486,3570,3655,3741,3828,3916,4005,4095
Правда, я сам так и не понял, помогло ли это. Скорее всего, структура героя в ряде случаев копируется в стек и поэтому код её не ловит, потому что учитывает только основной блок структур героев.
Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
(This post was last modified: 07.07.2017 07:56 by MOP.)
|