prog
offline
Опыт:
32,865Активность: |
fly-script интерпретатор
Данные немного устарели, актуальная информация будет выложена в ближайшее время
((кат старое описание
немного рекламыХотите добавить в свою карту нестандартные заклинания, но приходите в ужас от слов jass, функции, переменные, дамми-каст и прочей невразумительной терминологии, а стащить у кого-то готовые не позволяет совесть или уровень знаний? Тогда ваше время пришло - знания одной-двух базовых команд fly-script достаточно чтобы создавать достаточно сложные способности, выходящие далеко за рамки стандартных, пользуясь при этом исключительно редактором объектов!
Являетесь достаточно опытным разработчиком готовитесь к старту нового проекта и с ужасом предвкушаете разработку очередной сотни героев с "уникальными" способностями? В состав fly-script входит набор команд, позволяющих использовать несколько распространенных механик работы способностей, которые можно комбинировать самым невероятным образом!
Вынашиваете планы грандиозной РПГ, дающей игроку возможность взаимодействия практически с любым элементом окружения, но не знаете как подступиться к решению этой задачи? Достаточно определиться со способом хранения fly-скриптов и условиями их передачи интерпретатору, после чего сразу можно приступать к заполнению вашего мира множеством интерактивных объектов!
Ваши идеи уникальны и базовых возможностей не хватает для их реализации? Архитектура fly-script позволяет легко и просто добавить собственную команду или изменить поведение любой стандартной!
общие сведенияязык реализации: cJass
целевая аудитория: как начинающие, так и опытные картостроители работает в сетевой игре: да версия warcraft: не ниже 1.24 Данная наработка представляет собой написанный на jass командный интерпретатор, выполняющий переданный ему текстовый скрипт. Текст скрипта разбивается на блоки, а блоки на команды с параметрами. Каждая команда обрабатывается соответствующей функцией, обычно расположенной в отдельном файле, а на основе результата ее выполнения принимается решение о переходе к следующей команде, завершении выполнения скрипта/блока, или даже пропуске нескольких последующих команд/блоков.
Для того чтобы пользоваться преимуществами fly-script не обязательно в совершенстве знать jass - после минимальной установки можно продолжать работу, пользуясь только редактором объектов и любым текстовым редактором поддерживающим кодировку UTF-8 для удобства хранения и редактирования скриптов. В базовой комплектации интерпретатор распознает использование способностей, содержащих fly-script и автоматически приступает к его исполнению.
В тоже время знание jass значительно расширяет горизонты применения fly-script, не ограничиваясь выполнением скрипта при использовании способности, не говоря уже о возможности добавления собственных команд.
Внимание, для тех кто в танке: Это не очередной преобразователь jass вроде сJass и vJass! Предполагается что текст скрипта будет храниться, например, в редакторе объектов или формироваться динамически.
текущее состояниеНа данный момент система находится в активной разработке, но даже в текущем состоянии активно используется в двух проектах.
Установочный архив с черновой версией выложен, но без мануалов и даже без руководства по импорту. Использовать наработку до приведения ее к нормальному виду не рекомендуется
((кат краткий список команд доступных в базовой комплектации
))
недостатки
требования и зависимостиминимальные
импорт и настройка fly-script интерпретатораминимальный вариант
продвинутый вариант
планы на будущеереальные
нереальные
новостиДобавлена карта с системой кеширования скрипта. Поскольку до интерпретатора руки у меня еще не дошли - в карте просто кешируется любой введенный текст, а затем извлекается обратно.
Целочисленные и действительные параметры команд хранятся в виде целых и действительных чисел, соответственно, а команды - временно в виде хеш-кода строки команды, позже будет использоваться номер ячейки в массиве команд.
Кроме того система устойчива к неправильному использованию разделителей команд и параметров (а вот в коде относящемуся к разделителям блоков я что-то напутал и конструкции вида ## приводят к неправильной обработке скрипта)
Ну и еще одна новая возможность: можно указать собственные разделители для каждого скрипта - для этого достаточно начать скрипт с текущего разделителя блоков (по умолчанию #) и следующие три символа будут использованы в процессе обработки этого скрипта как разделитель блоков, разделитель команд и разделитель параметров, соответственно.
Теперь о главном, а именно когда же наконец демонстрационная карта с древней версией интерпретатора будет заменена новой со всеми этими свистелками-перделками и мануалом? Ответ до банального прост - вскоре после завершения сессии.
((кат текущее состояние обновления:
задачи
синтаксис
разделитель блоков в самом начале скрипта указывает парсеру что следующие три символа необходимо использовать при обработке как разделители блоков, команд и параметров, соответственно
строковые параметры необходимо заключать в двойные кавычки
планируемый список команд в минимальной конфигурациивнутренние команды:
внешние команды:
))
проекты, в которых используется fly-script 1.0 ============================== Племена Warcraft Ant Wars )) Отредактировано prog, 21.02.2012 в 01:15. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
08.05.2011, 02:31 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
SRes
1110101000
offline
Опыт:
9,997Активность: |
Цитата:
nuff said. Писать на интерпретируемом скрипте интерпретируемый скрипт - это гарантированное убийство производительности. Единственный вариант: написать свой транслятор из скрипта в JASS. Остальные идеи обречены на провал, ибо работают крайне медленно. Цитата:
Без этого проект не имеет смысла. Да и с этим смысл невелик, разве-что для персонального использования. |
||
08.05.2011, 03:26 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
prog
offline
Опыт:
32,865Активность: |
SRes, вынужден не согласиться. Да, действительно, производительность падает по сравнению с реализацией сразу на jass, но единственно из-за медленной работы со строками - после того как парсер выделил команду и ее параметры дальше выполняется уже чистый jass код, практически не отличающийся от того как бы он выглядел в реализации того-же самого функционала без всяких скриптов. Все остальные затраты процессорного времени возникающие в процессе работы интерпретатора не сравнимы с обработкой строк. Ах да, совсем забыл, сопоставление команды и функции которая ее обрабатывает реализовано через хештаблицу и TriggerEvaluate - на мой взгляд это быстрее чем последовательно сравнивать выполняемую команду с всеми возможными и вызывать соответствующую функцию при совпадении. На самом деле правильнее было бы назвать это, например, макросами - такое название более точно описывает принципы работы получившегося чудища, но звучит не в пример хуже. |
08.05.2011, 12:40 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Elf_Stratigo
offline
Опыт:
4,699Активность: |
строки и хештаблицы - одни из самых медленных инструментов
в нормальном варианте это можно сделать через один массив
» ну а строки, типо
читабельностью уж совсем не пахнут
имхо, совсем грустная вещь |
08.05.2011, 13:39 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
омг, я пишу такую-же штуку, только круче и запутанней, с возможностью изменения синтаксиса на себя. И да, обработка строк не будет тормозить, имхо. У меня, например, она будет происходить только при переходе из одного блока заклинания к другому. |
08.05.2011, 14:57 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
prog
offline
Опыт:
32,865Активность: |
Elf_Stratigo, будь добр объяснить как с помощью массива сопоставить практически произвольную строку длиной от 1 до 5 символов триггеру или функции без последовательного перебора всего массива... Одна операция чтения из хештаблицы однозначно быстрее чем, например, 20 операций чтения из массива.
((кат тот скрипт сейчас выглядит так:
))
В редакторе объектов, где этот скрипт и используется, оно вообще в одну строку пишется. Насчет плохой читаемости полностью согласен.
((кат вот так было-бы немного лучше:
))
Но что изменилось то? всего-навсего вынесены текстовые константы из скрипта, заменен символ отрицания и убран символ > перед кодом возврата в условиях. Изменить функции-обработчики команд таким образом чтобы они понимали сколь-угодно читаемый код может даже криворукий школьник, благо все обработчики команд вынесены в отдельные файлы и не надо судорожно искать их в коде карты.
((кат ах да, совсем забыл, можно же сделать что-то типа такого
))
Тогда действительно можно обойтись без всякой хештаблицы - ведь команды заданы числами и да здравствует прирост производительности на 20%! за счет отказа от одного обращения к хештаблице на команду и сокращения длины строк из которых убраны избыточные символы. А если кто-то подскажет мне способ как в редакторе объектов хранить byte-массивы то можно будет вообще уйти от строк и написать свой ассемблер. Ну и для расширения кругозора:
((кат пример скрипта массового полиморфа из карты включенной в установочный архив
cast A001:polymorph 600 t#
))
имхо, достаточно читаемо и не создает чрезмерной нагрузки ни на мозг разработчика ни на движок вара. prog добавил: Doc, а можно подробнее или это секретная информация? |
08.05.2011, 15:14 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
лечит всех союзов в области в области 500 на 50 хп, применяя на них эффект с названием "1", наносит 200 урона цели, применяя эффекты "1" и "2". |
08.05.2011, 15:21 | #7
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Elf_Stratigo
offline
Опыт:
4,699Активность: |
» используя тотже TriggerEvaluate и массив триггеров
считаем, что все абилки, требующие триггерного описания находятся с MY_SUPER_ABILITIES, благо ngen позволяет задавать свои равы
обычно задаю с верхнюю границу, но это сейчас не важно пока ни один интерпретатор не выложен, неизвестно, что за магия у вас там
но если нету никакого кеширования действий, то при многократном частом использовании думаю будет очевидным появление лагов впрочем, как заметил SRes, интерпретатор на интерпретаторе - это... скорее это подходит для каких-нибудь рантайм "конструкторов заклинаний", когда поведение той или иной абилки зависит от самого игрока, а не значений РО Отредактировано Elf_Stratigo, 08.05.2011 в 15:29. |
08.05.2011, 15:21 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
там будет много модификаторов с разными параметрами итп. |
08.05.2011, 15:22 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
prog
offline
Опыт:
32,865Активность: |
Elf_Stratigo, смотри первый пост - там уже появился архив
А твой метод не годится по одной простой причине - сопоставление идет вовсе не способности с триггером, а команды, например "cast" или "ifi" с соответствующей функцией обработки. Ведь не только способностям можно назначать скрипты, если что - речь идет вовсе не о создании триггерных заклинаний как таковых - они используются только в качестве примера самого очевидного применения системы. Doc, как я понял твоя система это по сути конструктор абилок и абилообразных действий? тогда у нас все-же немного разные системы - такое как у тебя я делал раньше, но до ума не довел - надоело модификаторы придумывать. Да и реализовано было намного примитивнее.
Например выложенный парой постов выше мой пример скрипта при выполнении от имени юнита проверяет наличие у того в инвентаре определенного набора предметов, выводит на экран хозяину юнита список всех недостающих ингредиентов, а если есть все необходимые - заменяет их на готовый предмет и молчит в тряпочку. |
08.05.2011, 15:54 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Elf_Stratigo
offline
Опыт:
4,699Активность: |
уж как объяснили |
08.05.2011, 16:12 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
prog
offline
Опыт:
32,865Активность: |
Так это ж часть адресованная тем кто ни бум-бум в jass и не способен прикрутить интерпретатор куда ему надо. |
08.05.2011, 16:16 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
намекает.
ну да, в целом у тебя более широконаправленная штука. Отредактировано Doc, 08.05.2011 в 16:44. |
08.05.2011, 16:32 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
prog
offline
Опыт:
32,865Активность: |
Doc, но при этом я немного теряю в производительности, в том числе, например, и за счет того что проверяется результат выполнения каждой команды, да и скрипт у меня получается далеко не такой компактный.
Кстати, если будешь выкладывать в открытый доступ - подумаю над тем чтобы научить свою систему пользоваться твоей, если ты не против, конечно. Естественно в виде изначально отключенной команды-обертки - твою систему обязательно надо будет ставить и настраивать отдельно. |
08.05.2011, 17:22 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
prog, ок, поговорим как закончу.
наработку бегло посмотрел. круто, конечно. но я так и не понял, как ты вытаскиваешь данные из ро? |
08.05.2011, 18:04 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DotaMaster666
Silenced by GadenbIsh
offline
Опыт:
1,259Активность: |
У меня от кода глаза не на лоб, они куда дальше лезут.
» Шок контент
loop++.j
|
08.05.2011, 18:18 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
prog
offline
Опыт:
32,865Активность: |
первая работает и для юнитов, но немного коряво
для деструктаблов и предметов - можно попробовать в невидимом цветовом теге перед именем (хранить там, например, id способности, а уже в ней всю нужную информацию)
достаточно медленно, конечно, как мне кажется, поэтому есть смысл считывать эту информацию при загрузке карты и хранить в массивах или хотябы в хештаблицах (сам так пока не делаю, но чувствую что скоро придется)
DotaMaster666, к чему именно претензии? к моему cjass, или к не самому оптимальному способу сохранения/загрузки текущего состояния регистров интерпретатора, который, кстати, давно пора переделать в стек на основе глобального массива? Отредактировано prog, 08.05.2011 в 18:45. |
08.05.2011, 18:37 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DotaMaster666
Silenced by GadenbIsh
offline
Опыт:
1,259Активность: |
Именно к cJass коду.
ARRAY_ - тоже макрос? |
08.05.2011, 18:46 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
prog
offline
Опыт:
32,865Активность: |
нет, это просто префикс чтобы снизить вероятность конфликта имен
посмотри там рядом есть еще макрос для имитации двухмерного массива на одномерном |
08.05.2011, 18:56 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DotaMaster666
Silenced by GadenbIsh
offline
Опыт:
1,259Активность: |
Есть же vJass (они вместе с ц дополняют друг друга), там есть и много мерные массивы, и библиотеки с приватными именами. Я уже молу про использование в одной функции if () { и if () then...
А так это убивает всю читаемость на корню. |
08.05.2011, 19:06 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|