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

+- Wake of Gods Forum | Форум Во Имя Богов (http://wforum.heroes35.net)
+-- Forum: Герои Меча и Магии 3.5 WoG/ERA (/forumdisplay.php?fid=99)
+--- Forum: Моды (/forumdisplay.php?fid=104)
+--- Thread: FunLib (/showthread.php?tid=5585)


FunLib - Algor - 20.04.2020 17:18

Предыстория: (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


RE: FunLib - Zur13 - 20.04.2020 18:04

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

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 переменной включая ЕРТ.


RE: FunLib - Algor - 20.04.2020 18:33

(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).
Или даже одним новым операндом, не помню синтаксис. Я по привычке пользую |,-


RE: FunLib - Zur13 - 20.04.2020 18:53

(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).
Или даже одним новым операндом, не помню синтаксис. Я по привычке пользую |,-

Ну для этого и нужно обсуждение чтобы не включать не нужные функции. Новые операторы конечно удобнее.


RE: FunLib - Zur13 - 20.04.2020 21:28

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

Я могу поробовать сделать пробную реализацию, если это действительно еще кому-то интересно.


RE: FunLib - Algor - 20.04.2020 23:21

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


RE: FunLib - igrik - 20.04.2020 23:40

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

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


RE: FunLib - Algor - 21.04.2020 01:57

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

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


RE: FunLib - Berserker - 21.04.2020 06:10

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

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


RE: FunLib - Algor - 21.04.2020 10:14

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


RE: FunLib - Algor - 21.04.2020 10:21

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

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

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


RE: FunLib - Berserker - 21.04.2020 16:14

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


RE: FunLib - Zur13 - 21.04.2020 16:25

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

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


RE: FunLib - Algor - 21.04.2020 17:36

(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 будет быстрым и легким.


RE: FunLib - Berserker - 21.04.2020 18:06

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

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


RE: FunLib - Zur13 - 21.04.2020 19:01

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

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? На ЭРА 2 есть минимум 3 мода которые используют функцию для экономии переменных из фан.ерм.

Предлагаю в библиотеке всё-же оставить версию этой функции, а с повсеместным переходом на ЭРА 3 сменить ее реализацию и пометить ее @deprecated с коментарием что вместо нее теперь нужно использовать SN:H.


RE: FunLib - Algor - 21.04.2020 21:51

(21.04.2020 18:06)Berserker Wrote:  Данный функционал скорее вреден, чем полезен. Нельзя пытаться получать адреса динамических строк и таким вот хаком их применять. Просто одна сплошная бомба-костыль.
Видишь, библиотека еще даже в альфе на вышла, а уже какая польза!

Итак, зайдем сначала.

1) Стоит задача изменять большое количество максимально разных текстовых элементов в игре (имена, описания навыков, монстров, специализаций, артефактов, городов, объектов и пр.).
2) Делать это надо максимально единообразным инструментом (не обязательно функцией).
3) При этом не должны использоваться существенно ограниченные ресурсы.
4) При использовании в различных скриптах необходимо минимизировать (в идеале, исключить) вероятность коллизий

Для текущей реализации все эти пункты неплохо выполняются. Да, может и плохо, но выполняются и взрыв костыль-бомбы никого еще критично не зацепил. Но:
5) надо уходить от ert на json
6) это все же некорректно и потенциально опасно

Из пожеланий к новой реализации могу выделить еще одно, достаточно важное:
7) хотелоь бы иметь возможность не только устанавливать тексты, но и получать текущие. Сейчас это есть не везде.
8) хотелоь бы иметь возможность сбрасывать тексты на тексты по-умолчанию. Сейчас это тоже есть не везде. Не так важно, как п. 7)

Вопрос: как можно реализовать выполнение пунктов 1-5 +, желательно, 7 и 8 без недостатков п.6?

Текущего инструментария достаточно? Или нужен еще?
Если второе, то что делать пока нужного инструментария нет?


RE: FunLib - Berserker - 21.04.2020 22:30

Описания должны автоматом сохраняться в сейве и восстанавливаться при загрузке, не умирать от F12 (привет прямые ссылки на ERT/что угодно динамическое) и любых схожих техник.

SN:H и есть такая команда.
Для удаления/восстановления подсказок нужно вместо ^spec^-подобного имени группы указать ^-spec^.

