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

Post Reply 
Threaded Mode | Linear Mode
FunLib
» Мод - библиотека функций для ERA
Author Message
Algor Away
Administrators

Posts: 3880
Post: #1
Звезда 
Предыстория: (Click to View)
Думаю, надо собирать имеющиеся полезные функции, не реализуемые простым ERM, а также предложения по добавлению таких функций и запиливать отдельный мод FunLib.

Предлагаю в этой теме и начать.

Вся необходимая информация (параметры, примеры и пр.) - внутри сответствующего скрипта. Здесь только краткие названия.

События.

// после рукопашной атаки
Event_AfterMeeleDamage.erm
// после выстрела
Event_AfterRangedDamage.erm
// после фазы регенерации, получения хода, проверки на мораль/страх и после установки активного стека
Event_AfterStackObtainsTurn.erm
// расчет дохода за артефакты героев игрока (золото)
Event_ArtGoldIncomeCalculation.erm
// расчет дохода за артефакты героев игрока (ресурсы)
Event_ArtResIncomeCalculation.erm
// перед переключением между героями в окне героя
Event_BeforeChangeHeroInHeroScreen.erm
// перед выводом диалога о повышения уровня героя
Event_BeforeHeroLevelUpDialog.erm
// перед битвой перед триггером BA0
Event_BeforeOnBeforeBattle.erm
// перед обновлением экрана героя
Event_OnUpdateHeroScreen.erm
// расчет дохода города
Event_TownGoldIncomeCalculation.erm

Функции.

// получение портретов героя
Fun_GetHeroPortrait.erm
// получение случайного незапрещенного заклинания по заданным критериям отбора
Fun_GetRandomSpell.erm
// получение описаний вторичного навыка
Fun_GetSecSkillDescription.erm
// получение параметров жилища в конкретном городе
Fun_GetTownBuildingInfo.erm
// набор функций для работы со списками
Fun_List.erm
// перерисовка тени перемещения после текущего действия в бою
Fun_RedrawShadowAfterAction.erm
// установка описаний из ERT-переменных
Fun_SetDescriptionFromERT.erm
// установка числового значения вторичного навыка
Fun_SetSecSkillValue.erm
// проигрывание анимации на нескольких отрядах одновременно
Fun_SpellAnimationOnStacks.erm


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
20.04.2020 17:18
Visit this user's website Find all posts by this user Quote this message in a reply
Zur13 Offline

Posts: 223
Post: #2

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

