Current time: 24.03.2024, 01:01 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
ERA II
» WoG Era 2: Русская и Английская версии
Author Message
Berserker Offline
Administrators

Posts: 16449
Post: #2581

Пишу на PHP утилиту для преобразования скриптов старого формата в новый (именованные функции, замена числовых адресов прыжков SN:G на автоматически сгенерированные метки). Параллельно играю в Феникс. Пока ни одного вылета. Без HD.
24.11.2017 01:27
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2265
Post: #2582

(24.11.2017 01:27)Berserker Wrote:  именованные функции

Кириллица поддерживается? Может быть тогда и именованные переменные появятся? Хотя сомневаюсь, что именование функций необходимо, возникают некоторые вопросы:

1. Что будет с именами, когда при вызове функции загоняется её номер из переменной?
2. Вызов функций будет работать ещё медленнее?
3. Некоторые функции могут вызываться различными пользовательскими скриптами, включая встроенными в карты - что с этим будет при именовании этих функций (пользователь точно не полезет ковыряться в редактор карт и переименовывать там функции вручную)?
24.11.2017 11:32
Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3880
Post: #2583

XEPOMAHT,
1. Числовые имена функций отменять никто не собирается. Переименовывать/именовать уже имеющиеся функции - тоже.
2. Я так понимаю, при первоначальной загрузке ERM имена заменятся на числовые из некоторого пула (типа прекомпиляция) и далее процесс будет идти по старому. Т.е. на производительность не повлияет.
3. См.1.

Берс, поправь, если я ошибаюсь.


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
24.11.2017 14:10
Visit this user's website Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2265
Post: #2584

(24.11.2017 14:10)Algor Wrote:  Переименовывать/именовать уже имеющиеся функции - тоже.

Тогда смысл для простых ERM-скриптёров в утилите для преобразования скриптов старого формата в новый, над которой работает Berserker?
24.11.2017 14:45
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #2585

Algor, спасибо ) На всякий случай отвечу по пунктам:

Quote:Кириллица поддерживается?
Произвольный текст между скобками.

Quote:Может быть тогда и именованные переменные появятся?
Переменные в ЕРМ привязаны к типам, поэтому нет.

Quote:отя сомневаюсь, что именование функций необходимо
Нет никаких сомнений. Пишешь новый код — используешь имена. Получаешь:
-) Меньше риск совпадений с другими скриптами, так как номера выделяются автоматически.
-) Читать, понимать и развивать твой скрипт тебе и другим проще в разы. На !!FU81234:Py3, а !!FU(Hero.FindFreeSlot):Py3.

Quote:1. Что будет с именами, когда при вызове функции загоняется её номер из переменной?
Имена заменяются на автоматические номера при загрузке карты.

!?PI;
!!VRv2:S(MyHandler);
!!FUv2:P;

!?FU(MyHandler);
!!IF:M^PIsec^;

Quote:2. Вызов функций будет работать ещё медленнее?
Влияет только на скорость старта карты. На современном компьютере, преобразовав весь Феникс в именованные функции и константы, особо разницы не заметил. И да, вызовы функции, FU/DO медленные. Быстрые циклы делаются через прыжки.

Quote:3. Некоторые функции могут вызываться различными пользовательскими скриптами, включая встроенными в карты - что с этим будет при именовании этих функций (пользователь точно не полезет ковыряться в редактор карт и переименовывать там функции вручную)?
Если имя у функции одно и то же — оно везде заменится на одно значение. Скрипты из карт не обрабатываются предварительно вовсе (и являются кандидатом на удаление, как в 2.55, где они вынесены в erm-файлы в подпапке в Maps). Если речь про существующие скрипты и использование ВоГ-функций, то опцию по замене номеров 1..30000 (функции 3.58) я вынес в настройки.

Quote:Переименовывать/именовать уже имеющиеся функции - тоже.
Quote:Тогда смысл для простых ERM-скриптёров
Закончил почти, но Эру ещё нужно поправить.
-) Метки заменяются на именованные и расставляются автоматически в коде, где использовались SN:G-команды.
-) Цифровые функции заменяются автоматическими именованными, которые можно поиском и заменой переименовать в читаемые.
Пример из мода:
24.11.2017 15:48
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #2586

Закончил. Запускаю тест.
Входные данные: Phoenix Mod 3.6x. phoenix.erm размером 247528 байт.

Code:
D:\Heroes 3\Tools\ScriptsToEra260>cls && php compile.phc "D:\Heroes 3\Mods\Phoenix\Data\s\phoenix.erm"