SN:H^object^/#type/#subtype or -1/$hint
SN:H^object^/x/y/z/hint
На получение тоже работает. Возвращает ранее установленное через SN:H значение.

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
Работает и GET-синтаксис на актуальные значения.

----------------------

Замечу, всё это в 2.9.13, когда можно даже SN:H^xxx^/1/2/3/^%T(algor.loves.json)^;

----------------------

Поддержки артефактов пока нет.


RE: FunLib - Zur13 - 21.04.2020 23:20

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


RE: FunLib - Algor - 22.04.2020 10:23

Berserker, хм, выглядит вкусно, надо переползать на 2.9.13 (я ща на 2.9.12 сижу)

Zur13, глянул только одно место, есть пара вопросов (Click to View)



RE: FunLib - Algor - 22.04.2020 10:29

(22.04.2020 10:23)Algor Wrote:  Berserker, хм, выглядит вкусно, надо переползать на 2.9.13 (я ща на 2.9.12 сижу)

Zur13, глянул только одно место, есть пара вопросов (Click to View)

Кстати, общестратегический вопрос по функциям:
если в функцию передаются неверные параметры, что лучше делать?
а) ничего не делать, пусть вылетает ошибка и моддер чешет репу
б) молча отфильтровывать некорректные параметры и пусть моддер чешет репу
в) выводить предупреждение через IF:L/IF:M
г) выводить сообщение через спец.функцию Fun_Warning, которая на основании какого-нить значения типа Warnings=# в ini/json действует по одному из вышеперечисленных правил


RE: FunLib - Zur13 - 22.04.2020 12:54

(22.04.2020 10:29)Algor Wrote:  
(22.04.2020 10:23)Algor Wrote:  Berserker, хм, выглядит вкусно, надо переползать на 2.9.13 (я ща на 2.9.12 сижу)

Zur13, глянул только одно место, есть пара вопросов (Click to View)

Кстати, общестратегический вопрос по функциям:
если в функцию передаются неверные параметры, что лучше делать?
а) ничего не делать, пусть вылетает ошибка и моддер чешет репу
б) молча отфильтровывать некорректные параметры и пусть моддер чешет репу
в) выводить предупреждение через IF:L/IF:M
г) выводить сообщение через спец.функцию Fun_Warning, которая на основании какого-нить значения типа Warnings=# в ini/json действует по одному из вышеперечисленных правил

2) Список это массив размера М у которого первый элемент хранит количество элементов в списке L, причем всегда M > L, так как есть нулевой элемент недоступный модеру. В данном случае initial size задает изначальный размер массива М, там кстати недоработка нужно бы так:

Code:
!!VRy1&x1>0:Sx1 +1;   [y1, initial array size]

Далее при операциях вставки размер массива периодически увеличивается чтобы он был на 20-30 элементов больше чем размер самого списка (не при каждой вставке а с шагом по 10 элементов), при удалении наоборот уменьшается шагом по 10 элементов, плюс перекрытие (threshold) между добавлением и удалением чтобы избежать ресайзов когда модер добавляет/удаляет приграничный элемент несколько раз, тут еще надо проверить и подкрутить если что.

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

Правка: если товарищ Berserker, добавит АПИ для выброса кастомных исключений, то всё станет намного проще, выбрасываем исключения для ошибок и всё, это самый правильный подход, потому что тогда модер сразу видит где он лажает. Эх если бы еще в окне ЕРМ ошибки показывали кусок стека вызовов функций ЕРМ, цены бы ему не было. Вот такое небольшое дополнение к окошку с ЕРМ ошибкой намного всё упростило бы:
Code:
!?CM5;(fun_lists.erm:403)
!?FU(Fun_ListAppend)(fun_lists.erm:248)
!?FU(Fun_ListSize) (fun_lists.erm:55)



RE: FunLib - Berserker - 22.04.2020 16:50

Algor, в 2.9.12 все эти SN:H команды есть. Они вводились постепенно, всегда мыли в журналах изменений. Так что попробуй.

Fun_ShowErmError с автогенерацией отладочной информации (GenerateDebugInfo до показа диалога) + по возможности наиболее мягкое решение.