Code:
********************************************************************************​
** Check specific bit(s) in the bitmask.
** Example if we need to know if monster in stack 0 is Alive and can Fly
**   Alive - decimal flag representation: 16
**   Fly - decimal flag representation: 2
** !VRy1:S16; [y1 bitmask for Alive (16) flag]
** !VRy1:+2;  [y1 bitmask for Alive (16) and Fly (2) flags (OPTIONAL step you may check only 1 flag or more then 2 flags)]
** !BM0:F?y2; [y2 Monster Flags of stack 0]
** !FU21005:Py2/y1/?y3; [y3 (=0: if monster in stack 0 is Alive and can Fly; <>0: otherwise]
********************************************************************************​
** x1 == bitmask to check (for example Monster Flags)
** x2 == bitmask with requested flags (mask with a requested flags which should be checked in x1)
** x3 == ?RESULT (0: all requested bits are 1 ; <>0: bitmask of a bits which are 0 in the x1 but 1 in x2)
!?FU(EraBitmaskCheck);
!!VRy1:Sx1;                            [y1 = x1]
!!VRy2:Sx2;                            [y2 = x2]

!!VRy1:&y2;                            [y1 = y1 & y2]
!!VRy1:Xy2;                            [y1 = (y1 & y2) XOR y2]

!!VRx3:Sy1;                            [x3 result]



********************************************************************************​
** Remove specific bits from the bitmask.
** Example if we need to remove Alive and can Fly flags from monster in stack 0
**   Alive - decimal flag representation: 16
**   Fly - decimal flag representation: 2
** !VRy1:S16; [y1 bitmask for Alive (16) flag]
** !VRy1:+2;  [y1 bitmask for Alive (16) and Fly (2) flags]
** !BM0:F?y2; [y2 Monster Flags of stack 0]
** !FU21006:Py2/y1/?y3; [y3 new monster flags bitmask without Alive and Fly abilities]
** !BM0:Fy3;  [change Monster Flags of stack 0]
********************************************************************************​
** x1 == bitmask to unset (for example Monster Flags)
** x2 == bitmask with requested flags (mask with a requested flags which should be checked in x1)
** x3 == ?RESULT x1 bitmask with all 1 bits from x2 set to 0 in x1
!?FU(EraBitmaskUnset);
!!VRy1:Sx1;                            [y1 = x1]
!!VRy2:Sx2;                            [y2 = x2]

!!VRy1:&y2;                            [y1 = y1 & y2]
!!VRy1:X-1;                            [y1 = INVERT(y1 & y2)]
!!VRy1:&x1;                            [y1 = INVERT(y1 & y2) AND x1]

!!VRx3:Sy1;                            [x3 result]

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

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

Опять таки специфический функционал, отключить стандартные эффекты артефакта, вот, вопрос насколько это совместимо с разными модами.

Из этой темы функции для одновременной анимации стеков. Возможно нужна еще функция для синхронного проигрывания анимации стека (не одновременной)?

То что уже есть в FUN.erm экономия Z переменных и триггер-инициализация 7700.

Из дополнительного, возможно нужны функции для получения адреса-ссылки любой Z переменной включая ЕРТ.
20.04.2020 18:04
Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3880
Post: #3

(20.04.2020 18:04)Zur13 Wrote:  Для начала, просто удобные расширения для работы с битмасками
Это то, о чем предупреждал igrik - вещи которые делаются базовым инструментарием. Такие незачем выносить в библиотеку - они очень просто реализуются.

К тому же, убирать флаги можно проще:
!!BMy1:F?y2; !!VRy2:|2 -2; !!BMy1:Fy2; // убрать у отряда y1 флаг полета (2).

Ну или еще проще при использовании нового синтаксиса (не помню, с какой версии он анонсирован).:
!!BMy1:Fd|2 Fd-2; // убрать у отряда y1 флаг полета (2).
Или даже одним новым операндом, не помню синтаксис. Я по привычке пользую |,-


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
20.04.2020 18:33
Visit this user's website Find all posts by this user Quote this message in a reply
Zur13 Offline

Posts: 223
Post: #4

(20.04.2020 18:33)Algor Wrote:  
(20.04.2020 18:04)Zur13 Wrote:  Для начала, просто удобные расширения для работы с битмасками
Это то, о чем предупреждал igrik - вещи которые делаются базовым инструментарием. Такие незачем выносить в библиотеку - они очень просто реализуются.

К тому же, убирать флаги можно проще:
!!BMy1:F?y2; !!VRy2:|2 -2; !!BMy1:Fy2; // убрать у отряда y1 флаг полета (2).

Ну или еще проще при использовании нового синтаксиса (не помню, с какой версии он анонсирован).:
!!BMy1:Fd|2 Fd-2; // убрать у отряда y1 флаг полета (2).
Или даже одним новым операндом, не помню синтаксис. Я по привычке пользую |,-

Ну для этого и нужно обсуждение чтобы не включать не нужные функции. Новые операторы конечно удобнее.
20.04.2020 18:53
Find all posts by this user Quote this message in a reply
Zur13 Offline

Posts: 223
Post: #5

И еще, я вспомнил чего мне не хватает в ЕРМ, так это нормальных списков, раз уже есть поддержка массивов, можно сделать на их основе списки. С методами вставить элемент в список по индексу, удалить элемент по индексу, получить элемент по индексу, текущий размер списка, шаффл списка, сортировка списка (с компаратором), поиск индекса элемента по критерию (с компаратором). Компараторы для сортировки и поиска это просто функция с заданным в АПИ библиотеки именем, для сравнения двух элементов одним из параметров функции передавать айдишник массива чтобы в модах отличать кто должен делать сравнение, а в модах где это необходимо делается реализация этой функции, где первым действием проверяется айдишник, и что-то делается только для массивов со своим айдишником.

Я могу поробовать сделать пробную реализацию, если это действительно еще кому-то интересно.
(This post was last modified: 20.04.2020 21:29 by Zur13.)
20.04.2020 21:28
Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3880
Post: #6

Сортировка массива, думаю, была бы полезна. Два параметра: id массива и направление сортировки.
Сравнение двух сортированных массивов - тут просто проход в один цикл, смысла выносить такой простой функционал не вижу.


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
20.04.2020 23:21
Visit this user's website Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2807
Post: #7

Кстати да - сортировка точно для массивов нужна.

Zur13, мне уж точно интересно увидеть хотя-бы пробную реализацию. Если честно, я навскидку, не прикину как на ERM реализовать хотя бы односвязный список))


game bug fixes extended.dll || My Plugins || My GitHub
20.04.2020 23:40
Visit this user's website Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3880
Post: #8

(20.04.2020 23:40)igrik Wrote:  Если честно, я навскидку, не прикину как на ERM реализовать хотя бы односвязный список))

