Wake of Gods Forum | Форум Во Имя Богов
Школа ERM 2 - Printable Version

+- Wake of Gods Forum | Форум Во Имя Богов (http://wforum.heroes35.net)
+-- Forum: Герои Меча и Магии 3.5 WoG/ERA (/forumdisplay.php?fid=99)
+--- Forum: Скрипты (/forumdisplay.php?fid=103)
+--- Thread: Школа ERM 2 (/showthread.php?tid=5671)


Школа ERM 2 - Berserker - 05.07.2020 03:45

Вопрос: как преобразовать скрипт из ERM 1 в ERM 2?
Ответ: Заменить ZVSE на ZVSE2. После чего убедиться, что именованные функции соответствуют указанному ниже стилю.

OnSomeEvent, DoSomeWork — стиль оформления, зарезервированный за Эрой, её событиями и функциями.

mod_OnSomeEvent, MOD_OnSomeEvent, mod_CountHeroes, mod_TeleportStack — так нужно именовать функции вашего мода или библиотеки. Здесь mod/MOD — уникальный префикс.

Примеры возможных префиксов:
acm_ - Advanced Classes Mod.
pm_ - Phoenix Mod.
wog_ - WoG
thu - Third Upgrades


RE: Школа ERM для ERA III - Berserker - 05.07.2020 04:23

Задача: написать скрипт, выводящий в виде чат-сообщения ID элемента карты приключений, на котором игрок щёлкнул правой кнопкой мыши.

Используем: именованные локальные переменные, интерполяцию строк.

Глоссарий:
Интерполяция — замена имён переменных и макро-имён в строке значениями переменных, например %y1 (переменная) на 7 (значение переменной y1).

Скрипт:

Пояснения:
Используем редактор из папки Tools\Sublime_Erm_Editor.

!?FU(OnAdventureMapRightMouseClick) является человеко-читаемым синонимом для !?CM0. При наборе !?FU(On_ редактор начнёт предлагать варианты имён событий. Вводите логически части английских слов, например OnAdmocl предложит завершить по TAB одно из двух имён событий: OnAdventureMapLeftMouseClick и OnAdventureMapRightMouseClick.

Время жизни локальных переменных можно визуально проследить по коду от !?XX события до следующего !?XX события. Для целых чисел используются y1..y100, вещественных e1..e100, строк — z-1..z-10 переменные.

ERA 3 позволяет давать переменным имена, автоматически выделяя для них индексы. Синтаксис — (имяПеременной). Использование неименованных локальных переменных не поощряется и может приводить к конфликтам, если смешивать одни с другими в рамках одного события.

Имена переменных не могут содержать "_" и должны начинаться с малой буквы. Примеры: heroId, numStacks, maxSkillValue.

При первом использовании переменной не ясно, какого она типа (целое y, вещественное e или строковое z), поэтому его нужно указать через двоеточие: (имя переменной:тип).

!!CM:I?(where:y); скорее всего заменится на этапе компиляции на !!CM:I?y1, сопоставив таким образом имя where с переменной y1.

Для интерполяции, то есть подстановки значения переменной на место её имени, переменных в строках используется синтаксис %(имя переменной). Можно также использовать и переменные ERM 1: %y3, %v7, %z500. Заметьте, что писать первую букву в верхнем регистре более не обязательно и не поощряется.


RE: Школа ERM для ERA III - V_Maiko - 05.07.2020 04:51

Perfect! Does this method work for all the old In The Wake of Gods scripts to update them if we want? Yes


RE: Школа ERM для ERA III - Berserker - 05.07.2020 13:41

V_Maiko, of course.


RE: Школа ERM для ERA III - Bes - 05.07.2020 17:20

Quote:Для ... строк — z-1..z-10 переменные.
а если я более 10ти раз закажу получение в строковую переменную, какие z-переменные начнут выделяться?


RE: Школа ERM для ERA III - daemon_n - 05.07.2020 18:43

Berserker, новый ERM2 синтаксис уже поддерживается sublime в Эре 3?Rolleyes


RE: Школа ERM для ERA III - Berserker - 05.07.2020 19:50

daemon_n, разумеется.

Bes, объявление 11-й переменной приведёт к ошибке. Нужно освободить одну из предыдущих.
Code:
; (-someStr) удалит переменную someStr.



RE: Школа ERM для ERA III - Bes - 05.07.2020 20:00

Berserker, а чего ты z1-z10 сюда же не завёл? тем более постоянно их для временных в скриптах ранее использовали Unsure


RE: Школа ERM для ERA III - Berserker - 05.07.2020 21:49

Bes, z1..z10 являются глобальными.



RE: Школа ERM для ERA III - Bes - 05.07.2020 22:14

указание точной переменной так не работает?



RE: Школа ERM для ERA III - Berserker - 06.07.2020 01:36

Bes, нет. Только автоматическое выделение.


RE: Ваши вопросы по ERM-скриптам - Bes - 06.09.2020 02:20

(06.09.2020 02:16)ElfbI Wrote:Следующий вопрос, новые глобальные вида
только под ZVSE2 ?

на 2.9.14 только для SN/RD/MP


RE: Ваши вопросы по ERM-скриптам - ElfbI - 06.09.2020 02:23

Bes, я сейчас пишу под последнюю эру, все вопросы по синтаксису для неё

Так новые глобальные вида
только для движка ZVSE2 ?


RE: Ваши вопросы по ERM-скриптам - Berserker - 06.09.2020 02:47

ElfbI, ZVSE2 не запрещает тебе частично писать в старом стиле, просто открывает новый функционал.
Конкретно глобальные i/s переменные и без него должны работать.

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

А можно так:



RE: Ваши вопросы по ERM-скриптам - ElfbI - 06.09.2020 02:51

Berserker, за десять лет привык уже к старому коду, для меня второе значительно дольше прочитать будет (и написать). Вот новые глобальные именованные реально удобно, удобнее SN:W, поэтому и вопрос появился


RE: Ваши вопросы по ERM-скриптам - Bes - 06.09.2020 02:58

(06.09.2020 02:47)Berserker Wrote:  
Вот такое реально удобнее, бесспорно, не надо парить голову в середине триггера с сотней строк в теле какую же там щас могу взять y-переменную Mail1

а вот с остальным пока реально сложно переучить беглое чтение кода, да...Bad


RE: Ваши вопросы по ERM-скриптам - Berserker - 06.09.2020 03:04

Bes, кроме этого константы вида (OBJ_MONSTER) вместо "54" и именованные функции. Всё.


RE: Ваши вопросы по ERM-скриптам - Bes - 06.09.2020 03:11

Berserker, сложно читать из-за увеличения длин строк, это я имел ввиду. И да, за многолетний период привычные типы на карте 98, 54 быстро воспринимаешь, чем (OBJ_TOWN),(OBJ_MONSTR) и т.д.
На всё это опять нужно время, потому ветеранам будет проще писать код смешанный (где-то новые команды, а где-то привычные старые нечитаемые для других числа)


RE: Ваши вопросы по ERM-скриптам - Berserker - 07.09.2020 21:06

Bes, читать сложно до первого написанного сложного триггера. Мозг — штука пластичная.

Пример:
(12.09.2020 00:32) Wrote:  



ERM функции - Berserker - 08.09.2020 03:13

Era 3.0.5+. ERM 2.0
Возвращает логическую принадлежность монстра конкретному городу/фракции. Изменения в настройках городов не влияют на работу функции.



RE: Школа ERM для ERA III - Berserker - 09.10.2020 15:00

Пример скрипта на информацию о посещении университетов (Click to View)



RE: Школа ERM для ERA III - igrik - 09.10.2020 15:08

Обучающие примеры скриптов на ERM 2.0
Парочка переписанных WoG скриптов (комментарии тут нужны только в редких случаях)
А код сам по себе уже вполне читаем.

ERM 2: выбор класса командира (Click to View)
ERM 2: быстрая настройка знамён полководца (Click to View)
ERM 2: Новые поля битв (Click to View)



RE: Школа ERM для ERA III - Berserker - 09.10.2020 15:13

Code:
!!SN:T^wog_186.title^/?z2;
!!SN:T^wog_186.standart^/?z3;
!!SN:T^wog_186.cancel^/?z4;
!!SN:T^wog_186.noHired^/?z5;
Можно прямо в !!IF:G(ERM_RADIO)/2/1024/^%T(wog_186.title)^/...
Все 4 переменные.


RE: Школа ERM для ERA III - igrik - 09.10.2020 15:17

(09.10.2020 15:13)Berserker Wrote:  
Code:
!!SN:T^wog_186.title^/?z2;
!!SN:T^wog_186.standart^/?z3;
!!SN:T^wog_186.cancel^/?z4;
!!SN:T^wog_186.noHired^/?z5;
Можно прямо в !!IF:G(ERM_RADIO)/2/1024/^%T(wog_186.title)^/...
Все 4 переменные.
Агонь 132 Буду учитывать в дальнейшем!


RE: Школа ERM для ERA III - Berserker - 09.10.2020 15:19




RE: Школа ERM для ERA III - Berserker - 09.10.2020 15:26

Code:
!!UN:N3/(paladin:z)/(MON_PALADIN_A)/0;
!!UN:N3/(hierophant:z)/(MON_HIEROPHANT_A)/0;
!!UN:N3/(temple:z)/(MON_TEMPLE_GUARDIAN_A)/0;
!!UN:N3/(succubus:z)/(MON_SUCCUBUS_A)/0;
!!UN:N3/(soul:z)/(MON_SOUL_EATER_A)/0;
!!UN:N3/(brute:z)/(MON_BRUTE_A)/0;
!!UN:N3/(ogre:z)/(MON_OGRE_LEADER_A)/0;
!!UN:N3/(shaman:z)/(MON_SHAMAN_A)/0;
!!UN:N3/(astral:z)/(MON_ASTRAL_SPIRIT_A)/0;

=>



RE: Школа ERM для ERA III - Night - 09.10.2020 17:47

Хм, что-то у меня каждый второй скрипт на ЕРМ2 с ошибками выдаёт.
Сделал copy/paste в sublime, сохранил, запустил игру. EraErmFlamework даже поставил, но что с ним, что без, везде ошибки. Пока без них только ERM 2: Новые поля битв запустил.

Что я делаю не так?


RE: Школа ERM для ERA III - Berserker - 09.10.2020 18:00

igrik определил у себя часть (аргх) безпрефиксных констант, которые в примере кода не указаны. Определи их сам.
Открой IF:Q, посмотри, какой ИД у артефакта, например 6, и напиши:
1000 night - consts.erm



RE: Школа ERM для ERA III - Night - 09.10.2020 18:13

Berserker, а как этот пример использовать?

Я сделал такой скрипт для проверки:
Но он мне также выдаёт ошибку
Или нужно вместо (UNC_UINT8) задавать значение смещения в байтах? 1,2 или 4?

Такого вида работает, а вот (UNC_UINT8) - нет. Хм.


RE: Школа ERM для ERA III - Berserker - 09.10.2020 23:32

Night, вот самый свежий исполняемый файл Эры:
https://dropmefiles.com/H5AQP

Там всё исправлено. UINT8 - Unsigned integer 8. Читаем беззнаковое целое число из 8-и бит, то есть байт. Это -1.


RE: Школа ERM для ERA III - SergOz - 10.10.2020 00:51

Правильно ли я понял, что именных переменных (name:y) должно быть не более 100, аналогично y1...y100?


RE: Школа ERM для ERA III - Berserker - 10.10.2020 02:51

SergOz, да, но только в рамках одного триггера от !?XX до следующего !?YY.
Потому ограничения, считай, нет. Для каждого триггера одни и те же y1..y100 переменные ииспользуются для разных целей под разными именами.


RE: Школа ERM для ERA III - Bes - 10.10.2020 04:35

Berserker, прости, не сильно вчитывался в новые возможности ERM2
Вот когда-то в SCVS можно было куски кода в константы всовывать
Code:
(errors off) = '!!UN:P904/1 P905/0;'; выключить показ ошибок
Тут такого нет (не планируется)?


RE: Школа ERM для ERA III - Berserker - 10.10.2020 14:50

Bes, нет, макросов, которые раскрывались бы в любую под строку, тут нет. Константы, что есть, — это строгие целые числа.
Для остального пишем функции.

Из библиотеки Эры:



RE: Школа ERM для ERA III - Bes - 10.10.2020 18:50

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



RE: Школа ERM для ERA III - igrik - 10.10.2020 21:17

(10.10.2020 18:50)Bes Wrote:  понял.
кстати, опять я в своём стиле... если сделать получение в двух разных строках в одну и ту же именованную локальную переменную, они потом откомпилируются в разные по номеру переменные, или в одну и ту же? Unsure
Bes, ну ты чо)))) Тестами проверяй))) Bers тебе уже не один раз говорит:
(10.10.2020 04:03)Berserker Wrote:  Bes, только тестами, Бес. По-другому не скажешь.