Zur13, нет, исключений добавлять не буду. Хватит насиловать ЕРМ. Нужно уже срочно писать обёртку для Lua. Я закончил переписывать !!VR полностью. ЕРМ почти принял достаточно стабильный и целостный вид.


RE: FunLib - ElfbI - 22.04.2020 19:36

Berserker, оказывается не мне одному не хватает справочника по новым командам! Искать все в чейнджлогах ну такое Fie


RE: FunLib - Berserker - 22.04.2020 19:52

ElfbI, мне тоже не хватает.


RE: FunLib - ElfbI - 22.04.2020 21:13

Berserker, 96-copy


RE: FunLib - igrik - 23.04.2020 10:33

Закину пока сюда, чтобы не потерялось:
Code:
!?FU(FUN_SpellDisabled);
; x1 - spell id
; x2 - get/set enabled(0) or disabled(1) spell status
!!FU|x1<0/x1>69:E;    check incorrect parameters
!!UN:C6919480/4/?y1;  get ptr GameMng
!!VRy2:Sx1 +74 +y1;   offset to array disabled spells status
!!FU:S2/?y3;          get function syntax type
!!UN&y3=0:Cy2/1/?x2;  get disabled spell status
!!UN&y3=1:Cy2/1/x2;   set disabled spell status



RE: FunLib - igrik - 23.04.2020 10:52

У меня сразу же вопрос: мы в библиотеке будем поддерживать новый синтаксис (введенный в 2.9.13) HE:Z, BM:Z и UN:C?


RE: FunLib - XEPOMAHT - 23.04.2020 11:06

(23.04.2020 10:33)igrik Wrote:  Закину пока сюда, чтобы не потерялось:
Code:
!?FU(FUN_Spell_CheckIsDisabled);
; x1 - spell id
; x2 - get/set enabled(0) or disabled(1) spell status
!!FU|x1<0/x1>69:E;    check incorrect parameters
!!UN:C6919480/4/?y1;  get ptr GameMng
!!VRy2:Sx1 +74 +y1;   offset to array disabled spells status
!!FU:S2/?y3;          get function syntax type
!!UN&y3=0:Cy2/1/?x2;  get disabled spell status
!!UN&y3=1:Cy2/1/x2;   set disabled spell status

Это дубликат воговской !!UN:J0. Но зачем???


RE: FunLib - igrik - 23.04.2020 11:16

А разве проверить статус можно?

Тьфу блин! Я не знал, что можно проверить. Нужно указать, чтобы занесли описание в справочник.


RE: FunLib - Algor - 23.04.2020 15:08

(23.04.2020 10:52)igrik Wrote:  У меня сразу же вопрос: мы в библиотеке будем поддерживать новый синтаксис (введенный в 2.9.13) HE:Z, BM:Z и UN:C?
Да, я нацеливаюсь на последнюю 2,9,х. Если выйдет 14я - на нее.


RE: FunLib - Berserker - 23.04.2020 16:59

igrik, медаль за изобретение !!UN:J0! 148
(не помню про эту команду вообще)

Название для функций с Set/Get синтаксисом лучше давать без Set, Get, Check, Is.

Fun_SpellDisabled (set/get yes/no)
Fun_StackMorale (set/get value)
Fun_StackSummoned (set/get yes/no)


RE: FunLib - Raistlin - 23.04.2020 23:48

Предлагаю добавить в библиотеку функции, влияющие на экран города:

При замене анимации нужно также записать в память новое количество кадров:
Перемещение зданий:
Приоритет отображения:



RE: FunLib - Zur13 - 25.04.2020 03:03

Правка: неактуальный текст удален, новая версия в сообщении ниже.

Апи еще не закрыт мне непонятен вопрос с обработкой ошибок, какой способ реализовать? Что делать с существующими функциями которые возвращают статус операции?


RE: FunLib - Berserker - 25.04.2020 06:12

Zur13, сделать ничего вредного и по возможности сделать полезное + вызвать !!FU(Fun_ShowError), где первой командой SN:F^GenerateDebugInfo^ сгенерировать отладочную информацию, где в Debug\Era\erm tracking.erm будет виден вызывающий код, а после сразу IF:M с содержимым z1, например.


RE: FunLib - Zur13 - 25.04.2020 20:24

Правка: удалено неактуальное описание, новая версия в сообщении ниже.

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