Если честно, я навскидку, не прикину, где и как он тут может реально пригодиться. Может, конечно, фантазия у меня скудная, хз.


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
21.04.2020 01:57
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #9

Установки битов делаться будет очень скоро (с Эры 3.0) легко, как писал Алгор:
Sd|маска. Можно сразу в командах !!MA:X13/d|48;
Снятие тоже через ~ (оператор И НЕ = снятие битов).
Sd~48; или !!MA:X13/d~48;
-----------------------------------------------
Просьба сделать префикс функциям FUN_ или Fun_ для совместимости с ERM 2.0 и индексацией сублаймом.
Рекомендую начать именно с тех функций, что есть сейчас. Не «на чёрный день», а что есть и проверены. Пополнять тем, что реально полезно и стабильно работает.

И всем функциям в обязательнейшем порядке имена. Новым событиям через хукер тоже. Вместо номера в SetHook передаём (Fun_OnAlgorGetsEnraged), например.


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

Posts: 3880
Post: #10

Berserker, принято.
Названия вида FUN_GetRandomSpell подойдут?


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
21.04.2020 10:14
Visit this user's website Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3880
Post: #11

(21.04.2020 06:10)Berserker Wrote:  (Fun_OnAlgorGetsEnraged), например.

Не, хочу сделать Event_OnAlgorGetsEnraged

Чтобы, в том числе, не было путаницы прииспользовании:
Каждая функция или хук будут оформлены отдельным файлом (напр. FUN.SpellAnimationOnStacks.erm). Таким образом у мододелов будет выбор: привязываться к моду-библиотеке или просто добавлять к себе в моды отдельные необходимые события/функции.


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
21.04.2020 10:21
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #12

Quote:Berserker, принято.
Названия вида FUN_GetRandomSpell подойдут?
Да.
Может лучше один файл на секции разделить? Сразу поиск по всем идентификаторам, доп. константам, пояснениям.
Лучше пусть привязываются к моду, имхо. Вегда можно рискнуть скопировать нужную секцию к себе.


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

Posts: 223
Post: #13

(21.04.2020 16:14)Berserker Wrote:  Может лучше один файл на секции разделить? Сразу поиск по всем идентификаторам, доп. константам, пояснениям.
Лучше пусть привязываются к моду, имхо. Вегда можно рискнуть скопировать нужную секцию к себе.

Я считаю что отдельными файлами лучше, в саблайме поиск по проекту отлично работает. А вот навигация в огромных файлах порой очень раздражает.
21.04.2020 16:25
Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3880
Post: #14

(21.04.2020 16:14)Berserker Wrote:  Может лучше один файл на секции разделить? Сразу поиск по всем идентификаторам, доп. константам, пояснениям.
Нет, не лучше.
Для поиска в одном файле будет help (помимо встроенного мини-help'a в каждом файле). Структура у меня уже готова, занимаюсь наполнением. Скоро будет первый пробный релиз.

(21.04.2020 16:14)Berserker Wrote:  Лучше пусть привязываются к моду, имхо. Вегда можно рискнуть скопировать нужную секцию к себе.
Это будет каждый моддер решать для себя. Плюсы и минусы есть у обоих вариантов. Но да, в перспективе, когда FunLib станет мастхэвом как базовый WoG-мод (или когда ты созреешь включить его в базовую поставку Эры Spiteful) проще будет привязываться к нему, т.к. эта зависимость станет необременительной.

А пока, навскидку, есть пара моментов, требующих помощи профессиональной части зала.

Fun_SetDescriptionFromERT.erm (Click to View)

Нужна такая же, но с JSON на конце. Это, имхо, однозначно должно быть, в том числе и для ухода от ert.
* Желателльно, делать средствами ERA 2, не уверен, что переход на 3 будет быстрым и легким.


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
21.04.2020 17:36
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #15

Данный функционал скорее вреден, чем полезен. Нельзя пытаться получать адреса динамических строк и таким вот хаком их применять. Просто одна сплошная бомба-костыль.

SN:H^spec^/hero/short (0), full (1) or descr (2)/hint
SN:H^secskill^/skill/name (0), basic (1), advanced (2) or expert (3)/text
SN:H^monname^/monster/single (0), plural (1), description (2)/text

Только для артефакта сейчас нет функционала. Временно (на жизненный цикл триггера) в Эра 3 можно сменить через создание временной z-переменной
!!VR(strPtr:y):Z^новый текст для арта^;
...установить описание штатной командой, передав strPtr в качестве номера z-переменной.

Могу, если очень нужно на постоянной основе, добавить поддержку артефактов в SN:H


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
21.04.2020 18:06
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