RE: Школа ERM для ERA III - Bes - 10.10.2020 21:27

не, не, это вопросы из разряда "справочная инфа", тут точно Berserker знает что будет.
Я не ради любопытства спрашиваю, исключительно готовлю материал для кое-чего
блин, чтобы тесты такие делать, нужна ERA3, а у меня нет и не хочется седьмую папку с героями заводить, я в имеющихся и то путаю где у меня что (SoD, WoG? ERA1.9, 2.46 (две или три с разными ФМ-релизами), 2,9,14)



RE: Школа ERM для ERA III - Berserker - 10.10.2020 23:13

Bes, в одну и ту же, конечно. В чём иначе смысл имени переменной, если она не на одну и ту же память указывает?
!!UN:P(WOG_OPT_LAST_ERROR)/?(result:y);
!!UN:P(WOG_OPT_MUTE_ERRORS)/?(result); второй раз можно тип не указывать, но можно и указать. Тогда он должен совпадать с ранее объявленным.

(result) заменится на y3, скажем.


RE: Школа ERM для ERA III - Bes - 10.10.2020 23:42

понял, спасибо


RE: Школа ERM для ERA III - Berserker - 13.10.2020 05:05

Просто большая функция на ЕРМ 2.0 (Click to View)



RE: Школа ERM для ERA III - wessonsm - 13.10.2020 19:41

Скрипт ведь учебный по большому счёту.
Просто действительно
мало примеров рабочих скриптов на ZVSE2.
Чем больше их будет - тем лучше.
Я именно так ERM осваивал - сначала только правил стандартные скрипты, потом уже потихоньку начал свои писать.


RE: Если просто нужен скрипт - SergOz - 23.10.2020 06:23

Ещё один скрипт на тему контроля посещения объектов игроками.
Мне нужно контролировать Палатки Ключников, потому приведу этот пример: (Click to View)
При определении координат клика не использовал i^...^, потому что у меня на ERA3.04 ругается на !!OBi^..^/i^..^/i^..^:T?(objType:y);, а значит не мог протестировать.

Вопрос: как можно оптимизировать этот скрипт?
P.S. Поясню что меня больше всего интересует. Есть цикл
в котором есть ?yx1. Как здесь можно применить именованную (another:y), чтобы потом её можно было показать в сообщении?


RE: Если просто нужен скрипт - Bes - 23.10.2020 19:54

SergOz, если честно, вообще не понимаю что ты тут замутил с
точнее понимаю, но не понимаю почему таким способом?
почему сразу нельзя было



RE: Если просто нужен скрипт - Berserker - 23.10.2020 20:17

SergOz, сегодня попробую дать полный ответ.

Bes, внутри %I() нельзя использовать проценты.


RE: Если просто нужен скрипт - SergOz - 23.10.2020 20:44

Quote:точнее понимаю, но не понимаю почему таким способом?
почему сразу нельзя было...
Bes, а ты попробуй сразу и на разных палатках - тогда станет понятно.
И, к тому же, у меня в том !?CM5; ещё отсылки на другие функции.


RE: Если просто нужен скрипт - Bes - 23.10.2020 20:50

SergOz, меня уже Berserker осадил этим:
Quote:внутри %I() нельзя использовать проценты.



RE: Если просто нужен скрипт - SergOz - 23.10.2020 21:01

(23.10.2020 20:17)Berserker Wrote:  внутри %I() нельзя использовать проценты.
И нельзя принудительно задавать ID ни в i^...^, ни в (...:y).
Только автоматическое выделение.


RE: Если просто нужен скрипт - Berserker - 23.10.2020 21:54

SergOz, но работает синтаксис ^%y(somePtr)^ или y(somePtr). Если я верно понял часть вопроса.


RE: Если просто нужен скрипт - Bes - 23.10.2020 22:25

Quote:И нельзя принудительно задавать ID ни в i^...^
хм, точно нельзя?
Ведь если в SN:W^^ можно
а
то почему i^var%y1^ не поддерживается?


RE: Если просто нужен скрипт - SergOz - 23.10.2020 22:39

Bes, как я понял в i^var%y1^ значение y1 будет восприниматься как имя, а не как ID. Само имя и будет ID, но, хз какое оно (автовыделение) и где его искать.
Berserker, а нужно ли перед первым чтением из, например,
писать
?


RE: Если просто нужен скрипт - Berserker - 23.10.2020 22:51

Внутри i^...^ идёт обычная интерполяция, как и внутри ^...^. Там можно что угодно использовать. Например, значения локальных переменных:
Даже в простом варианте можно сослаться на другую глобальную переменную:



RE: Если просто нужен скрипт - Bes - 24.10.2020 00:13

но при всём при этом нельзя такую солянку в диалоге отобразить? странно
Dry



RE: Если просто нужен скрипт - SergOz - 24.10.2020 00:20

Bes, !!IF:M^%i(battle_hero_%v9950)^;
нижний регистр i


RE: Если просто нужен скрипт - Berserker - 24.10.2020 00:26

S больше не поддерживает GET-syntax.

!!IF:M^%I(battle_hero_%v9950)^; not correct
Так нельзя, поскольку это вложенный % в %I(). Интерполяция внутри интерполяции не поддерживается.


RE: Если просто нужен скрипт - Bes - 24.10.2020 00:42

(24.10.2020 00:26)Berserker Wrote:  S больше не поддерживает GET-syntax.
начиная с какой версии, не напомнишь? надеюсь с ERA3 Rolleyes

SergOz, я до сих пор оперирую справочными данными от ERA2, а там нижний регистр в ^^ диалога не поддерживался


RE: Если просто нужен скрипт - Berserker - 24.10.2020 00:53

Bes, да, с третьей, где VR полностью переписан.


RE: Школа ERM для ERA III - Berserker - 24.10.2020 01:30

Задача: по клавише "H" войти в оборону всеми отрядами до хода следующего стека противника.
Применение: возможность массово пропускать ходы при ослеплённом противнике.
Требования: Эра 3.1.3+



RE: Если просто нужен скрипт - Berserker - 24.10.2020 02:03

(23.10.2020 06:23)SergOz Wrote:  
Мне нужно контролировать Палатки Ключников, потому приведу этот пример: (Click to View)
Вопрос: как можно оптимизировать этот скрипт?

SergOz, сформулируй тезисно, что должен делать скрипт.

Для палатки с определённым цветом вывести по ПКМ число раз, сколько заходили в объект?


RE: Если просто нужен скрипт - SergOz - 24.10.2020 02:24

Berserker, да, по ЛКМ+Ctrl. Чтобы на каждой палатке количество посещений каждого игрока.
У меня там заморочка с этими палатками и этот скрипт нужен только для контроля поведения ИИ на фазе тестирования.
Мой скрипт работает и мне этого достаточно. Просто, в процессе написания, возникли вопросы почему глючит !!OBi^...^ и как именованную y уподобить синтаксису !!SN:W^..^/Syx1;
Ну и узнать про другие возможные упрощения/улучшения в скрипте, в качестве повышения уровня понимания ERM2.


RE: Если просто нужен скрипт - Berserker - 24.10.2020 02:37

Пожалуйста, используйте уникальный префикс для своих глобальных переменных вроде "serg_". Иначе не оберётесь проблем с совместимостью и багами.
меняем на:



RE: Если просто нужен скрипт - Berserker - 24.10.2020 02:42

Заменяем:
На:



RE: Если просто нужен скрипт - Berserker - 24.10.2020 02:50

Заменить на:



RE: Если просто нужен скрипт - SergOz - 24.10.2020 03:00

Berserker, да, точно - в функцию можно передать координаты через х1, х2, х3.
Насчёт всего остального понял. Спасибо!

P.S. А вот с циклом нужно разобраться. Много нового. 36


RE: Если просто нужен скрипт - Berserker - 24.10.2020 03:16

Смотри, я прохожусь от i = цвет первого игрока до цвет последнего игрока
Вот эти константы:
Далее, тебе нужен был массив из 8 счётчиков. Скажем, visits[8] выделит
[y20, y21, y22, y23, y24, y25, y26, y27] под это дело.

visits[0], где 0 - логический индекс элемента в массиве (всегда от нуля), скомпилируется в y20.
visits[1] в y21 и т.д.

А @visits или @visits[0] скомпилируется в индекс без y-префикса: 20.

@visits[0] = 20
@visits[7] = 27.

Тогда данная строка просто вычислит индекс y-переменной счётчика для i-го игрока
!!VR(visitPtr:y):S(@visits) +i;
=>
!!VR(visitPtr:y):S20 +i;

А значит y(visitPtr) означает y20..y27 поочерёдно. То есть буквально y-переменная с индексом, хранимым как число в переменной (visitPtr)


RE: Если просто нужен скрипт - SergOz - 24.10.2020 03:23

Berserker, а с какой версии Эры начинают работать !?OB(OBJ_KEYMASTERS_TENT); и другие константы?
И где можно скачать эту версию, если нет доступа к Яндексу?


