Current time: 10.04.2025, 06:26 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Школа ERM 2
» ERM 2.0 для ERA III
Author Message
Berserker Offline
Administrators

Posts: 16733
Post: #61

Заменяем:
  1. !?CM5; кликаем
  2. !!VRv1:C0/0/0;
  3. !!CM:F?(clickFlag:y); какой флаг клика
  4. !!FU&(clickFlag)<>4:E; если не Cntrl+ЛКМ - выход
  5. !!CM:P?v1/?v2/?v3; координаты клика
  6. !!OB1:T?(objType:y); тип объекта
  7. ; если кликнул на палатку
  8. !!FU(Tent)&(objType)=10:P21;
На:
  1. !?FU(OnAdventureMapLeftMouseClick);
  2. !!CM:F?(clickFlags:y);
  3. !!FU&(clickFlags)<>(MOUSE_FLAG_CTRL):E;
  4. !!CM:P?(x:y)/?(y:y)/?(z:y);
  5. !!OB(x)/(y)/(z):T?(objType:y);
  6. ; Обработать (handle) щелчок по палатке ключника с передачей координат в функцию
  7. !!FU(serg_HandleKeymastersTentClick)&(objType)=(OBJ_KEYMASTERS_TENT):P(x)/(y)/(z);


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

Posts: 16733
Post: #62

  1. !?FU(Tent);
  2. !!OB1:U?(colTent:y); узнаю подтип палатки (цвет)
  3. !!re i/0/7: ;
  4. !!SN:W^%i_%(colTent)^/?yx1;
  5. !!VRx1:+1;
  6. !!en: ;
  7. ; в сообщении просто цветом чисел выделяем игроков
  8. !!IF:M^ {~Salmon}СКОЛЬКО РАЗ ИГРОКИ ПОСЕТИЛИ ПАЛАТКУ{~}
  9. {-----------------------------------------------------------------------------------------}
  10. {~OrangeRed}%Y21{~} {~DodgerBlue}%Y22{~} {~Peru}%Y23{~} {~Green}%Y24{~} {~Orange}%Y25{~} {~BlueViolet}%Y26{~} {~SkyBlue}%Y27{~} {~HotPink}%Y28{~}^;
Заменить на:
  1. !?FU(serg_HandleKeymastersTentClick);
  2. ; Функция принимает 3 параметра: x/y/z
  3. !#VA(x:x) (y:x) (z:x);
  4. !!OB(x)/(y)/(z):U?(tentColor:y);
  5. ; Выделим массив из 8 счётчиков посещений по цвету игроков
  6. !#VA(visits[8]:y);
  7. ; Пройдёмся по элементам массива
  8. ; Здесь и далее суффикт "Ptr" означает Pointer (указатель), то есть переменная реально хранит индекс другой переменной
  9. !!re i/(PLAYER_FIRST)/(PLAYER_LAST):;
  10. !!VR(visitPtr:y):S(@visits) +i; @visits - это индекс первого элемента массива, его виртуальный «адрес» (@)
  11. ; Если прибавить к нему номер итерации i, получим индекс текущего элемента в массиве
  12. !!SN:W^serg_tent_visits_%(tentColor)_%i^/?y(visitPtr);
  13. !!en: ;
  14. ; в сообщении просто цветом чисел выделяем игроков
  15. !!IF:M^ {~Salmon}СКОЛЬКО РАЗ ИГРОКИ ПОСЕТИЛИ ПАЛАТКУ{~}
  16. {-----------------------------------------------------------------------------------------}
  17. {~OrangeRed}%(visits[0]){~} {~DodgerBlue}%(visits[1]){~} {~Peru}%(visits[2]){~} {~Green}%(visits[3]){~} {~Orange}%(visits[4]){~} {~BlueViolet}%(visits[5]){~} {~SkyBlue}%(visits[6]){~} {~HotPink}%(visits[7]){~}^;


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

Posts: 1332
Post: #63

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

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


Карта-мод "Война на Холсте"
(This post was last modified: 24.10.2020 03:06 by SergOz.)
24.10.2020 03:00
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16733
Post: #64

Смотри, я прохожусь от i = цвет первого игрока до цвет последнего игрока
Вот эти константы:
  1. !#DC(PLAYER_FIRST) = 0;
  2. !#DC(PLAYER_RED) = 0;
  3. !#DC(PLAYER_BLUE) = 1;
  4. !#DC(PLAYER_TAN) = 2;
  5. !#DC(PLAYER_GREEN) = 3;
  6. !#DC(PLAYER_ORANGE) = 4;
  7. !#DC(PLAYER_PURPLE) = 5;
  8. !#DC(PLAYER_TEAL) = 6;
  9. !#DC(PLAYER_PINK) = 7;
  10. !#DC(PLAYER_LAST) = 7;
Далее, тебе нужен был массив из 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)


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

Posts: 1332
Post: #65

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


Карта-мод "Война на Холсте"
(This post was last modified: 24.10.2020 13:28 by SergOz.)
24.10.2020 03:23
Find all posts by this user Quote this message in a reply
Bes Offline

Posts: 5459
Post: #66

Вот же...
(24.10.2020 01:32)Berserker Wrote:  Обновление: https://dropmefiles.com/PSvrC
24.10.2020 03:29
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16733
Post: #67

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


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

