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) Предлагаю в этой теме и начать. Вся необходимая информация (параметры, примеры и пр.) - внутри сответствующего скрипта. Здесь только краткие названия. События. // после рукопашной атаки 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: ******************************************************************************** Дальше более специфические предложения, они вроде как нужны и могут оказаться полезными. Вот например изменение текста описания монстра в бою, оно работает, основано на коде 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 - вещи которые делаются базовым инструментарием. Такие незачем выносить в библиотеку - они очень просто реализуются. Ну для этого и нужно обсуждение чтобы не включать не нужные функции. Новые операторы конечно удобнее. 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, принято.Да. Может лучше один файл на секции разделить? Сразу поиск по всем идентификаторам, доп. константам, пояснениям. Лучше пусть привязываются к моду, имхо. Вегда можно рискнуть скопировать нужную секцию к себе. 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-мод (или когда ты созреешь включить его в базовую поставку Эры ) проще будет привязываться к нему, т.к. эта зависимость станет необременительной. А пока, навскидку, есть пара моментов, требующих помощи профессиональной части зала. 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: Данный функционал скорее вреден, чем полезен. Нельзя пытаться получать адреса динамических строк и таким вот хаком их применять. Просто одна сплошная бомба-костыль. Добавить и для артефактов конечно же надо. Я так понимаю этот функционал работает только в ЭРА 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 сижу) 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) 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, оказывается не мне одному не хватает справочника по новым командам! Искать все в чейнджлогах ну такое RE: FunLib - Berserker - 22.04.2020 19:52 ElfbI, мне тоже не хватает. RE: FunLib - ElfbI - 22.04.2020 21:13 Berserker, RE: FunLib - igrik - 23.04.2020 10:33 Закину пока сюда, чтобы не потерялось: Code: !?FU(FUN_SpellDisabled); 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: Закину пока сюда, чтобы не потерялось: Это дубликат воговской !!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! (не помню про эту команду вообще) Название для функций с 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, за подсказку). В принципе считаю что уже всё готово и достаточно протестировано. Можно использовать. Пока больше не планирую ничего тут менять. Короткая справка по АПИ: Spoiler (Click to View) 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/#/$ RE: FunLib - slater777 - 12.12.2022 11:48 Fun_SetSecSkillValue с поместьем и мистицизмом некорректно работает? Неясно, зачем там пересчет в проценты, когда очки маны и золото идут в целых числах. |