Объявления |
---|
Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru. Я оторву свою задницу от всех дел и обязательно Вас активирую! Добро пожаловать на геройский форум! |
Энциклопедия алгоритмов HoMM 3Предлагаю делиться знаниями в области программного кода Героев 3. Например, в виде псевдокода.
|
Re: Энциклопедия алгоритмов HoMM 3С-подобный псевдокод для процедуры int __userpurge sub_00438D50, с помощью которой AI определяет "ценность" заклинания Ослепление в битве (рассчитывая, стоит ли его применить). Процедура вызывается из 43A2CO.
StackInBottom - часть стэка внизу, которая не очищается, а передается из процедуры в процедуру. Играет большое значение для расчетов AI в битве. Заполняется в процедуре 41EC40, возможно, еще где-то. Последний раз редактировалось Ben80 25 окт 2017, 16:53, всего редактировалось 1 раз.
|
Re: Энциклопедия алгоритмов HoMM 3sub_43B2E0 - это свитч, выбирающий функцию вычисления ценности заклинания в зависимости от его номера. Вызывается из 4-х мест:
|
|
Re: Энциклопедия алгоритмов HoMM 3sub_00491640 orders dialog to close when used in dialog proc on an item that does not necessarily have close_dlg = TRUE flag (e.g. _DlgButton_)
Used here for example: |
Re: Энциклопедия алгоритмов HoMM 3Ряд алгоритмов, используемых AI в битве:
1) Перед каждой битвой с участием AI комп вычисляет соотношение сил армий, причем чем ближе оно к 1, тем большее число сопоставляет компьютер. То есть он рассматривает эту величину приблизительно как ожидаемую продолжительность битвы (вернее, ее решающей фазы). 2) Комп создает и апдейтит набор битов (1 набор на всю армию - армию противника компа), отражающих возможность каждого отряда "дотянуться" до противника. Данная система использует поля _CombatMonster_ (это уже для своей армии - для каждого отряда): 0x544 - здесь набор битов, определяющих до каких номеров (отрядов) противника дотягивается данный наш отряд. 0x538 - адрес одного из отрядов, который наш отряд мог бы ударить. У отрядов, уже сделавших ход, бит 0x544 все равно ненулевой, если в следующий ход они смогли бы нанести удар, хотя бы гипотетически. Зато отряд, который в данный момент должен ходить имеет данный бит равным нулю. Только перед началом битвы данный отряд иногда имеет бит равный 1. Именно поэтому комп не может наложить Жажду крови, Палача и др. на юнита и сразу же пойти и ударить данным юнитом. Еще один момент - у стрелков 0x544 нулевой, за исключением случаев рукопашной, только перед началом битвы он ненулевой. Вообще, возможно, вся данная система далека от безупречной работы и, как и многие другие участки кода в игре, приводит к тому, что комп иногда делает не самые полезные для себя вещи (как говорится в народе, откровенно тупит). Во всяком случае, для процедур типа combatMan_00437D50_BloodlustWeightAI можно было бы безболезненно и с пользой заменить использование поля 0x538 на актуальный расчет возможности дотянуться до противника (такой код все равно в игре где-то есть). |
|
Re: Энциклопедия алгоритмов HoMM 3Interesting, it might be related to something I'm trying to fix.
In HotA, they added this "fix"... Цитата: *Добавлен вывод ИИ из бесконечного цикла при слишком большой армии. ... but it is incomplete. An AI with very large army with the "fix" will sometimes run into battle against very weak opponent and lose. From my understanding of looking at the HotA fix, their solution is to prevent AI from swapping stacks endlessly. On my end I achieved a similar result by modifying sub_00491640 GetArmyAIValue so that it only returns positive values, but AI hero still runs in battle and dies.
I assumed there is another check somewhere but I did not spend any time to look for it so far. |
Re: Энциклопедия алгоритмов HoMM 3Кусок кода, позволяющий создать массив miPassability[mapSize][mapSize], содержащий логические значения -
проходима ли данная клетка карты. Возможно, где-то в игре есть уже готовая структура, ссылающаяся на уже готовый подобный массив (например, структура 0x6992D4 AccessableSquaresStruct), но на данный момент это достоверно неизвестно.
|
Re: Энциклопедия алгоритмов HoMM 3Я точно уже не помню, зачем мне было это нужно, но, кажется, для нахождения минимального расстояния между тайлами без учёта временно непроходимых объектов (таких, например, как кучки ресурсов, артефакты, герои и т.п.). Это очень полезная фича для оффлайн-турниров. Попробую поразбираться.
|
Re: Энциклопедия алгоритмов HoMM 3RoseKavalier
|
Re: Энциклопедия алгоритмов HoMM 3_Player_*
field_30[4] Содержит тип ИИ (Воин, Строитель, Исследователь). Нашел на ДФ в посте MoP |
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1