Current time: 22.04.2024, 11:38 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Вопросы по моддингу
» (обсуждаем моддинг здесь)
Author Message
daemon_n Offline
Administrators

Posts: 4338
Post: #1681

igrik, я полностью с тобой согласен. Могу лишь костыль предложить.
Скажем, по проверке цены/FV/AV или иной обязательной характеристики. Может, флаг. 105

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

С другой стороны, теоретический откуп в такой день будет дешевле вдвое102


Image: widget.png?style=banner2

Новейший Heroes 3 Launcher
21.01.2021 23:27
Visit this user's website Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2814
Post: #1682

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

XEPOMAHT, ты не думай, что я наезжаю - я наоборот пытаюсь понять механику процесса, чтобы знать о существовании подводных камней и/или о том как правильно выстраивать свои действия при работе с монстрами в Тифоне.


game bug fixes extended.dll || My Plugins || My GitHub
22.01.2021 00:24
Visit this user's website Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2270
Post: #1683

(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 будет значительно медленнее, поэтому для скриптов (и скриптёров) будут полезны заранее подготовленные списки монстров, согласно которым их и придётся проверять для увеличения быстродействия в циклах.
(This post was last modified: 22.01.2021 00:44 by XEPOMAHT.)
22.01.2021 00:29
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16488
Post: #1684

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;


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
22.01.2021 01:00
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2814
Post: #1685

Berserker, у меня фактически так и сделано. Просто сохраняю в глобальную переменную, чтобы потом при необходимости использовать её в циклах и т.п. сразу, без вызова функций и пересохранений переменных.
Хотя это ещё не до конца утверждённое решение...


UPD: ага, увидел в библиотеке как реализовано. Значит буду использовать твою функцию.
Тогда добавь и получение кол-ва героев!


game bug fixes extended.dll || My Plugins || My GitHub
22.01.2021 01:10
Visit this user's website Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4338
Post: #1686

igrik, так в том и замысел, что Тифон выдал бы значение, скажем, -1, где нет монстра.


Image: widget.png?style=banner2

Новейший Heroes 3 Launcher
22.01.2021 08:01
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16488
Post: #1687

(SIZEOF_UINT32) для UN:C не подходят. UNC_INT или UNC_UINT32 или UNC_INT32. Если помнишь, там не просто размер, а размер и знаковость кодируется.

Добавил:


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
22.01.2021 20:13
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1688

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


Создал новый глобальный мод: WoG Ultra Edition
(This post was last modified: 25.01.2021 01:38 by Raistlin.)
25.01.2021 01:38
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4338
Post: #1689

Raistlin, так ты 2 действия указал.

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

Если точнее, тебе надо сперва узнать, что за действие стак делать хочет !!BG:A?(actionType:y); и уже от этого скакать дальше, что делать при таком то планируемом дейсттвии


Image: widget.png?style=banner2

Новейший Heroes 3 Launcher
25.01.2021 01:43
Visit this user's website Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1690

daemon_n, мне не нужно в ближайшего, все несколько интереснее. Если рядом есть определенное существо, то текущий отряд психует и вместо того, чтобы делать что-то свое, идет бить морду конкретному врагу. Сам принцип выбора цели работает нормально, проблема в !!BG:Dy5; - похоже я нашел баг в ERM. Если что, использую Эру3


Создал новый глобальный мод: WoG Ultra Edition
25.01.2021 01:50
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2270
Post: #1691

(25.01.2021 01:38)Raistlin Wrote:  но при этом существа после этого иногда могут полететь/пойти к другой цели и просто встать рядом. Что делать?

Насколько помню, лучше подавать саму структуру атакуемого стека при атаке напрямую, чтобы не париться с двухклеточными монстрами (там номер позиции зависит от стороны).
25.01.2021 01:57
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1692

XEPOMAHT, хорошо, а какой функции ее надо скормить?


Создал новый глобальный мод: WoG Ultra Edition
25.01.2021 01:59
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2270
Post: #1693

(25.01.2021 01:59)Raistlin Wrote:  XEPOMAHT, хорошо, а какой функции ее надо скормить?

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

Code:
        push esi ; структура целевого монстра
        mov ecx, dword [699420h] ;CombatManager
        mov eax, 478230h ; Идти_и_атаковать_монстра
        call eax
(This post was last modified: 25.01.2021 02:05 by XEPOMAHT.)
25.01.2021 02:03
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1694

XEPOMAHT, кажется, я знаю, что мне делать. Большое спасибо!


Создал новый глобальный мод: WoG Ultra Edition
25.01.2021 02:14
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1695

К сожалению, у меня ничего не получилось. Через плагин как-то не пошло, потому я вернулся к ERM. Собственно, я даже догадался, в чем заключается проблема, но решить я ее не могу.
Я пробовал заходить с разных сторон:
Проблем с выставлением цели и совершением атаки у меня нет - как оказалось, названные мною способы и даже обычный ресивер !!BG:Dy5 A6 работают нормально, однако сложность заключается в построении маршрута. Одно дело просто узнать расстояние по прямой (это легко можно сделать вот так: !!SN:E4624976/3/y4/y5; Получаем расстояние до цели в v1), другое - учесть стоящие на пути препятствия, а также другие стеки. По идее, в игре должна быть какая-то функция, которая бы за это отвечала.

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


Создал новый глобальный мод: WoG Ultra Edition
01.02.2021 18:42
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group