RE: Если просто нужен скрипт - Bes - 24.10.2020 03:29

Вот же...
(24.10.2020 01:32)Berserker Wrote:  Обновление: https://dropmefiles.com/PSvrC



RE: Школа ERM для ERA III - Berserker - 24.10.2020 04:14

С 3.0.1, если не ошибаюсь. Но мод Era Erm Framework (должен быть включён) обновляется с каждым релизом Эры.


RE: Школа ERM для ERA III - Berserker - 25.10.2020 06:25

Задача: сделать возможным переопределять глобальные переменные мода из json-конфига с поддержкой констант.
Требования: Era 3.2.0+, Erm Framework Mod 3.2.0+
Решение:



RE: Школа ERM для ERA III - SergOz - 25.10.2020 12:24

Berserker, спасибо за код скрипта с палатками. Разобрался полностью.
(24.10.2020 04:14)Berserker Wrote:  Задача: сделать возможным переопределять глобальные переменные мода из json-конфига с поддержкой констант.
Если можно, то небольшой пример, пожалуйста, в каких целях это можно применить


RE: Школа ERM для ERA III - Berserker - 25.10.2020 16:08

SergOz, я выпускаю мод на смешанные нейтралы с json-файлом настроек в Lang. Ты выпускаешь свой мини-мод настроек смешанных нейтралов по каждому типу монстров и заодно меняешь глобальные настрйки так:
Code:
{
  "mix": {
    "global": {
      "minNumNeutralStacks":        "2",                // Minimum number of mixed neutral stacks in battle.
      "maxNumNeutralStacks":        "4",                // Maximum Number of mixed neutral stacks in battle.
      "neutralStackSpread":         "MIX_SPREAD_SPACE_BETWEEN", // Default spread strategy for neutral stacks.
                                                        // Possible values:"sp_no", "sp_random", "sp_top_down", "sp_near_center", "sp_away_form_center", "sp_space_between".
      "neutralStackScale":          "125",              // Multiplier for original neutrals quantity on adventure map in percents.
      "netralStackScaleForHuman":   "200",              // Additional multiplier of neutrals power only for humans in percents.
      "noNeutralsMorale":           "1",                // If 1, neutrals will have no morale at all.
      "generateMonstersByFactions": "1",                // If 1, additional generated monsters will belong to the same faction.
      "allowAlliedFactions":        "1",                // If 1, allied faction monsters will also be generated.
      "moveNeutralsToFactions":     "1",                // If 1, all WoG neutral monsters will be assigned a faction / town.
      "registerRegularMonsters":    "1",                // If 1, all regular WoG creatures are registered and will become accessible for generation.
      "registerFactionAllies":      "1",                // If 1, configurates each faction allies and their association level.
    },

    "mon173": {
      "custom": "1",
      
      "slot0": {
        "type": "MIX_MON_TYPE_ALLIED_FACTION",
      }
    }
  }
}

Мой мод отображает глобальные настройки из json на глобальные именованные переменные. А ты, как пользователь-настройщик, в ЕРМ файлы не лезешь, но можешь использовать константы в виде значений. Скажем, тебе нужно в слоте сгенерировать монстра той же фракции или союзной фракции.
Ты пишешь: "type": "MIX_MON_TYPE_ALLIED_FACTION" вместо -3, например.


RE: Школа ERM для ERA III - Bes - 25.10.2020 19:01

Berserker, как я понимаю, последовательность !?FU и !#VA не принципиальна, и можно
в обратном порядке вызывать?



RE: Школа ERM для ERA III - SergOz - 25.10.2020 19:15

Berserker, в коментах научных каналов часто можно видеть такое:
"Ничего не понятно, но афигенно интересно".
Здесь примерно то же самое, но суть я уловил. Перечитывая, раза с N-ного дойдёт. 97
Спасибо!


RE: Школа ERM для ERA III - Berserker - 25.10.2020 21:43

Bes, нельзя.
Глобальные переменные — это i^..^, s^...^. а (такиеПеременные) — сугубо локальные от !?XX до следующего !?XX.


RE: Школа ERM для ERA III - Bes - 25.10.2020 21:54

а чего тогда ты сделал объявление локальной через синтаксис !# ? (сразу провокация на выход из твоих примеров использования 148)


RE: Школа ERM для ERA III - Berserker - 25.10.2020 22:33

Чтобы выделить данную конструкцию визуально. Она работает только на этапе прекомпиляции как команда-пустышка, но все объявленные в ней переменные остаются.
Иными словами нет разницы между:

и



RE: Школа ERM для ERA III - igrik - 26.10.2020 23:07

Image: Image.jpg
Расширенные подсказки по двеллингам на ERM 2 (Click to View)
Обучающий и показательный пример как правильно конвертировать дублирующийся код в цикл © Berserker (Click to View)



RE: Школа ERM для ERA III - Night - 27.10.2020 17:28

igrik,
Quote:Расширенные подсказки по двеллингам на ERM 2 (Click to View)

А этот пример под какую версию библиотеки и эры?
Я попробовал у себя на последних доступных для скачивания файлах (от 25.10.2020), у меня:
Так это выглядит (Click to View)
Код из ERm tracking (красиво смотрится) (Click to View)



RE: Школа ERM для ERA III - Berserker - 27.10.2020 17:53

Night, попроси у Игрика пару функций, что у него в библиотеке. Там получение строки с названием жилища и строки о принадлежности жилища. Сейчас функций нет и s^result^ пустая.


RE: Школа ERM для ERA III - igrik - 27.10.2020 18:11

WoG Scrips 2 library

Но учтите: она ещё далеко не закончена и активно пилится поэтому в будущем многое в ней может поменяться.


RE: Школа ERM для ERA III - Bes - 28.10.2020 05:00

Code:
New command !!VR$1:Z#2. Creates trigger local temporary z-variable with given contents and assigns its index to integer variable.
    $1 - integer variable.
    #2 - any string.

    The command can be used to create temporal z-variables to change, for example, artifact description,
    show message and restore description.
Berserker, можно один пример, а то не совсем понял как параметр #2 прописывать (литералами, или индексом строки)


RE: Школа ERM для ERA III - Berserker - 28.10.2020 05:44

Любая строка:
^bes is nice^
(someLocalStr) для (someLocalStr:z)
z5 - забудьте уже про эти глобальные неименованные, но в качестве исключения можно
z(strPtr), где (strPtr:y) — индекс строки

Любая поддерживая движком строка.
Будет создана её копия в виде временной z-переменной с огромный индексом, как у ERT-переменных. Эта переменная только для чтения. Как и ERT. Писать в неё не выйдет.


RE: Школа ERM для ERA III - Bes - 28.10.2020 05:53

блин, напиши для примера ЛЮБУЮ строку кода с этой командой
и да, забыл попросить, если надо такую конструкцию делать в коде, как мне замутить через VA:(name[9]:z)

   P.S.имеется ввиду, я ни как не обойдусь без девяти отдельных строк для конкатенации к голове и хвосту имени файла уникальную серединку?


RE: Школа ERM для ERA III - Berserker - 28.10.2020 06:10

Тебе нужна самая свежая версия Эры.
https://dropmefiles.com/5p4Rt
Там реализована, наконец-то, возможность возвращать строки из функций.



RE: Школа ERM для ERA III - Bes - 28.10.2020 06:18

спасибо, я понял, думал что можно короче...132
но как видишь, в подобных манипуляциях нет смысла изголяться, код и на чистом ЕРМ вполне себе ясен в данном конкретном примере. я считаю в таких случаях стоит оставить код как и был 10 лет назад, тока имя для ф-ции завести


RE: Школа ERM для ERA III - Berserker - 28.10.2020 06:36

Quote:код и на чистом ЕРМ вполне себе ясен в данном конкретном примере.
Бес, функции ещё бывает нужно усложнять, дополнять опциональными параметрами, сопровождать и т.д. Не говоря уже про работу с глобальными z-строками и необходимостью комментариев.

Сравни уже:




RE: Школа ERM для ERA III - Bes - 28.10.2020 15:21

ты прав. я и не спорил. Yes
Но я говорил о конкретно моём примере. Всё. Там ничего нового не нужно. Всё читается сходу даже спустя 8 лет (в моём случае).
Всего лишь адаптировать под временные переменные для получения полного имени файла.


RE: ERA III - Bes - 28.10.2020 15:40

(28.10.2020 06:29)Berserker Wrote:  Bes, потому что ты пишешь простой линейный код без сложных функций, вложенных циклов, активного использования массивов и косвенной адресации, без динамических массивов и вложенных динамических массивов и т.д.
так я ж не спорю, для такого сложного профессионального кода нужна практика и опыт в построении логики кода, чего у меня естественно нет. Считай начинаю всё заново, лишь имея бэкграунд старой школы скриптинга.
Вот, мои первые пробы пера... жаль нет щас возможности на работе с ПК позаниматься, а на бумаге сложно получается (без справки и материала), вчера пробовал )))

Это пока просто переписал родной WoG скрипт, с РО костылями, которые потом уберу.
И да, не знаю, как быть с вот таким смещением координат
ведь SN:O во второй версии ERA с изъяном, и по сути я, убрав эти древние изголяния с подгонкой кода под красныве клетки объекта и последующего диалога вывода инфы по объекту, автоматом заложу возможный баг при известной ситуацией с другим героем на входе фабрики. Да, код будет под ERA3 написан, но и на ERA2 перекомпилированный тож уйдёт в сборку, потому такая вилка и возникает


RE: ERA III - igrik - 28.10.2020 19:18

(28.10.2020 15:40)Bes Wrote:  
Надеюсь эти объявления у тебя "тестовые", и ты их не будешь в скрипт засовывать. А то будет горе.
Из-за того, что они уже объявлены у Берса, после твоего объявления будут сыпаться ошибки.

(28.10.2020 15:40)Bes Wrote:  
А вот это уже плохой код - что если я, или ещё один умник захочет использовать глобалку с таким же именем?
Кстати, такими вот конструкциями изобилует нынешний WoG Scripts. Давайте не будем их применять. Разве сложно уже в триггере проверить опцию и не использовать глобалку?

(28.10.2020 15:40)Bes Wrote:  
Бес, именованные функции используй!


RE: Школа ERM для ERA III - Berserker - 28.10.2020 19:49

igrik, я так понял, это черновая наброска адаптации кода из Феникс-Мода по машинам войны.


RE: Школа ERM для ERA III - Bes - 29.10.2020 03:08

igrik, это всего лишь адаптация готового wog-кода под ERM2.0
никто пока ничего не делал готовое, не переживай.
По констатам - я просто их на виду себе поставил из 9999 era - consts, конечно же.
ф-циям ещё не успел придумать названия, это успеется


RE: Школа ERM для ERA III - Berserker - 29.10.2020 04:22

Bes, вот тебе решение вопроса по совместимости.
Вместо SN:O функцию делаешь