RE: FunLib - Berserker - 25.04.2020 21:37

Имя — нет, номер — можно.
!!FU(Fun_A):P(Fun_B);

!?FU(Fun_A);
!!FUx1:P; calling callback


RE: FunLib - Zur13 - 01.05.2020 17:38

По спискам, я думаю функционал и АПИ закрыт вот новая версия скрипта.

Переписал большинство циклов на !!re , осталась пара мест где SN:G просто удобнее и компактнее.
Функция сортировки по натуральному значению использует мой кастомный алгоритм, должно быть быстрее чем пузырьком и скорее всего быстрее сортировки рассческой (comb sort).
Функция сортировки с использованием компаратора реализована алгоритмом сортировки перемешиванием (cocktail sort) с небольшой модификацией (вторая часть алгоритма реализована не пузырьком, а сортировкой рассческой (comb sort) ).
В конце файла расположен тестовый код его 100% нужно удалить или закаментить перед использованием (там неплохой юнит тест написан, который сам по себе может служить подсказкой по использованию).
**
Добавил функции множественного гета, и фильтрации. Добавил в функции где это актуально проверку валидности аргументов и вызов FU(Fun_ShowError) в случае неверных входных аргументов (описание ошибки в z1).
Короткая справка по АПИ (полностью можно посмотреть в файле):
**
Переделал кастомизированные версии функций "сортировки", "поиска", "фильтрации" и "для каждого элемента" так чтобы они получали имя коллбек функции через аргумент вызова (спасибо товарищу Berserker, за подсказку).

В принципе считаю что уже всё готово и достаточно протестировано. Можно использовать. Пока больше не планирую ничего тут менять.

Короткая справка по АПИ:



RE: FunLib - Algor - 05.05.2020 03:25

Как написал в соседней теме, в ближайшие полгода буду появляться тут редко.
Список функций и событий для библиотеки подготовил, но пока не стал пороть горячку и выкладывать сразу модом, ибо может разойтись, а оно еще не обсуждалось.
Все "мои" (используемые в ES) функции и события оформлены отдельными файлами и включены в ES 1.46, можно их взять оттуда для обсуждений и доработки.

Файлы называются Event_<name> и Fun_<name> соответственно.
В каждый файл включен мини-хэлп и/или пример использования, это потом можно (если нужно) будет вынести в общий справочник.

Event_AfterMeeleDamage
Event_AfterRangedDamage
Event_AfterStackObtainsTurn
Event_ArtGoldIncomeCalculation
Event_ArtResIncomeCalculation
Event_BeforeChangeHeroInHeroScreen
Event_BeforeHeroLevelUpDialog
Event_BeforeOnBeforeBattle
Event_OnUpdateHeroScreen
Event_TownGoldIncomeCalculation

Fun_GetHeroPortrait
Fun_GetRandomSpell
Fun_GetSecSkillDescription
Fun_RedrawShadowAfterAction
Fun_SetDescriptionFromERT - думаю, можно будет упразднить, когда Берс допилит SN:H для артефактов
Fun_SetSecSkillValue - пока там только часть навыков, в идеале сделать для всех.
Fun_SpellAnimationOnStacks

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


RE: FunLib - Algor - 18.05.2020 16:39

Обновил первое сообщение. Добавил Fun_GetTownBuildingInfo.erm


RE: FunLib - Bes - 01.06.2020 07:03

(23.04.2020 11:16)igrik Wrote:  
ХЕРОМАНТ Wrote:Это дубликат воговской !!UN:J0. Но зачем???
А разве проверить статус можно?

Тьфу блин! Я не знал, что можно проверить. Нужно указать, чтобы занесли описание в справочник.
так вроде ж в справке есть это...
Quote:J0/#/$
Запретить заклинание
    # – номер заклинания (0..69)
    $ – разрешить/запретить
    0 – разрешить
    1 – запретить
Комментарий:
Этот запрет работает только для гильдий магов и пирамид, но вы можете проверить значение, установленное здесь, для любого ERM-скрипта.
Yes


RE: FunLib - slater777 - 12.12.2022 11:48

Fun_SetSecSkillValue с поместьем и мистицизмом некорректно работает? Неясно, зачем там пересчет в проценты, когда очки маны и золото идут в целых числах.