Posts: 16733
Post: #68

Задача: сделать возможным переопределять глобальные переменные мода из json-конфига с поддержкой констант.
Требования: Era 3.2.0+, Erm Framework Mod 3.2.0+
Решение:
  1. ; ============== PUBLIC ==============
  2. ; Объявляем сами переменные и даём им в коде значения по умолчанию
  3. !#VRi^mix_minNumNeutralStacks^:S1; Minimum number of mixed neutral stacks in battle.
  4. !#VRi^mix_maxNumNeutralStacks^:S4; Maximum Number of mixed neutral stacks in battle.
  5. !#VRi^mix_neutralStackSpread^:S(MIX_SPREAD_SPACE_BETWEEN); Default spread strategy for neutral stacks.
  6. !#VRi^mix_neutralStackScale^:S125; Multiplier for original neutrals quantity on adventure map in percents.
  7. !#VRi^mix_netralStackScaleForHuman^:S200; Additional multiplier of neutrals power only for humans in percents.
  8. !#VRi^mix_noNeutralsMorale^:S(TRUE); If true, neutrals will have no morale at all.
  9. !#VRi^mix_generateMonstersByFactions^:S(TRUE); If true, additional generated monsters will belong to the same faction.
  10. !#VAi^mix_allowAlliedFactions^:S(TRUE); If true, allied faction monsters will also be generated.
  11. !#VRi^mix_moveNeutralsToFactions^:S(TRUE); If true, all WoG neutral monsters will be assigned a faction / town.
  12. !#VRi^mix_registerRegularMonsters^:S(TRUE); If true, all regular WoG creatures are registered and will become accessible for generation.
  13. !#VRi^mix_registerFactionAllies^:S(TRUE); If true, configurates each faction allies and their association level.
  14. ; ============ END PUBLIC ============
  15. ; Позволяет переопределять переменных в json-конфиге (из папки Lang)
  16. !?FU(mix_LoadGlobalConfig);
  17. ; Loads global settings from json
  18. !!FU(NewStrArray):P?(configRules:y); создали временный массив строк
  19. ; Заполнили массив именами глобальных переменных, значения которых можно переопределять
  20. !!FU(Array_Push):P(configRules)/^minNumNeutralStacks^/^maxNumNeutralStacks^/^neutralStackSpread^/^neutralStackScale^/^netralStackScaleForHuman^/^noNeutralsMorale^/
  21. ^generateMonstersByFactions^/^allowAlliedFactions^/^moveNeutralsToFactions^/^registerRegularMonsters^/^registerFactionAllies^;
  22. ; Подсчитали, сколько поддерживаем таких глобальных переменных
  23. !!SN:M(configRules)/?(numConfigRules:y);
  24. ; Для каждого имени переменной
  25. !!re i/0/(numConfigRules)/1/-1:;
  26. !!SN:V(configRules)/i/?(configRuleVarName:z); получили имя переменной
  27. !!VR(key:z):S^mix.global.%(configRuleVarName)^; сформировали ключ для перевода
  28. !!SN:T(key)/?(strValue:z); получили строковое значение из json. Если значения не будет, оно будет установлено в значение запрошенного ключа (key)
  29. ; например, %T(a.b.c) вернёт "a.b.c", если такого ключа не найдено
  30. !!SN:C(strValue)/?(intValue:y)/(constExists:y); ищем по строковому значению константу
  31. !!if&(constExists)=(TRUE):; константа была найдена, перезаписываем глобальную переменную
  32. !!VRi^mix_%(configRuleVarName)^:S(intValue);
  33. !!el&(key)<>(strValue):; константа не была найдена, но значение отличается от ключа, значит оно в json имеется
  34. !!VR(intValue):V(strValue); конвертируем строку в целое числи
  35. !!VRi^mix_%(configRuleVarName)^:S(intValue); перезапишем глобальную переменную
  36. !!en;
  37. !!en:;
  38. !#FU(mix_LoadGlobalConfig):P; незамедлительно загружаем json-конфиг ещё до события OnAfterErmInstructions


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

Posts: 1332
Post: #69

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


Карта-мод "Война на Холсте"
25.10.2020 12:24
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16733
Post: #70

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, например.


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

Posts: 5459
Post: #71

Berserker, как я понимаю, последовательность !?FU и !#VA не принципиальна, и можно
в обратном порядке вызывать?
  1. !#VA:(name:y);
  2. !?FU(OnAnyEvent);
  3. ...
  4. ; (-name) можно же удалять глобальные локальные переменные как локальные?
25.10.2020 19:01
Visit this user's website Find all posts by this user Quote this message in a reply
SergOz Offline

Posts: 1332
Post: #72

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


Карта-мод "Война на Холсте"
25.10.2020 19:15
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16733
Post: #73

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


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

Posts: 5459
Post: #74

а чего тогда ты сделал объявление локальной через синтаксис !# ? (сразу провокация на выход из твоих примеров использования 148)
25.10.2020 21:54
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16733
Post: #75

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

  1. !!VR(spisok[3]:y):C100/200/300;
и
  1. !#VA(spisok[3]:y); будет удалено, но переменная spisok[3] останется объявленной
  2. !!VR(spisok):C100/200/300;


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
25.10.2020 22:33
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2025 MyBB Group