Wake of Gods Forum | Форум Во Имя Богов

Full Version: Вопросы по моддингу
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
igrik, я полностью с тобой согласен. Могу лишь костыль предложить.
Скажем, по проверке цены/FV/AV или иной обязательной характеристики. Может, флаг. 105

P.S.: я бы оставил ИИ возможность иметь половину стоимости каждый день, поскольку они не знают, что к воскресенью надо бежать и задёшево улучшать своих юнитов и покупать только в этот день, экономя в иные дни102

С другой стороны, теоретический откуп в такой день будет дешевле вдвое102
(21.01.2021 23:27)daemon_n Wrote: [ -> ]igrik, я полностью с тобой согласен. Могу лишь костыль предложить.
Скажем, по проверке цены/FV/AV или иной обязательной характеристики.
Так это не просто костыль, это "возможное" обращение к несуществующему полю, и как следствие вполне ожидаемый вылет из игры.

XEPOMAHT, ты не думай, что я наезжаю - я наоборот пытаюсь понять механику процесса, чтобы знать о существовании подводных камней и/или о том как правильно выстраивать свои действия при работе с монстрами в Тифоне.
(21.01.2021 23:23)igrik Wrote: [ -> ]А как тогда скриптеру производить цикл по всем монстрам в скрипте?
Как в плагине производить цикл прохода по всем монстрам в плагине?

1. Узнать общее количество монстров в игре (по базовому адресу например).
2. Узнать адрес структуры монстров (можно тоже по базовому адресу).
3. Если монстров более 196, то проверить что загружено: Тифон или Аметист. Если нет ни того, ни другого, то вывести сообщение об ошибке и выйти из функции.
4. Подгрузить заранее индексированный список монстров, которых будем проверять (например нужны все активные монстры, либо только разрешённые, либо только боевые машины, либо командиры, боги, отсортированные по городу, уровню, чётности, флагам монстров, наличию апгрейда, чему-то ещё..). Если оптимизация не требуется, то значит проверяем всех (то, что считали в п.1).
4. Запустить цикл for i=0 to anybody_monster_count do ...
5. По номеру списка получаем номер монстра, по которому получаем адрес в структуре монстра, ну и дальше стандартные операции со структурой монстров. Если нужна проверка на бланковость, то проверяем на наличие имени дефа в структуре (т.е. на 0 по адресу на строку имени дефа) - монстры в списках при их формировании должны быть заранее проверены на бланковость.


(21.01.2021 23:23)igrik Wrote: [ -> ]Возьмём к примеру часто используемый скрипт: "половинная стоимость существ на 7й день". Как организовать цикл? Сколько итераций производить? 1000? Т.е. 778 итераций в пустую? Как скрипту проверять, что монстра (например id 650) вообще нет, если есть активный монстр с id 666?

Проверяешь всех из списка разрешённых монстров на нулевую стоимость. Так как раз по-умолчинию отсекутся все боевые машины, стрелковые башни, командиры и боги, т.к. список сразу будет содержать только всех реально нанимаемых монстров без необходимости проверять всё это в скрипте.

(22.01.2021 00:24)igrik Wrote: [ -> ]это "возможное" обращение к несуществующему полю, и как следствие вполне ожидаемый вылет из игры.

Тифон сразу выделяет память под структуру на 1000 монстров. Попадание всегда будет в структуру монстров, если цикл не берёт количество монстров с потолка, а получает его по базовому адресу.

(22.01.2021 00:24)igrik Wrote: [ -> ]я наоборот пытаюсь понять механику процесса, чтобы знать о существовании подводных камней и/или о том как правильно выстраивать свои действия при работе с монстрами в Тифоне.

Да я на 100% ответить о всех подводных камнях не смогу. В MoP всегда обрабатывается вся структура от 0 до 999, т.к. там чистый Ассемблер, то работает это быстро. Даже в функции получения случайного монстра при выпадении случайных чисел от 0 до 999 и с последующей проверкой в таблице запрета монстров и последующей перерандомизации при попадании на запрещённого монстра всё работает быстро и не заметно для игрока. На ERM будет значительно медленнее, поэтому для скриптов (и скриптёров) будут полезны заранее подготовленные списки монстров, согласно которым их и придётся проверять для увеличения быстродействия в циклах.
igrik,

