Wake of Gods Forum | Форум Во Имя Богов
Отображение произвольного def`а на поле боя - Printable Version

+- Wake of Gods Forum | Форум Во Имя Богов (http://wforum.heroes35.net)
+-- Forum: Герои Меча и Магии 3.5 WoG/ERA (/forumdisplay.php?fid=99)
+--- Forum: Моды (/forumdisplay.php?fid=104)
+---- Forum: Архив (/forumdisplay.php?fid=192)
+---- Thread: Отображение произвольного def`а на поле боя (/showthread.php?tid=3842)


Отображение произвольного def`а на поле боя - Sav - 17.04.2012 21:25

dll позволяет создавать объекты-изображения (условно "фигуры") в бою и управлять ими.

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

BattleFigures.zip

В архиве находится сама dll, а так же lib-файл и SDK (только на C++).
dll должна лежать в корневой папке Героев. lib и SDK должны быть включены в исходники использующего BattFigures.dll проекта (SDK автоматически подгружает lib).

SDK достаточно хорошо прокомментирован, думаю, понять, как пользоваться и какие есть возможности, не очень сложно.


Пример: SamplePlugin.zip

В примере на стеках играет специальная анимация всё время, пока на них наложена анти-магия; похожая вещь делается и для паралича.



Как сама BattleFigures.dll, так и, естественно, пример требует patcher_x86 (patcher_x86.dll и patcher_x86.ini в корневой папке игры).



Исходники (без отлова ошибок, но и исправленным освобождением памяти в деструкторе списка): https://www.dropbox.com/s/nmqzf6ehiscbxq7/BattleFigures_Sources.zip


BattleFigures.dll глючить не должна - я хорошо отреверсил то, что в ней делаю. В неё встроен отлов ошибок, такой же, как и в HD, поэтому не удивляйтесь, что при любом вылете она будет выдавать окошко с ошибкой. Cама dll вряд ли является причиной этой ошибки, но её лог может помочь в поиске этой причины.

Возможно, не всеми возможностями dll удастся воспользоваться из-за кривости отрисовке боя Героев. Тут пока ничего не поделаешь.


SDK для других языков я писать не буду, т. к. и с этим упарился (и всё равно как-то криво вышло по-моему). Если кто-то напишет, а ещё лучше, научит, как делать адекватный экспорт, буду признателен. Sm


RE: Отображение произвольного def`а на поле боя - Berserker - 17.04.2012 21:51

Поздравляю!


RE: Отображение произвольного def`а на поле боя - Berserker - 17.04.2012 22:54

Вот что меня интересует, так это загрузка, выгрузка и отображение кадров дефов, то есть по сути то, с чем имеет дело alpha-плагин от Семёна. Для создания модов важно, чтобы кадровые сборные дефы могли редактировать по частям, то есть заменой кадров, а не дефов. Есть у тебя наработки? Это не срочно, но любое нововведение зависит от трудоёмкости.


RE: Отображение произвольного def`а на поле боя - Sav - 17.04.2012 23:15

Отображается конкретные кадры def`а посредством своих методов, и о некоторых из них я кое-что знаю. Загрузку я видел только def`а целиком, но не разбирал, а только пользовался.

Вообще, с самими ресурсами я мало работал. Структуры def`а, кадра и пр. описаны baratorch`ем, я ими только пользовался, и их лучше попросить их у него. Я узнал только некоторые подробности про 2 функции отрисовки, которые представлены у меня как 2 типа изображения. Про них могу рассказать.


RE: Отображение произвольного def`а на поле боя - Bes - 18.04.2012 21:34

Sav, а через !?CM добавляемые элементы будут отлавливаться? через CM:I по своим уникальным ID?


RE: Отображение произвольного def`а на поле боя - Sav - 18.04.2012 21:53

Нет, фигуры - просто настраиваемые изображения, сами по себе они неинтерактивны. Их можно сделать интерактивными, но этим должен заниматься уже пользователь, BattleFigures.dll даёт возможности только в плане отображения на экран.