!?FU(bes_GetObjectEntrance); получить вход объекта
!#VA(x:x) (y:x) (z:x);
!#VA(resX:x) (resY:x) (resZ:x);
; получить версию Эры, если >= 3100, например, то
!!SN:O?(x)/?(y)/?(z)
+ скопировать x, y, z в resX, resY, resZ

иначе вызвать ЕРМ функцию от Хероманта или кого-либо ещё.


RE: Школа ERM для ERA III - Bes - 30.10.2020 03:19

так, никак не могу решить, так как мне обозвать глобальную переменную, взамен использования PO:H
по скрипту 05 там записывают три значения, распределив их по всему байту.
Я же хочу просто завести три глобальные, но с хитровыстроенным именем, дабы оперировать в цикле удобно было
у меня длинно выходит, зараза
эти три переменные потом будут в диалоге и по ПКМ по фабрике машин считываться, и в теле !?DL соответственно

короче, у меня беда только с тем, как для оф.wog скрипта назвать переменные Dry


RE: Школа ERM для ERA III - Berserker - 30.10.2020 03:47

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

У тебя, как я вижу, есть необходимость хранить число машин для покупки в спец. строениях на карте. Жилище машин, то бишь. Тут хватит точно так же одной переменной.
i^wm_num_machines_%(warMachine)_%(x)_%(y)_%(l)^

КоличествоМашин = КолвоМашин = numMachines (читается как Number of machines = количество машин).


RE: Школа ERM для ERA III - Bes - 30.10.2020 04:03

да, я просто не так выразился. Одна универсальная переменная... хотя по факту будет в памяти туева хуча создаваться
мне твой вариант не нравится, он и длиньше и... не нравится 96-copy
P.S. да, кстати, чего ты не любишь точки использовать в названиях? как я понимаю, это не возброняется?


RE: Школа ERM для ERA III - Berserker - 30.10.2020 04:21

В ЕРМ 2 не пройдут точки. Синтаксис очень строгий:

имяЛокальнойПеременной (с маленькой, a-zA-Z в начале, a-zA-Z0-9 далее)
имя_какойтоСложнойФункции (отличается наличием префикса с аббревиуаторой мода). Без префикса — глобальные функции и события Эры.
НАЗВАНИЕ_КАКОЙТО_КОНСТАНТЫ (константы)

Для глобальных именованных переменных таких ограничений нет, но:
1) Всё равно рекомендуется уникальный префикс мода (нет конфликтов, удобно читать дамп в журнале с сортировкой)
2) Лучше без точек, но с нижним подчёркиванием. Тогда Sublime будет считать такую строку одним словом, а это:
-) Выделение по двойному щелчку, cltr + влево/вправо
-) Автозавершение по уже упомянутому ранее слову

Потому от точек теперь избавляюсь.


RE: Школа ERM для ERA III - Bes - 31.10.2020 23:29

(09.10.2020 15:00)Berserker Wrote:  
Пример скрипта на информацию о посещении университетов (Click to View)
смотрел, смотрел. и не увидел куда дальше ушла переменная !!VR(bit:y)
здесь может ошибка в имени переменной?144


RE: Школа ERM для ERA III - Berserker - 01.11.2020 00:31

Это testBit, исправил.


RE: ERA III - SergOz - 21.11.2020 02:03

Задача: сгенерировать различные 4 цифры от 1 до 9.
Написал:
!!IF:M^%Y1 %Y2 %Y3 %Y4^;

А как это можно сделать на ERM2?
И ещё, пожалуйста, маленький пример с использованием !!co в цикле


RE: Школа ERM для ERA III - Bes - 21.11.2020 03:28

Quote:И маленький пример с использованием !!co в цикле
Скажем, пусть нам надо заменить всех в армии героя на монстра (boost_mon)




RE: Школа ERM для ERA III - SergOz - 21.11.2020 04:03

Bes, пожалуйста, русским языком: что делает эта !!co?
При выпонении или невыполнении условия как продллжается работа цикла?
Куда что переходит? я ни хрена не могу понять и не могу проверить. Все варианты которые я придумал, дают одинаковый результат, не зависимо от верности условия после !!co


RE: Школа ERM для ERA III - Bes - 21.11.2020 04:11

ну, грубо говоря,
давай на старом цикле объясню (мне чёт кажется что ты в старой школе сечёшь)

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


RE: Школа ERM для ERA III - Berserker - 21.11.2020 04:32

SergOz, твоя задача решается следующим образом:
1) Тебе нужен массив на 9 чисел. По умолчанию в них будут значения 1, 2, 3, 4, 5, 6, 7, 8, 9.
2) Тебе нужна переменная, которая будет хранить длину массива.

Для генерации случайного числа выполняем следующее:
1) Генерируем случайный индекс от 0 до РазмерМассива - 1.
2) Смотрим элемент в массиве под данным индексом и запоминаем его в результат.
3) Копируем последний элемент массива в тот, что выпал случайно.
4) Уменьшаем размер массива на один.

Привожу пример.
Массив: 1 2 3 4 5 6 7 8 9
Размер массива: 9

Генерируем случайный индекс от 0 до (9 - 1) = 4.
Под индексом 4 у нас значение 5. 5 → первый результат. Копируем в этот элемент значение последнего (9) и уменьшаем длину массива на один.

Массив: 1 2 3 4 9 6 7 8
Размер массива: 8.

Как видишь, после указанной операции у нас массив чисел, в котором уже гарантированно нет ранее сгенерированного числа.
Повторяем процедуру. Случайный индекс от 0 до (8 - 1) = 2.

В результат помещаем ещё одно число (3), которое заменяем на 8 в массиве.

Массив: 1 2 8 4 9 6 7
Размер массива: 7.

Случайный индекс: 6. В результат помещаем 7, заменяем 7 на 7 и уменьшаем размер массива на один.

Массив: 1 2 8 4 9 6
Размер массива: 6.

На ЕРМ тебе понадобятся:

!#VA(uniqueNumbers[9]:y); Массив, в котором хранятся уникальные числа
!!VR(uniqueNumbers):C1/2/3/4/5/6/7/8/9; сразу же его заполни
!!VR(sampleSize:y):S9; начальный размер массива

Сгенерировать случайный индекс можно командой R0/мин/макс.
Если нужно сгенерировать число от 0 до 9 - 1, можно сгенерировать от 1 до 9, а затем вычесть 1.

!!VR(randomInd:y):R0/1/(sampleSize) -1; получили случайный индекс.
!!VR(randomItemPtr:y):S(@uniqueNumbers) +(randomInd); Random item pointer — указатель на случайный элемент в переводе
Вычисляется как индекс начала массива + смещение в массиве. Если у тебя массив y50..y58, то 50 — его начальный индекс.
@uniqueNumbers и компилируется в начальный индекс массива

само значение по указателю можно получить так: y(randomItemPtr)

Попробуй поэкспериментировать. Если не выйдет, приведу полный код.


RE: Школа ERM для ERA III - SergOz - 21.11.2020 04:41

Bes, спасибо, я понял. Thank_you По сути !!co является !!en если выполнено его условие.
А в этом скрипте меня интересует не просто замена y1/y2 на (one:y)/(two:y), а новые возможности (если они есть:z), о которых я ещё не знаю.

P.S. Спасибо, Berserker . Thank_you
Тот код, что я привёл - старый. Я и пытался его написать по-новому через массивы SN:M, примерно по тому же алгоритму, что Вы мне привели, но у мення что-то Эра ругалась на код. Попробую ещё раз.
Но, не сегодня Lazy3



RE: Школа ERM для ERA III - SergOz - 21.11.2020 18:14

(21.11.2020 04:32)Berserker Wrote:  !#VA(uniqueNumbers[9]:y); Массив, в котором хранятся уникальные числа
Здесь [9] - это номер массива или его размер?

P.S. С масссивами !!SN:M уже написал
сейчас потею над ERM2


RE: Школа ERM для ERA III - Berserker - 21.11.2020 18:18

Размер. Это локальный массив. Скажем, [y5, y6, y7, y8, y9, y10, y11, y12, y13]


RE: Школа ERM для ERA III - SergOz - 21.11.2020 18:52

Berserker, а как понять строчку !!VR(randomInd:y):R0/1/(sampleSize); с тремя значениями после R ?
0 - это ID опции R, 1 - нижнее значение, (sampleSize) - верхнее значение для генерации?
Такого нет в Хэлпе


RE: Школа ERM для ERA III - Berserker - 21.11.2020 19:02

Это альтернативный синтаксис для R/T команд. Первый параметр — пустышка. Второй и третий — минимальное и максимальное значение для генерации. Результат присваивается переменной, а не прибавляется к ней, как в случае с классическим R#.

Code:
Version 3.0.0 (06/2020)
------------------------
[+] Added new command !!VR:R0/#min/#max, generating random value in specified range and assigning its to variable.
    Example: !!VRy1:R0/100/300; set y1 to random value in 100..300 range



RE: Школа ERM для ERA III - Bes - 21.11.2020 19:09

SergOz, я тебе уже и так и сяк говорил, ты ни в какую.
посмотри историю изменений ERA3, там полно новых примочек


RE: Школа ERM для ERA III - Berserker - 21.11.2020 19:30

Bes, ничего, подскажем по ходу дела что смотреть. На всё времени может не хватать.


RE: Школа ERM для ERA III - SergOz - 21.11.2020 19:59

Bes, та я помню, но там на английском - т.е. - пока переведу переводчиком, потом пока на нормальный - времени уходит куча и мысль "нахрена мне это надо было" теряется. Увы, года... 166
Я ж не наезжал по поводу Хэлпа - просто констатировал факт. Я же понимаю, что и у тебя на всё времени может не хватать


RE: Школа ERM для ERA III - Bes - 21.11.2020 20:59

SergOz, я не буду ЕРМ2.0 делать. Мне на работе обрубили ПК для свободного времени, очень в редких случаях теперь могу сесть. А дома с таким шибко не посидишь.
Так что изредка шлифую то, что уже есть, и крайне редко добавляю новый материал.
Увы.
Сам довольствуюсь когда надо историей ERA3 и всё.


RE: Школа ERM для ERA III - SergOz - 21.11.2020 21:19

(21.11.2020 20:59)Bes Wrote:  SergOz, Мне на работе обрубили ПК
У-у... 14 (нехорошие люди)


RE: Школа ERM для ERA III - Berserker - 21.11.2020 22:03

SergOz, автоперевод:
https://mods.hmm35.ru/Era%20III%20changelog%20rus.txt


RE: Школа ERM для ERA III - SergOz - 21.11.2020 22:34

Berserker, спасибо - это вполне читаемо. 97


RE: Школа ERM для ERA III - Berserker - 21.11.2020 22:40

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


RE: Школа ERM для ERA III - SergOz - 22.11.2020 01:12

