(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 будет значительно медленнее, поэтому для скриптов (и скриптёров) будут полезны заранее подготовленные списки монстров, согласно которым их и придётся проверять для увеличения быстродействия в циклах.