RE: Отображение произвольного def`а на поле боя - Bes - 18.04.2012 22:07

а в процессе игры можно ли менять кадры деф-а, для отображения при той или и ной ситуации???
скажем эмулировать таким образом "кнопку", которая может быть активна или "недоступна"


RE: Отображение произвольного def`а на поле боя - Sav - 18.04.2012 22:30

Конечно, можно менять кадры def`а, можно заменить def на другой, как и любые другие параметры отображения.


RE: Отображение произвольного def`а на поле боя - Bes - 18.04.2012 22:39

Berserker, как думаешь, стоит ли менять способ реализации дополнит.игрового меню в битве для ФМ (сейчас он через DL вызывает панель всякий раз по ПКМ на герое)???
То есть сделать чтоб всегда висела якобы "панель" вверху, а состояние кнопок постоянно мониторить для каждой стороны и менять если нужно.

оцени своим профессионал.взором новую возможность посредсвом данной BattleFigures.dll и ответь пожалуйстаSorry



RE: Отображение произвольного def`а на поле боя - Sav - 18.04.2012 23:47

Несмотря на то, что я писал, что глючить не должно, оказалось, что это немного не так.
Обновил dll, исправил пару недочётов. Также обновился SDK, пара мелких расширений возможностей.

Обновил пример - теперь в нём полноценно изменяется анимация паралича: при наложении играется анимация до определённого кадра, потом на этом кадре анимация застывает и держится всё время, пока стек парализован, а при снятии паралича анимация играет "назад" и изображение исчезает.

Ссылки в первом посте указывают на обновлённые файлы.


RE: Отображение произвольного def`а на поле боя - Berserker - 19.04.2012 15:50

Bes, не стоит.



RE: Отображение произвольного def`а на поле боя - Sav - 21.11.2012 20:17

Теперь меня ничего не держит. https://www.dropbox.com/s/nmqzf6ehiscbxq7/BattleFigures_Sources.zip
Сам не знаю зачем (наверное, затем, что он тут не нужен), убрал отсюда отлов ошибок, но добавил исправленное позже освобождение памяти списком.

Я уже понял, что текущая обработка фигур никуда не годится (в плане удобства работы с ней) и я буду всё переделывать, но не факт, что я стану выделять потом это опять в отдельный плагин.

Геройские модули тут содержат немного побольше моей информации (отличима построчными комментариями), чем те, что в HD; возможно, интересующимся есть смысл обратить них внимание.


RE: Отображение произвольного def`а на поле боя - Berserker - 21.11.2012 21:16

Реально ли сделать шкалу очерёдности хода, как в VCMI, используя данный модуль?


RE: Отображение произвольного def`а на поле боя - Sav - 21.11.2012 21:25

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

По идеологии же это примерно то же, что и делать разделение дефа артефактов через альфа-плагин. Я бы не стал вводить шкалу очерёдности через BattleFigures, по мне её надо делать нормальным элементом интерфейса.

Я не играл в VCMI и видел шкалу только на скриншотах. Если она неинтерактивная, то простота её реализации и эффективность данного плагина для этих целей существенно выше.

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


RE: Отображение произвольного def`а на поле боя - igrik - 05.07.2016 01:08

В общем я всё таки пытаюсь сделать шкалу очерёдности хода через этот плагин и через патчер x86.
Но меня очень сильно тормозит полное отсутствие знаний основ С++. А именно я не могу вызвать нижеуказанную функцию для построения списка очередности. Я тупо не понимаю как передать в неё адреса структуры стеков.
Code:
// Сравнение приоритета хода стеков (если у первого приоритетнее - возврат 1)
char __thiscall A0_Battle_CompareStacksTurnPriority_sub_464B30(int this, struct_BattleStack *Stack1, struct_BattleStack *Stack2)
Поэтому прошу помощи.

На данный момент плагин работает через HD мод как подключаемый на хоте, соде и эре. Без HD только на эре через EraPlugins.
Пока что выглядит это так:



RE: Отображение произвольного def`а на поле боя - Valery - 05.07.2016 01:46

Wow nice!

Here is VCMI code for battle stacks order, maybe can help?

CODE


RE: Отображение произвольного def`а на поле боя - gamecreator - 05.07.2016 01:49

Что значит как передать? Передаёшь туда указатели на один отряд и другой. this - скорей всего менеджер битвы. В чём конкретно проблема?


RE: Отображение произвольного def`а на поле боя - igrik - 05.07.2016 01:59

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


RE: Отображение произвольного def`а на поле боя - gamecreator - 05.07.2016 02:23

У тебя же есть получение активного отряда. Подставь туда свои числа вместо активной стороны и номера активного отряда и получишь указатель на любой отряд. Берёшь два таких и передаёшь.
А передаются они обычно:
Code:
BattleStack *s1, *s2;
s1 = ... // получаешь какой-нибудь отряд
s2 = ... // аналогично
if (CompareStackPriority((int)battleManager, s1, s2) == 1)
{
    // твои действия
}



RE: Отображение произвольного def`а на поле боя - igrik - 05.07.2016 14:52

Quote:s1 = ... // получаешь какой-нибудь отряд
Пробовал в таком духе. Не получалось. И поэтому я думал, что передаю не указатель, а занчение по этому адресу.
Code:
NOALIGN struct _BattleStack_ : public _Struct_ // размер 0x548
{
    _byte_ already_attack;    // +0 ?
Значит буду пробовать еще...

И как мне знать, передаю ли я указатель на адрес "X" или значение по этому адресу?


RE: Отображение произвольного def`а на поле боя - feanor - 05.07.2016 15:30

указатели - геморрой, да, сколько я с ними мудохался в десятом классе..

   CALL_3(int, __thiscall, 0x464B30, o_BattleMgr_, o_BattleMgr_->stack[side][stack], o_BattleMgr_->stack[side][stack]); вроде, с работы проверить не могу
впрочем, лучше нормально объявить (через указатель на функцию, макросы, всеж, для нереюзаемого кода), но это из дома, если никто до того не поможет

если чо, могу помочь с плагином)

Upd: упс, на самом деле
CALL_3(int, __thiscall, 0x464B30, o_BattleMgr_, &(o_BattleMgr_->stack[side][stack]), &(o_BattleMgr_->stack[side][stack]) );


RE: Отображение произвольного def`а на поле боя - igrik - 05.07.2016 17:21

feanor Wrote:если чо, могу помочь с плагином)
Да. Было бы очень здорово.

Что я делаю не так? Какой инклуд я не подключил? Пишет "o_BattleMgr_: необъявленный идентификатор"

Используемые инклуды: (Click to View)

И ещё, могу ли я впихнуть в эту функцию номера стеков не с указанием стороны и стека стороны (0 ... 20 / 0 или 1), а в глобальной нумерации стеков (0 ... 41)?



RE: Отображение произвольного def`а на поле боя - feanor - 05.07.2016 18:36

Quote:Да. Было бы очень здорово.
скинь тогда в личку, ближе к ночи посмотрю

Quote:Что я делаю не так? Какой инклуд я не подключил? Пишет "o_BattleMgr_: необъявленный идентификатор"
это я пишу вслепую. o_BattleMgr, без подчеркивания после

Quote:И ещё, могу ли я впихнуть в эту функцию номера стеков не с указанием стороны и стека стороны (0 ... 20 / 0 или 1), а в глобальной нумерации стеков (0 ... 41)?
[0][30] должно сработать


RE: Отображение произвольного def`а на поле боя - gamecreator - 05.07.2016 20:38

(05.07.2016 14:52)igrik Wrote:  И как мне знать, передаю ли я указатель на адрес "X" или значение по этому адресу?
Если у нас есть BattleStack* foo, то:
foo это указатель на экземпляр BattleStack
*foo это экземпляр BattleStack
&foo это указатель на foo, т.е. значение типа BattleStack**.