Current directory is: D:\Heroes 3
Compiled script 'phoenix' of size 247526 to script of size 249653
D:\Heroes 3\Tools\ScriptsToEra260>

Появились файлы:
D:\Heroes 3\Mods\Phoenix\Data\s\phoenix.compiled.erm
D:\Heroes 3\Mods\Phoenix\Data\s\phoenix.funcs.json

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

Но сколько всего использовалось новых функций Эры и каких? Как проводить дальнейшее переименование мододелу? Как определить, что функция вызывалась косвенно?
Посмотрим на D:\Heroes 3\Mods\Phoenix\Data\s\phoenix.funcs.json

Code:
{
    "50000": "50000_F",
    "50001": "50001_F",
    "50003": "50003_F",
    "50004": "50004_F",
    "50005": "50005_F",
    "50006": "50006_F",
    "50007": "50007_F",
    "50008": "50008_F",
    "50009": "50009_F",
    "50010": "50010_F",
    "50011": "50011_F",
    "50012": "50012_F",
    "50013": "50013_F",
    "50014": "50014_F",
    "50015": "50015_F",
    "50016": "50016_F",
    "50017": "50017_F",
    "50018": "50018_F",
    "50019": "50019_F",
    "50020": "50020_F",
    "50021": "50021_F",
    "50022": "50022_F",
    "50023": "50023_F",
    "50024": "50024_F",
    "50025": "50025_F",
    "60000": "60000_F",
    "60001": "60001_F",
    "60002": "60002_F",
    "60003": "60003_F",
    "60004": "60004_F",
    "60005": "60005_F",
    "60006": "60006_F",
    "60007": "60007_F",
    "60008": "60008_F",
    "60009": "60009_F",
    "60010": "60010_F",
    "60011": "60011_F",
    "60012": "60012_F",
    "62514": "62514_F",
    "62520": "62520_F",
    "62521": "62521_F",
    "65000": "65000_F",
    "69999": "69999_F",
    "70000": "70000_F",
    "70001": "70001_F",
    "70003": "70003_F",
    "70004": "70004_F",
    "70005": "70005_F",
    "100000": "100000_F",
    "100100": "100100_F",
    "100101": "100101_F",
    "100102": "100102_F",
    "100103": "100103_F",
    "100123": "100123_F",
    "100124": "100124_F",
    "100125": "100125_F",
    "100126": "100126_F",
    "100127": "100127_F",
    "100500": "100500_F",
    "100501": "100501_F",
    "100777": "100777_F",
    "100778": "100778_F",
    "100888": "100888_F",
    "111000": "111000_F",
    "111001": "111001_F",
    "222000": "222000_F",
    "300000": "300000_F",
    "300001": "300001_F",
    "400000": "400000_F"
}

Видим отображение обнаруженных номеров функций на метки, а также, что за функции использовались и их количество. Преобразование шло в режиме «не трогать функции в диапазоне 1..30000», хотя если бы речь шла о Battle Heroes, где точно не вызывается воговский код, то мы бы получили более полный список.

Запустим ещё раз компиляцию. На этот раз в папке со скриптом уже имеется файл phoenix.funcs.json, поэтому компилятор сможет обнаружить возможные неявные вызовы функций из тех, что ещё не нашёл.

Code:
Current directory is: D:\Heroes 3
{!} Possible function (50010_F) = 50010 on line 5395 at pos 12
{!} Possible function (100000_F) = 100000 on line 5970 at pos 11
{!} Possible function (50021_F) = 50021 on line 8838 at pos 14
Compiled script 'phoenix' of size 247526 to script of size 249653

Очень интересно. Создался файл с предупреждениями по пути "D:\Heroes 3\Mods\Phoenix\Data\s\phoenix.warnings.txt". Три предупреждения, посмотрим на них:

Первое и последнее — действительно номера функций. Второе — просто значение.
Пора разрешить проблемы компилятора. 50010 — это событие применения способности воодушевления, 50021 — событие быстрого применения заклинания по клавише.
Отредактируем исходный скрипт в двух местах, где были предупреждения, прописав вместо чисел "PM.InspirationHandler" и "PM.QuickCastHandler", а также файл phoenix.funcs.json:
Code:
"50010": "PM.InspirationHandler",
...
"50021": "PM.QuickCastHandler",

Результат: в итоговом скрипте везде именованное значение:
Базовый перенос готов. Можно на досуге допереименовывать функции. В Фениксе использовалось большинство функций из диапазона 1..30000, поэтому желательно бы запустить полное преобразование, убедившись, что воговские функции не использовались.
24.11.2017 18:11
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2265
Post: #2587