Berserker, по аналогии со скриптом пытался написать то же самое на ERM2, но забуксовал.
Вообще-то это типа 4-х значный кодовый замок на объекте, который генерируется заново, при посещении этого объекта.
Вроде бы всё просмотрел - инфу не нашёл


RE: Школа ERM для ERA III - Berserker - 22.11.2020 01:33

Сейчас посмотрю.


RE: Школа ERM для ERA III - Berserker - 22.11.2020 01:42




RE: Школа ERM для ERA III - SergOz - 22.11.2020 01:54

Berserker, огромное спасибо. Буду разбираться.


RE: Школа ERM для ERA III - Berserker - 22.11.2020 02:09

Тут главное понять, то переменные с суффиком Ptr (Pointer) хранят индекс y-переменной элемента массива.

Пусть у тебя массив:
!#VA(array[3]:y); компилятор выделил y22, y23, y24 под три элемента массива.

@array = @array[0] - индекс y-переменной первого элемента массива = 22
@array[1] - индекс y-переменной второго элемента массива = 23
@array[2] - индекс y-переменной третьего элемента массива = 24

!!VR(itemPtr:y):S(@array[1]); пусть новая переменная хранит индекс y-переменной второго элемента массива, то есть будет «указателем» на него.
Скажем, компилятор выделил itemPtr = y25
Тогда код будет скомпилирован в:
!!VRy25:S23;

Тогда следующий код выполнит одно и то же:

!!VRy(itemPtr):S100; !!VRyy25:S100;
!!VR(array[1]):S100; !!VRy23:S100;


RE: Школа ERM для ERA III - SergOz - 22.11.2020 02:16

Quote:Тут главное понять, то переменные с суффиком Ptr (Pointer) хранят индекс y-переменной элемента массива.
Berserker, да это я понял ещё по скрипту с палатками, а вот дальше...
Учиться тяжжело, а переучиваться - ещё труднее
Новый афоризм. На тех же условиях



RE: Школа ERM для ERA III - Berserker - 22.11.2020 03:06

SergOz, можешь нажать F11 и посмотреть код в Debug\Era\Scripts. Сравнить для себя, чтобы понимать разницу.


RE: Школа ERM для ERA III - SergOz - 05.12.2020 03:24

Berserker, есть ли разница в написании:
и
и если есть, то как лучше?


RE: Школа ERM для ERA III - Bes - 05.12.2020 03:31

отвечу за него, но в режиме "тебя не спрашивали"
Первый вариант удобнее, когда есть ф-ция, с параметрами, и их сразу есть смысл описать за ранее, чтобы потом не думать как назвать вновь используемый x@
А так, как по мне, если код пишется постепенно и он мал (умещается в окне без длительного скроллинга), нет смысла тратить время на VA-шки. В других же случаях будет уместно и удобнее видеть сразу весь перечень имён локалок, что даст быстрое понимание какие переменные нужны для интеграции в этот кусок кода чего-то другого и т.п.



RE: Школа ERM для ERA III - SergOz - 05.12.2020 03:43

Bes, да, про наглядность (удобство) переченя всех переменных в !#VA, в начале скрипта я сам думал и "лишние" движения вполне оправданы. Но, меня интересовала чисто техническая сторона, хотя думаю разницы нет, но хочу утвердиться в своей мысли.


RE: Школа ERM для ERA III - Bes - 05.12.2020 04:01

технически точно нет разницы, даже не знаю что ты хотел в таком ключе услышать?


RE: Школа ERM для ERA III - SergOz - 05.12.2020 05:08

(05.07.2020 19:50)Berserker Wrote:  
Code:
; (-someStr) удалит переменную someStr.
Речь шла об z-переменных.
И как правильно именовать z-1...z-10;


RE: Школа ERM для ERA III - Berserker - 05.12.2020 05:09

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

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

Quote:!$OB30/5/0;
; вот здесь мне нужно удалить переменную (goldRed). Как это сделать?
!!IF:M^%(goldRed)^;
Там её уже нет. Привязка имён переменных к локальным y1..y100 и z-1..z-10 простирается от начала !?/!$ до следующего !?/!$.


RE: Школа ERM для ERA III - Berserker - 05.12.2020 05:15

Когда ты объявляешь локальную z-переменную, она уже привязывается к одной из z-1..z-10.


RE: Школа ERM для ERA III - SergOz - 05.12.2020 05:17

Хорошо, а внутри одного триггера?
я про удаление локальной z переменной


RE: Школа ERM для ERA III - Berserker - 05.12.2020 05:27

А зачем тебе удаление/освобождение? Не хватает 10 строк если только.
Пожалуйста.



RE: Школа ERM для ERA III - SergOz - 05.12.2020 05:31

Спасибо, Berserker, я всё-всё-всё понял Thank_you


RE: Школа ERM для ERA III - Bes - 06.12.2020 01:28

Berserker, чёт любопытно стало.
Как всегда, без тестов уповаю на твою осведомлённость работы ЕРМ2

А написание строки с инструкцией не прерывает тело триггера, локальные переменные таким образом не сбросятся?



RE: Школа ERM для ERA III - Berserker - 06.12.2020 06:33

Нет, инструкции выполняются на этапе трансляции ЕРМ в промежуточное представление. Как парсер по тексту проходит, так и выполняет. А !! команды добавляются в последний тригер. Потому, хоть это и коряво, инструкции могут быть где угодно.


RE: ERA III - daemon_n - 09.01.2021 15:51

А что за новая SN:B команда?


RE: ERA III - Berserker - 09.01.2021 16:15

feanor, понял, спасибо.
daemon_n, меня когда спрашивают, я первым делом переключаюсь на era iii changelog.txt и вбиваю в поиск SN:B Ab

Code:
[+] Added new ERM command SN:B to work with binary buffers on a low level. It allows to:
    - get address of local or static global ERM variable;
    - read/write integer/string from/to specific address.

    !!SN:B(intAddress) or ?(intVar) or (strVar) or ?(strVar)[/?(addressValue) or (dummy)/$valueAtAddress]

    The first argument determines variable address to work with. For strings it's always first string character address, regardless GET/SET syntax.
    For floats/ints SET syntax mean value of variable as address. GET syntax means address of specified variable.

    !!VR(test:y):S8943200;
    !!SN:B(test);  means use 8943200 as address
    !!SN:B?(test); means use address of (test) y-variable.

    !!VR(text:z):S^hello world^;
    !!SN:B(text);  means use address of (text) first character
    !!SN:B?(text); means use address of (text) first character too.

    Example:
    Let us declare integer y-variable and determine its address to use with external API function.
    !!VR(fileHandle:y):S(INVALID_HANDLE_VALUE);
    !!SN:B?(fileHandle)/?(fileHandleAddr:y); (fileHandlerAddr) is now address of (fileHandle) variable.

    Let us read last savegame name from H3 static buffer
    !!SN:B(ADDR_MARKED_SAVEGAME_NAME)/d/?(lastSavegameName:z);
    !!IF:M^You last savegame name was %(lastSavegameName)^;

Это удобная замена SN:X хакам для работы с адресами ЕРМ переменных, строками по произвольным адресам и частично аналог UN:C для int32-чисел.


RE: Плагины. Обсуждение - daemon_n - 10.01.2021 22:32

(10.01.2021 21:37)Berserker Wrote:  

Berserker, спасибо.

Так понимаю, здесь ты сделал вид, что не знаешь номера навыков вообще, потому сообразил безопасный "псевдодинамический обратный массив" 148?



RE: Плагины. Обсуждение - Berserker - 10.01.2021 23:52

daemon_n, нет. Если тебе нужно сгенерировать число, скажем, от 0 до 99, но исключить 50 и 70, то есть алгоритм лучше вечного перебора:

1) Сгененерируй число от МИН до МАКС - 2, где 2 — число дыр или запрещённых чисел.
2) Если выпало 50, то результат будет МАКС - 1. Если выпало 70, то результат будет МАКС.
То есть ты создаёшь ссылки с отсутствующих элементов на реальные, а сами реальные из начальной генерации исключаешь.

Я запоминаю максимальный индекс для генерации как МАКС - 2. Затем навигацию отсылаю на этот индекс + 1 = МАКС - 1, а некромантию на индекс + 2 = МАКС.

Или играешь ты в броски кубика 1-6. Нужно получить число 1-7, исключая 5. Тогда если выпадет 5, ты зачтёшь это за 7.


RE: Плагины. Обсуждение - daemon_n - 10.01.2021 23:58

Berserker, о как. Когда объяснил, я сразу понял)
   Спасибо)Ab


RE: Школа ERM для ERA III - igrik - 22.01.2021 01:18

Berserker, замечания по оформлению кода есть?

Рынок времени (Click to View)



RE: Школа ERM для ERA III - Berserker - 22.01.2021 14:49

Есть пожелания:

Quote:!#VA(x:x) (y:x) (z:x) (objtype:x) (objsubtype:x) (yellowSquare:x) (passability:x);
Аргументы функции лучше размещать первыми командами сразу под !?FU(XX) или комментарием описания функции.
Если аргументы не x/y/z и более трёх, то лучше каждый с отдельной строки. Так можно дать описание наиболее сложным хотя бы.

objtype => objType, objsubtype => objSubtype (два слова в camelCase, subtype исключение, так как sub — приставка).

Если переменная логического типа «является проходимым», то за исключением некоторым случаев выразительнее именование
isYellowSquare (это жёлтая клетка?). Иногда глаголом в прошлом времени: checksPassed = TRUE (проверки пройдены).

WOG_OnPassThroughAllObjects — возможно, имелось в виду OnIterateAllMapObjects. «Пройтись по чём-то» чаще всего именуют IterateSomething.
Quote:!!VR(random:y):S0 T9;
Более ёмкая команда сразу устанавливающая значение переменной в случайное в заданном произвольном диапазоне:
Quote:!!SN:T^wog_109.objName^/?(objName:z);
Альтернатива для простых переводов по фиксированному ключу:
Quote:!!IF:M1/(title);
Оптимальный вызов:
Quote:!!HE(ANY_HERO)
Бывает, что -1 в контексте любой, но в данном нужен текущий.
Quote:(movePoints)<500
500 в константу !#DC(OPT_MARKET_OF_TIME_MIN_MOVEPOINTS) = 500
Это, вероятнее всего, именно скриптовое требование на наличие определённого числа очков хода.

Ниже под (iterator) имеется в виду secSkillPicInd, то есть индекс картинки вторичного навыка в массива.
или (numMatchedSecSkills) — счётчик подходящих вторичных навыков, который используется и для индексирования.
Просто iterator — слишком общее имя, чаще всего имеющее некомую объектную структуру.
Quote:!!if&(iterator)<(TRUE):;
; result - id вторичного навыка или -1
Quote:!#VA(arrayPicType:x) (arrayPicSubType:x) (firstItem:x) (result:x);
; init vars
!#VA(picType[8]:y) (picSubType[8]:y) (pType:y) (pSType:y) (currentItem:y);
; get pictures: type and subtype
Добавлю !#DC(NO_SKILLL) = -1;
Quote:!!en:;
; configure message
После окончания блока и комментария для дальнейших команд пустая строка.