!?FU(GetMaxMonsterId);
; Returns ID of the last supported monster in game.
!#VA(result:x);

Из Era Erm Framework. Вариант, выдерживающий эволюцию без замены кода.
На текущий момент мод вида Thirst Upgrades должен делать так:

!?FU(GetMaxMonsterId);
!#VA(result:x);
!!VR(result):S217;
Berserker, у меня фактически так и сделано. Просто сохраняю в глобальную переменную, чтобы потом при необходимости использовать её в циклах и т.п. сразу, без вызова функций и пересохранений переменных.
Хотя это ещё не до конца утверждённое решение...


UPD: ага, увидел в библиотеке как реализовано. Значит буду использовать твою функцию.
Тогда добавь и получение кол-ва героев!
igrik, так в том и замысел, что Тифон выдал бы значение, скажем, -1, где нет монстра.
(SIZEOF_UINT32) для UN:C не подходят. UNC_INT или UNC_UINT32 или UNC_INT32. Если помнишь, там не просто размер, а размер и знаковость кодируется.

Добавил:
Господа, а как быть? Я в триггере BG0 ставлю свою позицию для прямой атаки (цель выбирается по определенному алгоритму, который для данного примера не нужен), но при этом существа после этого иногда могут полететь/пойти к другой цели и просто встать рядом. Что делать?
P.S. Нужно мне это для симуляции действия берсерка. Любые альтернативные решения приветствуются.
Raistlin, так ты 2 действия указал.

Тебе надо просканировать ближайшие клетки и просто !!BG:Dy5; в ближайшего монстра

Если точнее, тебе надо сперва узнать, что за действие стак делать хочет !!BG:A?(actionType:y); и уже от этого скакать дальше, что делать при таком то планируемом дейсттвии
daemon_n, мне не нужно в ближайшего, все несколько интереснее. Если рядом есть определенное существо, то текущий отряд психует и вместо того, чтобы делать что-то свое, идет бить морду конкретному врагу. Сам принцип выбора цели работает нормально, проблема в !!BG:Dy5; - похоже я нашел баг в ERM. Если что, использую Эру3
(25.01.2021 01:38)Raistlin Wrote: [ -> ]но при этом существа после этого иногда могут полететь/пойти к другой цели и просто встать рядом. Что делать?

Насколько помню, лучше подавать саму структуру атакуемого стека при атаке напрямую, чтобы не париться с двухклеточными монстрами (там номер позиции зависит от стороны).
XEPOMAHT, хорошо, а какой функции ее надо скормить?
(25.01.2021 01:59)Raistlin Wrote: [ -> ]XEPOMAHT, хорошо, а какой функции ее надо скормить?

Оригинальной содовской (выдержка из Тифона):

Code:
        push esi ; структура целевого монстра
        mov ecx, dword [699420h] ;CombatManager
        mov eax, 478230h ; Идти_и_атаковать_монстра
        call eax
XEPOMAHT, кажется, я знаю, что мне делать. Большое спасибо!
К сожалению, у меня ничего не получилось. Через плагин как-то не пошло, потому я вернулся к ERM. Собственно, я даже догадался, в чем заключается проблема, но решить я ее не могу.
Я пробовал заходить с разных сторон:
Проблем с выставлением цели и совершением атаки у меня нет - как оказалось, названные мною способы и даже обычный ресивер !!BG:Dy5 A6 работают нормально, однако сложность заключается в построении маршрута. Одно дело просто узнать расстояние по прямой (это легко можно сделать вот так: !!SN:E4624976/3/y4/y5; Получаем расстояние до цели в v1), другое - учесть стоящие на пути препятствия, а также другие стеки. По идее, в игре должна быть какая-то функция, которая бы за это отвечала.

Кстати, еще такой вопрос: "lea edx, [eax-1]" означает, что в edx запишется адрес из eax, а затем будет забрана единица, или же, что в edx запишется значение по адресу, хранящемся в eax, со смещением в -1? А может это будет значение по адресу eax, уменьшенное на 1? Подскажите пожалуйста, а то непонятно, как данная команда работает.
Reference URL's