(24.11.2017 15:48)Berserker Wrote:  

А переименовать "!?FU(OnCustomDialogEvent)" во что-нибудь более осмысленное, например в !?FU(Триггер_Игровой_диалог), можно будет? Чтобы ЭРА понимала русский язык совместно с английским. Мне что !?DL, что !?FU(OnCustomDialogEvent) - одинаково нечитаемо и так же потребует комментирования со стороны скриптёра, не знакомого с буржуйским.

И что будет с именами для функций под номерами 0х40000000 и выше?
24.11.2017 19:47
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2807
Post: #2588

Дико не хватает времени на написание плагина. Пока что окно выглядит вот так (с учетом HD и его масштабирования).
(скрин HD 1920x1080) (Click to View)


game bug fixes extended.dll || My Plugins || My GitHub
24.11.2017 19:57
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #2589

XEPOMAHT, замену обычных триггеров типа !?DL на читаемые функции убрал. В своих скриптах можешь использовать сугубо русские идентификаторы, если пожелаешь:
SN:W^хрм.переменная^/^значение^;
!?FU(При взятии бастилии);
!!FU(Проверить, какой сейчас век):P?y2;

У тебя есть готовый скрипт, не привязанный к карте, но использующие функции и/или SN:G прыжки?

igrik, по времени прекрасно понимаю Ab Выглядит отлично!
Кстати, пригодилась бы NPC dll без надписи ТЕСТ!!!. Играть приятнее ))
24.11.2017 20:21
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2265
Post: #2590

(24.11.2017 20:21)Berserker Wrote:  У тебя есть готовый скрипт, не привязанный к карте, но использующие функции и/или SN:G прыжки?

Как раз в скриптах сводил использование функций к минимуму, а SN:G не использовал из-за проблем напортачить с этой командой (тем более её реализация в MoP 2.1 была заморожена - к сожалению так и не научился добавлять новые ресейверы через DLL).
24.11.2017 21:12
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #2591

Обычно в программировании сложные задачи разбиваются на ряд вспомогательных алгоритмов, так что функции — это базовые кубики любого мало-мальски большого проекта. Избегать их не стоит )
24.11.2017 21:55
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2265
Post: #2592

Переписывая скрипты ВоГ-а под ЭРУ, вывел несколько правил.

Если:

1. функция вызывается в коде очень небольшое количество раз.
2. функция используется в качестве заменителя конструкции if...else...end (знаменитые костыли для бога костылей).
3. функция используется как каркас примитивного цикла, который может быть заменён эровским SN:G (современным, а не костыльным с указателем на номер строки скрипта, от которого было больше вреда, чем пользы).
4. функция может быть оптимизирована до нескольких строчек кода, которые могут просто подставляться в скрипт без вынесения в отдельную функцию или объединены с другой функцией.

То её использование абсолютно нецелесообразно. Злоупотребление функциями в ERM - зло.
25.11.2017 00:58
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #2593

Quote:от которого было больше вреда, чем пользы
Да не было никакого вреда. Цикл либо работает, либо нет, если ошиблись. Риск ошибки на этапе разработки выше, но множество кода с ней было написано. Хотя неудобно номер строки-адресата помечать в комментариях и править при любом дополнении кода, соглашусь.

По пункту 2, если помнишь, в 2.47 добавлена elseif: !!el&условие::

А что именно за код ты переписываешь и с какой целью, если не секрет? )
25.11.2017 01:13
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2265
Post: #2594

(25.11.2017 01:13)Berserker Wrote:  А что именно за код ты переписываешь и с какой целью, если не секрет? )

Воговские скрипты когда-то переписывал под ЭРА, убирая там тормозящие функции, оптимизируя сам код скриптов, с учётом добавленных через аметист новых монстров (теперь аметист благополучно заменён на тифон), новых артефактов, добавленных через эмерад, и других плагинов для ЭРА, а так же новых объектов для редактора карт. В общем сейчас этот мод запараллелен с MoP и выйдет только после завершения всех работ над MoP 2.хх. Соответственно, эти переписанные скрипты будут и там и там, а в MoP что-то из них будет внедрено непосредственно в WERD.DLL.
25.11.2017 01:49
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #2595

Ты соавтор МОРа или МОР передал тебе исходники МОР? )))
МОР разве понимает ЕРМ?
25.11.2017 02:06
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group