Quote:!!SN:T^wog_109.choice^/?(choice:z);
!!IF:N(MSG_TYPE_CHOOSE_PIC_OR_CANCEL)/^%(choice)^/?(result);
Quote:!!if&(gold)<5000:;
Quote:!!IF:M1/(noMoney);
Quote:!!UN:R(REDRAW_ADV_MAP);



RE: Школа ERM для ERA III - Berserker - 22.01.2021 22:06

Code:
[+] ERM syntax can be safely beautified for all Era 3.X versions by skipping trailing ":" before ";".
  !!re 0/7/1;
    ...
  !!en;

  !!if&(heroId)=(HERO_XERON);
    ...
  !!en;



RE: Школа ERM для ERA III - igrik - 23.01.2021 01:41

Berserker, спасибо. Сделано.



RE: Школа ERM для ERA III - Berserker - 23.01.2021 03:58

Отлично! 132

Попробуй ещё выделить
Quote:!#DC(WOG_OPT_MARKET_OF_TIME) = 109;
!#DC(OBJ_OPT_MARKET_OF_TIME) = 51;
!#DC(OPT_MARKET_OF_TIME_MIN_MOVEPOINTS) = 500;
!#DC(OPT_MARKET_OF_TIME_PRICE_GOLD) = 5000;
И нажать CTRL + ALT + A. Сработает установленный плагин на выравнивание по =.

Quote:; increse numMatchedSecSkills
increase

Quote:; third message display
!!FU(WOG_109_Msg_Show8SSkills):P(arrayPicType)/(arraySSkillPic)/16/?(forgetSkillId);
!!if&(forgetSkillId)<>-1:;

Quote:; calculating id of the selected skill
!!VR(picture:y):S(@picSubType) +(result);
; return skill id
!!VR(result):Sy(picture) -3 :3;
Комментарий идёт для одной или нескольких команд, образующих смысловой блок. Блоки лучше отделять друг от друга пустыми строками.
Хороший код должен быть самодокументирующим. Комментировать каждую элементарную операцию не нужно. В данном случае блок простой. Достаточно хороших имён переменных.



RE: Школа ERM для ERA III - Archer30 - 27.01.2021 17:13

Berserker, any comment to my code?
I made some alteration to igrik's henchman script by some players' requests. All the modification I made was in ERM 2 96-copy
The idea is to add in stack exp/warlord's Banner to the henchman, also allows to adjust how fast exp gains based on playstyle. All these freatures can be configured in json.
Henchman Mod beta 0.9

I would also like to report a bug here. I notice this bug when I made the feature "returning banner from henchman". Please search for "Berserker" in my script.
The bug: It looks like UN:R3 changes the value of i^henchman_banner_%(hero)^ secretly.
How it should behave: Right click on the colour flag from hero screen and give your Warlord's Banner to henchman, return it to the hero after. Right-click again on the flag, and you would be asked whether to give the banner again to the henchman.
How it mess up: Enables the three lines marked with "Berserker" in my code, repeat the process above. After giving back the banner to the hero, when you click on the colour flag again, you would still be able to acess to the Warlord's banner configuration dialogue, which allows you to duplicate banners.



RE: Школа ERM для ERA III - Berserker - 27.01.2021 20:20

Hi. I will try to look into it. By the way, you json file is invalid. New lines are forbidden. Use "\n" escape sequence inside a string to insert new line.
Image: image.png


RE: Школа ERM для ERA III - Archer30 - 27.01.2021 22:54

Berserker, nice chats on Discord. Much appreaciate for your help! A valuable lesson of good practice. 132

PS: I learned about "Enter for a new line" from ACM Spiteful


RE: Школа ERM для ERA III - Berserker - 28.01.2021 19:17

Archer30, thanks for constructive discussion.


RE: Школа ERM для ERA III - SergOz - 20.02.2021 17:50

Поддерживается ли сейчас анимация картинок в сообщениях?
Если нет, то будет ли поддерживаться в дальнейшем?


RE: Школа ERM для ERA III - Berserker - 20.02.2021 17:56

Нет. Нет.


RE: Школа ERM 2 - Archer30 - 10.03.2021 10:26

Hi! I have a question about arrays in ERM 2.
Is it possible to make a variable in a variable with array?

Looks like %(firstLevelMon[%(value)]) is wrong 102


RE: Школа ERM 2 - Berserker - 10.03.2021 14:00

Archer30, nope, ERM is too low level. We have to define pointer to array item and access it indirectly.

In Lua it would be firstLevelMons[value], but in ERM 2:



RE: Школа ERM 2 - Archer30 - 10.03.2021 14:40

Hmmm, in this particular case, the name variable is worse than v-variable. I can simplify the code by:




RE: Школа ERM 2 - Berserker - 10.03.2021 17:06

It's awful code. Do not use global variables for almost the same purpose but with invalid logics. You th code I gave above, press F11 and see, what it's compiled too.
Even better try this code for testing:

You'll see something like



RE: Школа ERM 2 - Archer30 - 10.03.2021 17:50

Berserker, I understand you are not a fan of mixing variable type. I myself never want to mess up with that, but it's sometimes necessary to use v. Check this:


The command uses v index. What should I do to get rid of v-variable in this case? 102


RE: Школа ERM 2 - Berserker - 10.03.2021 19:15

Array access code via pointers does not need v-vars at all. The code above can be converted to safe:



RE: Школа ERM 2 - Archer30 - 10.03.2021 20:06

Hmmm, maybe I was wrong about coding. I thought your code would require much more calculation (as you loop through all heroes) and may extend the time of passing the day a little bit.


RE: Школа ERM 2 - Berserker - 10.03.2021 21:12

Try it, it won't. 255 iterations, 2 commands and one condition evaluation. ERM speed is about 400 000 lightweight receivers/sec.


RE: Школа ERM 2 - Berserker - 11.03.2021 18:03

In response to igrik and Archer30 array indexing request, ERA Team presents v3.3.7:



RE: Школа ERM 2 - daemon_n - 11.03.2021 20:39

Berserker, что за -1? прочитал в теме обновления.
Божечки, скоро ERM превратится в c++96-copy

P.S: вместо гномов кентаврыYes


RE: Школа ERM 2 - Berserker - 11.03.2021 21:47

daemon_n, 5-й параметр был введён сто лет назад. Конечное значение счётчика всегда ограниченно суммой пятого и третьего параметра.
Большинство цикло идут от 0 до КОЛВО_ЧЕГО-ТО - 1. Иногда нужно пропустить последний элемент вообще. Тогда будет -2.


RE: Школа ERM 2 - igrik - 11.03.2021 21:52

(11.03.2021 18:03)Berserker Wrote:  
119 Аллилуйя!


RE: Школа ERM 2 - Bes - 11.03.2021 22:33

igrik, ты теперь часть ERA Team, как я понимаю, а потому все твои взывания к неким нужностям будут так или иначе воплощаться в ERA3 Spiteful Пора засчехлять мешок с отложенными хотелками Spiteful


RE: Школа ERM 2 - igrik - 11.03.2021 23:31

Bes, не поверишь, но хотелок у меня больше нет.
Раньше были 3: расширенное UN:C, получение структуры героя и стека. Теперь они есть.

В ERM2 сложно работать с массивами в циклах. Решение тут крайне необходимо. Надеюсь оно в скором времени появится в реальности.
Итого - мой мешок с хотелками пуст ))

Вот WoG Scripts 2 допилю (через год, два) и вообще на пенсию уйду.


RE: Школа ERM 2 - Berserker - 12.03.2021 01:14

igrik Wrote:Надеюсь оно в скором времени появится в реальности.
Так уже же: https://mods.hmm35.ru/Era%20Update.exe


RE: Школа ERM 2 - Berserker - 28.03.2021 17:47

(28.03.2021 16:40)daemon_n Wrote:  Bes, Raistlin, ребята, спасибо, получилось (как ни странно) 96-copy
Нет, товарищи, так дело не пойдёт. Оставьте Вы этот ужас . Вариант Беса — неопределённое поведение и игра с памятью, которая давно могла быть освобождена. Остальные варианты тоже ужасны. А глянуть, как куча функций в Era Erm Framework принимают строки?

Для очень старых скриптов всегда можно было передать индекс глобальной или ERT z-переменной в функцию.
В Эре 3 строки можно передавать напрямую.

А что делать, если Вы хотите объединить две строки произвольного размера? Локальные строки по 511 байт могут обрезать текст.
Тогда можно создать глобальную временную z-переменную с огромным индексом, которая будет доступна только для чтения и будет уничтожена по выходу из триггера.
Но что делать, если мы хотим вернуть строку из функции? Например, функция будет принимать имя героя и возвращать строку «Dear, [Name], your time is over».
По выходу из функции везде, где применялся синтаксис возврата строки вида P.../?z(...)/.../?s^...^ функция трактует конечные значения x-параметров как индексы z-строк. Сами строки копируются во временное хранилище, а оттуда уже присваиваются указанным при вызове переменным.


RE: Школа ERM 2 - Bes - 28.03.2021 18:51

мне вот совсем не понравилось, что моё имя было взято в примерах Beee



RE: Школа ERM 2 - Berserker - 28.03.2021 19:31

Bes, это месть Spiteful А так это Big Erm Script мод.



RE: Школа ERM 2 - Bes - 28.03.2021 19:47

bad erm scriptmod Ab



RE: Ваши вопросы по ERM-скриптам - daemon_n - 28.03.2021 19:59

А что есть нового по глобальным массивам?
Мне надо сделать массив на десяток текстовых элементов - всё ещё через !!SN:M?


RE: Ваши вопросы по ERM-скриптам - Berserker - 28.03.2021 20:46

daemon_n, да.



RE: Ваши вопросы по ERM-скриптам - daemon_n - 28.03.2021 21:01

Berserker, я, честно сказать, не понимаю, а где вывод текста?


RE: Ваши вопросы по ERM-скриптам - Berserker - 28.03.2021 21:03




RE: Ваши вопросы по ERM-скриптам - daemon_n - 28.03.2021 21:22

Berserker, спасибо - это понял.

А выставить добавление в след пустой слот можно через команду какую-нибудь или надо проверять каждый раз, свободен ли он? (разные триггеры)

UPD: Почему не работает заполнение через re i или иную другую переменную?

Мне надо заполнить определённый элемент массива, номер которого я не могу задать точно.


RE: Ваши вопросы по ERM-скриптам - Berserker - 28.03.2021 21:54




RE: Ваши вопросы по ERM-скриптам - daemon_n - 29.03.2021 01:01

Спасибо! Странно, что сразу не сработало 105

А есть ли возможность сравнить 2 текстовых переменных?

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


RE: Ваши вопросы по ERM-скриптам - Berserker - 29.03.2021 02:03

