| 
 
				Я ставил хуки на функции вычисления 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.)
 |