Сохрани их в s^temp^ и s^temp2^, сравни s^temp^=s^temp2^, а в конце обнули обе через s^temp^:S^^.


RE: Ваши вопросы по ERM-скриптам - daemon_n - 29.03.2021 07:49

Berserker, эти переменные какие-то особенные? Просто я делал так же со своими именованными.
Хотя я вчера кодил сутки напролет. Естественно мог ошибиться


RE: Ваши вопросы по ERM-скриптам - Berserker - 29.03.2021 15:58

daemon_n, обычные глобальные именованные переменные SN:W.
s^...^ - строковые. Можно использовать почти везде, где используются z-переменные, кроме установок подсказок и описаний старыми ЕРМ командами.


RE: Ваши вопросы по ERM-скриптам - daemon_n - 31.03.2021 13:31

(28.03.2021 20:46)Berserker Wrote:  daemon_n, да.

А как удалить массив, не зная его ID?

Надо ли вообще их удалять?

И полезно ли постоянно изменять его размеры?


У меня функция использует, можно сказать, 3 динамических массива.
Изначально объявил кол-во элементов = 0.
Перед добавлением элемента я увеличиваю размер на +1
как только массив перестаёт быть нужен, ставлю кол-во элементов = 0.

Как именно правильно поступать в таких ситуациях с точки зрения здорового кода?

Массивы выбрал, потому что работа с текстами.


RE: Ваши вопросы по ERM-скриптам - Berserker - 31.03.2021 16:06

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


Quote:Надо ли вообще их удалять?
Временные для триггера — надо. Если нужно передать временный вызывающему коду, а после выполнения кода удадить, то можно продлить время жизни массива через:
!!SN:F^ExtendArrayLifetime^/[ИД];

Если массив имеет тип хранения M_TEMP, то при загрузке он сохраняет свой размер, но теряет данные. Экономится место в сохранёнках.
Если тип хранения M_STORED, то это глобальный массив, который сам никогда не удаляется.

Для удаления глобального массива вызови !!SN:M[ID];
Менять размер массива часто — можно. Он оптимизирован и под капотом выделяем память кратно степени двойки.

Выбрал ты всё верно. Только определись, где ты создаёшь массив и как долго его используешь.


RE: Ваши вопросы по ERM-скриптам - daemon_n - 31.03.2021 17:30

Berserker, у меня диалог, который подгружает данные при открытия этого диалога.

Изменяю массивы на лету. В зависимости от входящих данных, количество которых зависит уже не от меня96-copy
Массив мне точно нужен временный, если точнее, 3 временных массива. Создавать их надо, видимо, всего один раз: в инструкции.

Quote:Для удаления глобального массива вызови !!SN:M[ID];
Так как мне получить ID массива, если ему присваивается номер автоматически?

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


RE: Ваши вопросы по ERM-скриптам - Berserker - 31.03.2021 18:44

?i^dae_texts^ — и есть параметр, куда сохраняется ID массива. Если массив локальный для триггера — то можно в локальную именованную переменную:
?(someList:y)

В общем в функции показа диалога делай так:




RE: Ваши вопросы по ERM-скриптам - daemon_n - 31.03.2021 19:17

Berserker, локальные массивы не подойдут точно.

Странно вот что - у меня массивы не обнулялись через



каждый раз создавался массив с ID ниже:
вот три массива возвращали при создании и удалении с теми же именами.
-1, -2, -3
-4, -5, -6
и тд - каждый раз

Так какая именно команда для получения id?
Всё перепробовал


RE: Ваши вопросы по ERM-скриптам - Berserker - 31.03.2021 23:41

Если массивы нужны только для инициализации, показа диалога и затем очистки, то тебе подходят локальные для триггера.
ID ты получаешь ?i^dae_texts^ здесь.


RE: Ваши вопросы по ERM-скриптам - daemon_n - 01.04.2021 00:42

Berserker, я же сказал, что не подойдут, так как там хранятся имена строк, которые будут использованы в другом триггере.В целых 3 триггерах:
Имя функции на лкм, текст хинта при наведении, текст на пкм.

Кажется, понял ID. Спасибо
Попробую.


RE: Ваши вопросы по ERM-скриптам - Berserker - 01.04.2021 02:26

Смотри:

Триггер 1:
...
создаём временный массив
....
вызов диалога; 100500 вложенных событий
....
Конец Триггера 1. Только здесь автоудалится временный массив


RE: Ваши вопросы по ERM-скриптам - daemon_n - 01.07.2021 13:36

Есть ли разница, что использовать "SN:M" или "SN:V", и возможно ли создание (и как?) двумерных массивов?


RE: Ваши вопросы по ERM-скриптам - Berserker - 01.07.2021 18:37

1. Разница есть лишь в случае, если затрагивается несколько значений подряд.

2. Двумерный массив — только как массив массивов. Первый массив хранит ID массивов второго измерения.
Например, массив на 48 городов, каждый из которых массив на 7 слотов. Инициализация такого массива потребует цикла.


RE: Ваши вопросы по ERM-скриптам - daemon_n - 01.07.2021 18:51

Berserker, отлично) попробую с этим что-нибудь придумать)

А ещё мне нужно убрать определённые элемент из массива, удалив его из середины и уменьшить размер массива

Знаю номер элемента и размер - подойдёт ли Array_PoP?

UPD: осознал, что нет.
Получается, надо перезаписывать в иной массив на 1 итем меньше?
А потом клонировать всё обратно - верно?


Суть - делаю исследования заклинаний;
Сейчас на этапе, где надо удалить из массива доступных заклинаний то, что "изучил". И ещё то, от которого отказался.

UPD:UPD: сместил значения и поменял ненужный элемент с последним. После удалил через Array_PoP

А есть альтернатива?


RE: Ваши вопросы по ERM-скриптам - Berserker - 01.07.2021 20:16

daemon_n, классически есть два варианта удаления элемента массива из середины:

1) Как ты сделал. Последний элемент помещаем на место удалённого и уменьшаем размер массива. При этом страдает порядок.
2) Сместить в цикле все элементы после удалённого на 1 влево, а после уменьшить размер массива на 1.

Первый вариант работает быстро. O(1) сложность. Второй обладает линейной сложностью O(N), то есть чем больше массив, тем больше операций.


RE: Ваши вопросы по ERM-скриптам - SergOz - 01.07.2021 21:02

(01.07.2021 18:37)Berserker Wrote:  Двумерный массив — только как массив массивов. Первый массив хранит ID массивов второго измерения
Girl_werewolf А-а-а-а-а!!!
Почему я раньше не додумался до этого?
Мне так нужна была такая таблица... Теперь смогу реализовать задуманное.
Только чуть позже: работы невпроворот, да ещё этот Laie_20 отвлекает


RE: Ваши вопросы по ERM-скриптам - Berserker - 02.07.2021 01:36

SergOz, альтернативу вспомнил. Если нужен массив N * M, выделяется один большой массив N * M, а индекс конкретной ячейки [i, j] вычисляется как i * M + j


RE: Ваши вопросы по ERM-скриптам - SergOz - 02.07.2021 03:36

Berserker, спасибо.
Как по мне, то альтернативный вариант сложнее и в "понимании", и в дальнейшей работе с ним Scratch_one-s_head
Кстати, я тогда всё крутил в голове вариант с использованием !!PO:V#/$; позволяющим сохранять до 4-х значений (мне нужна таблица 4х120), но так и не "врубился" как это оформить в виде рабочего скрипта. И, кстати, я тогда про динамические массивы и не знал...


RE: Ваши вопросы по ERM-скриптам - daemon_n - 02.07.2021 10:29

SergOz, срочно изучай ERA changelog iii.txt и, самое главное, HoMM 3 ERA\Mods\Era Erm Framework\Data\s 9999 era - stdlib.erm

Поиском всё, что имеет в себе "Array" - затем возвращайся сюда благодарить Berserker'a за (ещё один) огромный ПОДАРОК, сделанный всем модерам Yes


RE: Ваши вопросы по ERM-скриптам - SergOz - 02.07.2021 13:06

daemon_n, будет сделано! 135
Я видел "Array" в changelog сразу как оно появилось и, бегло прочитав, понял что крутая штука, но всё не доберусь разобраться досконально. Видать ещё петух в жо не прижало сильно. Да и время...
Кстати, никто не знает: при помощи ERM можно растянуть время? Tease



RE: Школа ERM 2 - Berserker - 22.07.2021 23:26

Отряды совершают по два действия в ход.
Требования: Эра 3.8.5.
Не учитывается только мораль. Учитываются типы действий и тактическая фаза.




RE: Ваши вопросы по ERM-скриптам - Archer30 - 15.10.2021 14:01

A question of naming global vars (i^^ and s^^).

I notice that using the same name for global integer and string vars works in ERA, for example,
i^trainer_hero^ = 153
s^trainer_hero^ = Mutare Drake

Both work correctly in the game.
The question is, is this a good practice?


RE: Ваши вопросы по ERM-скриптам - daemon_n - 15.10.2021 14:26

Archer30, assotiave wars - same as SN:W^trainer_hero^ (keeps int and string);


RE: Школа ERM 2 - Berserker - 15.10.2021 18:55

Archer30, good question. Normally it's not good practice, because name of variable should reflect its contents and possibly type.

trainer_hero_id is better then trainer_hero, but without id the "id" is assumed.
trainer_hero_name is better then trainer_hero.


RE: Школа ERM 2 - Archer30 - 15.10.2021 19:29

Berserker, thanks for the good answer!


RE: Ваши вопросы по ERM-скриптам - Archer30 - 04.12.2021 22:14

Hi! I'd like to have some feedback about preference in erm writing.

So daemon_n and I wrote different codes for the same feature - look for a hero with no owner/not in tavern and not on the map.

Here's daemon_n's:

And here's Archer30's:

My question is, which is prefered, in terms of efficiency and readableness, or any other criteria?
The main difference is the use of co vs if/en. I believe if/en is better in readableness. But is this true?
Any thought on the code is welcome, thanks! Ab


RE: Ваши вопросы по ERM-скриптам - Berserker - 05.12.2021 04:03

Nice prograss in coding, guys. I'm really happy, that we have two more talanted programmers 132

The first rule in programming is "Premature optimization is evil".
The second one: "Optimize only after profiling".

Profiling is calling !!FU(GetTimeMsec), then repeating some function many times, then calling GetTimeMsec once again and display the difference.

In really important code places evaluating billions of times and in LuaJit/C++ language goto/continue could increase performance a bit, but the second version has better maintainability.
Maintainability is really important.

Generic rules are:

-) Prefer IF block over goto/continue/break if possible, unless it's "FAST EXIT" pattern like:

IF something THEN RETURN
IF something THEN RETURN
...
ok, main logics

...or unless it's really simple iteration with simple exit condition.

-) Loops without breaks can be extended without effort.
!!br&(hero)=(tavernHero); is simulation of WHILE (complex condition) DO, which is ok.

It's generic linear search pattern:

while (position is before end AND current item does not match) do
    increase position
end

if (position is < end) then
    something was found
else
    nothing was found
end

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

In daemon_n's variant I would replace

    !!co|(x)>=0/(y)>=0/(z)>=0;
    !!br;

with

IF x < 0 OR x < 0 OR z < 0 THEN
    BREAK
END

Too many breaks/gotos/continue complicate the logics and increase mental efforts to undestand code flow.
It's also nice to separate commented lines with empty lines.

Code:
!!VR(heroAvailable:y):S(TRUE);
; Check if Hourglass of Asmodeus is enabled to decide whether include Xeron to the list
!!UN:P106/?(asmodeusOn:y)

=>
Code:
!!VR(heroAvailable:y):S(TRUE);

; Check if Hourglass of Asmodeus is enabled to decide whether include Xeron to the list
!!UN:P106/?(asmodeusOn:y)



RE: Школа ERM 2 - daemon_n - 05.12.2021 09:11

Berserker, спасибо за ревью)

P.S.: то есть сперва ты добавляешь re i/co/br, чтобы всё было как у людей, а теперь говоришь, что это плохо?96-copy
Признаться, я слегка в замешательстве102


RE: Школа ERM 2 - wessonsm - 05.12.2021 11:21

daemon_n, циклы должны заканчиваться естественныы образом, а не через co/br.
Как ни крути, это костыль, а Берс не любит костылей.

А добавлено для некоторых исключительных случаев.


RE: Школа ERM 2 - daemon_n - 05.12.2021 11:30

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


RE: Школа ERM 2 - Berserker - 05.12.2021 12:52

daemon_n, ЕРМ не позволяет писать сложные условия в циклах. В других ЯП их писать можно, либо даже выделить условие в функцию.
Если условие не написать, то WHILE (...) DO эмулируется через

!!re ...

получить данные
!!br&...

!!co по возможности лучше заменить на

!!IF обратное условие THEN
    ...
END

Просто логика чище. И всегда можно добавить ELSE и дописать что-то после IF/ELSE, что на любом шаге цикла должно быть выполнено.
С Луа скриптами уже работаю, но сроки пока размыты.


RE: Школа ERM 2 - daemon_n - 05.12.2021 12:54

Berserker, в общем, вместо !!co ты предлагаешь охапку !!if/en, вложенных друг в друга?
Я без претензий - уточняю толькоYes


RE: Школа ERM 2 - SergOz - 05.12.2021 13:19

(05.12.2021 11:21)wessonsm Wrote:  циклы должны заканчиваться естественным образом, а не через co/br.
Как ни крути, это костыль, а Берс не любит костылей.
А добавлено для некоторых исключительных случаев.
(05.12.2021 12:54)daemon_n Wrote:  Berserker, в общем, вместо !!co ты предлагаешь охапку !!if/en, вложенных друг в друга?
Меня очень смутило определение !!co как костыль 113
Оправданным ли будет применение !!co в циклах !!re с большим количеством шагов и множеством последующих !!if ... !!en ?
Например, цикл по всем героям, с множеством проверок и, как следствие, множеством !!if& ... !!en, где сразу после !!re идёт проверка на присутствие героя на карте и последующем !!co, если его нет.

P.S. Всегда считал что !!co ускоряет действие циклов


RE: Школа ERM 2 - Berserker - 05.12.2021 19:45

daemon_n, как правило, да. Но есть два способа не давать коду вложенных проверок и циклов расти вглубь:

1) Вариант, который я использую, хотя кое-где в литературе и критикуется. Переменная-флаг вида result, isOk.

result = вычисляем условие

if result then
   ...
    result = вычисляем новое условие для продолжения
end

if result then
   ...
   result = вычисляем новое условие для продолжения
end

Так код сохраняет линейный вид.

Альтернатива — приём быстрого выхода/отсечения. Тут обычный break/continue

!!co&условие

!!co&условие

основная работа

Прыжки во внешние циклы можно аккуратно использовать, но это уже оптимизация. Читать тяжелее, дописывать код сложнее.

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

Quote:P.S. Всегда считал что !!co ускоряет действие циклов
Это микрооптимизация.


RE: Школа ERM 2 - daemon_n - 05.12.2021 19:49

(05.12.2021 19:45)Berserker Wrote:  
Quote:P.S. Всегда считал что !!co ускоряет действие циклов
Это микрооптимизация.

Там микро, сям микро - и вот уже макро96



RE: Школа ERM 2 - Berserker - 05.12.2021 19:57

Лучше всего линейная логика. Реально, читаемее, меньше багов, легче расширить блоком else, дописать код после. Прыжки заставляют прыгать поток управление через блоки, с ними нужно больше внимания и концентрации. Ты постареешь, а код останется. И процессоры будут быстрее. Если только это не маленькая фнукция, которую будут вызывать в цикле десятки тысяч раз. Для этого можно замерить скорость выполнения через GetTimeMsec.


RE: ERA III - Raistlin - 02.01.2022 23:50

Berserker, можете пожалуйста подсказать кое-что касательно ERM2? Если у меня есть константа, объявленная во внешнем файле, я могу ее использовать в собитии карты?


RE: ERA III - Berserker - 03.01.2022 01:19

Продублируй её в событии карты. Скрипты карты грузятся до глобальных скриптов.


RE: ERA III - Raistlin - 03.01.2022 01:20

Berserker, хорошо, спасибо! Достаточно только один раз продублировать, или надо это делать в каждом событии?


RE: ERA III - Berserker - 03.01.2022 01:22

Один раз в самом приоритетном событии.


RE: ERA III - Raistlin - 03.01.2022 01:36

Понятно. Спасибо за ответы!


RE: Школа ERM 2 - Archer30 - 25.02.2022 10:38

Questions about writing styles and formats

1. Do we use &(TRUE) instead of &1 for the meaning "flag 1 is 1"?, example:

2. We have sevral ways to create an array in ERA 3. Does any any of them requires initialization of any kind?



RE: Школа ERM 2 - wessonsm - 25.02.2022 10:48

Archer30, синтаксис &(FALSE) будет работать неправильно, так как перекомпилируется в &0, а не &-1.
К тому же это не улучшит, а ухудшит читаемость скрипта - не будет видно сразу, что 1 - это флаг.


RE: Школа ERM 2 - Archer30 - 25.02.2022 10:55

Dash1I forgot that (FALSE) is 0. Yea I agree &1 is more readable. Just daemon_n wrote it as &(TRUE) and I started to think the other way.


RE: Школа ERM 2 - daemon_n - 25.02.2022 11:31

Archer30, unstandard decisionRolleyes


RE: Ваши вопросы по ERM-скриптам - Archer30 - 07.03.2022 17:15

Berserker, thanks for the code!

There were not many times I struggle with erm syntax, but now it is definitely the moment. It seems like my knowledge is not enough to handle erm 4, lol!
A few questions I'd like to ask:

1. What is (@var)?
2. What's the reason for using y(ptr) here? Is it not true that mixing normal y and (var:y) could result in bad things?
3. What's wrong with my code when I try to execute the function with an array ID? I can't get to define the IF:N dialogue.




RE: Ваши вопросы по ERM-скриптам - Berserker - 07.03.2022 18:23

1) @ - get address operator. Compiles into index without variable type.

If (someVar) = y50, (@someVar) = 50.
If (someArr[20]:y) = y20..y39, then (@someArr[1]) = 21

2) Ptr = pointer. It means that one variable holds index of another variable.

We cannot iterate over 2 arrays at the same time using !!re normally.

For instance, over y20..y39 and y40..y59.

But we can store 40 into (somePtr) and increase it one by one, so that y(somePtr) refer to y40, y41, y42...

3) Call IF:N^title^; after setup.


RE: Ваши вопросы по ERM-скриптам - Archer30 - 09.03.2022 18:16

Berserker, thank you so much!

About the second question, I mean. I read that (var:y) would be compile into classic y vars (y1, y2, etc) by ERA with a process. This process strickly forbiddon mixing y1, y2 with (var:y) (name:y) in the same funcion as there is a chance (var:y) (name:y) could be compiled to y1 y2 and overlap. Why is it not a concern in the case mixing (var:y) and y(ptr:y)?


RE: Ваши вопросы по ERM-скриптам - wessonsm - 09.03.2022 18:40

Archer30, (ptr:y) это такая же переменная, как и все остальные, обозначение "ptr" используется для удобства и понимания.
Если (ptr:y) будет перекомпилировано в y10,
тогда y(ptr) перекомпилируется в yy10.
Смешивания не возникает, потому что мы в обоих случаях используем одну переменную y10.
Если я правильно понял вопрос.


RE: Ваши вопросы по ERM-скриптам - Berserker - 09.03.2022 21:22

y(ptr:y) does not allocate anything new. It's the same as yy51, for instance.


Here we use y51 as storage variable and y2 as reusable pointer.

There is possibility to introduce bugs when dealing with y(ptr:y) syntax, because no checks are performed when you increase/decrease/assign pointer value.

Example:




RE: Ваши вопросы по ERM-скриптам - Archer30 - 10.03.2022 09:18

Berserker, I get the idea. I thought the process of converting (var:y) to classic y is kinda random, like (var:y) can be randomly chosen from y1 to y99. But now it looks like we will have y99 only when there are 98 other y variables in the same function. Brillant! Thanks for helping Berserker and wessonsm!


RE: Школа ERM 2 - Berserker - 10.03.2022 17:06

It should be treated as random, but arrays are guaranteed to occupy continuous block of vars.

(arr[10]:y) can be y50..y59 or y65..y74, but not (y50, y52, y97, y3...) and so on.
Thus for arrays pointers and pointer arithmetics works if written carefully.


RE: Школа ERM 2 - slater777 - 16.12.2022 01:16

Вопрос по поводу синтаксиса с переменной, которую необходимо указать 2 раза (диапазон значений одной переменной). Вот такие конструкции не работают:


или


Как можно решить эту проблему? Или придется дублировать код?


RE: Школа ERM 2 - SergOz - 16.12.2022 03:46

slater777, синтаксис работает. Только, если уж вопрос в теме ERM2, то как-то так:


То же самое и с синтаксисом и

P.S. Возможно, не срабатывает то, что ты даёшь/отнимаешь?


RE: Школа ERM 2 - slater777 - 16.12.2022 05:21

SergOz, да, ошибка была в скрипте. Отдебажил, всё заработало. Просьба эти посты перенести в "Ваши вопросы по ERM-скриптам". Спасибо за помощь!


RE: Школа ERM 2 - slater777 - 18.12.2022 23:45

Вопросы по поводу триггеров.

Есть ли в ERM2 аналог FU31200..31399 - Триггер_После_получения_уровня_героем (-1..198) ?
И есть ли триггер (даже в обычном ERM его не увидел, но всё же) при получении вторичного навыка?


RE: Школа ERM 2 - Berserker - 19.12.2022 03:31

Если это не стандартные события, то нет.