Голосование

Как вы оцениваете Смуту?












Оформление



Пользователей
  • Всего: 28869
  • Последний: Adr3naline
Сейчас на форуме
Пользователи: 2
Гостей: 583
Всего: 585

0 Пользователей и 1 Гость просматривают эту тему.

Тема: [Plug-in] NAC, дополнение к MS  (Прочитано 5798 раз)

  • Сообщений: 44
    • Просмотр профиля
0
« : 24 Января, 2010, 00:05 »
Вечер добрый

Я тут сварганил дополнение к модульной системе и хочу теперь обзавестись парочкой тестеров ) Один я буду оооочень долго всё тестить.
Вкратце, тулза (NAC) позволяет писать ваши скрипты (алсо диалоги, менюшки и тд) на языке чуть более высокого уровня, чем тот, что предоставляется модульной системой. Куски кода, написанные при помощи NAC, можно вставлять в уже существующие скрипты, так что проблема "на чем писать" не встанет. Пока тулза представляет из себя то ли сырую альфу, то ли бету, то ли еще что-то, в зависимости от найденых в будущем ошибок. Пока, тьфу-тьфу-тьфу, багов нет.

Что может тулза?

Ну, самое главное: позволяет использовать сложные выражения различной степени вложенности.
Поясню на примере.

Допустим, вам нужно считать значение некоего слота у "trp_daddy", умножить это значение на два и прибавить к нему единичку, и затем записать это значение в некий слот у "trp_kid".
Обычно мы бы сделали так:
(troop_get_slot, ":temp_variable", "trp_daddy", some_slot),
(val_mul,":temp_variable",2),
(val_add,":temp_variable",1),
(troop_set_slot, "trp_kid", some_other_slot, ":temp_variable")

NAC позволяет сделать проще, а именно:
TroopSetSlot( "trp_kid", some_other_slot, TroopGetSlot("trp_daddy", some_slot)*2+1 )Итого получаем одну строчку вместо четырёх.

Ах да, NAC вводит новый синтаксис вызова операций: SomeOperationName( operand1, operand2, operandn ) вместо старого (some_operation_name, operand_1, operand_2, operandn)
Для вызова скриптов в данный момент используется синтаксис call(<имя скрипта без начального script_>, <операнд 1>, <операнд 2>, <операнд n>). В ближайшем будущем, буде не запарюсь с выявленными багами, добавлю синаксис script_name( operand1, operand2, operandn ).

Далее, реализованы логические выражения и операции сравнения: операторы and, or, ==, !=, >, <, >=, <=
В качестве операндов эти операции могут возвращать 1 (если верно) или 0 (если неверно). Пока отсутствует оператор not.

Из обычных математических операторов есть умножение (*), деление (/), сложение (+), и вычитание (-). Потом добавлю еще всяких радостей :). Скобки, разумеется, реализованы.

Наконец, в NAC имеются адекватные конструкции IF/ELSE и FOR, в будущем планирую добавить SWITCH/CASE и еще что-нибудь. К сожалению, BREAK, хоть и имеется, но не прерывает текущую итерацию. Пока без понятия, как безболезненно это исправить.

Важные замечания:
NAC предполагает, что все операции, могущие возвращать значение, имеют синтаксис (<операция>,<куда записать значение>, <операнд1>, <операнд n>)
И в этом он глубоко ошибается, потому как не все операции ведут себя подобным образом. Таких операций немного, сейчас не упомню точно. Исключения будут добавлены в ближайшем будущем, пока же такие операции лучше НЕ использовать в качестве операндов.

Кроме того, NAC считает, что все скрипты возвращают значения через reg0. В общем-то, большинство оригинальных скриптов так и поступают.

Код, написанный на NAC, можно вставить в любом месте вашего скрипта (либо действиях менюшки или диалога и тд) следующим образом:
(обычный код),
(обычный код),
NAC([
  <код на NAC>
]),
(обычный код),
...
Операции в NAC отделяются запятыми, как и стандартные операции модульной системы
Внутри NAC-блока не работают большинство стандартных питоновских выражений, поэтому введена функция PEVAL. Код, указанный в качестве аргумента этой функции, интерпретирован питоном в момент компиляции. Например, результатом операции
StoreRandomInRange( ":target", 0, ":a"*10 )
будет
(store_mul, ":target", ":a", 10),
(store_random_in_range, ":target", 0, ":target")
А результатом
StoreRandomInRange(":target", 0, PEVAL(":a"*10))
будет
(store_random_in_range,":target", 0, ":a:a:a:a:a:a:a:a:a:a")
Разница, согласитесь, приципиальна ;)

Далее, внутри NAC-блока можно также писать по старинке, то есть не TroopSetSlot(":trp_daddy", some_slot, some_constant), а (troop_set_slot, some_slot, some_constant). Но такие операции и работают по старому, то есть сделать (troop_set_slot, some_slot, some_constant + ":some_variable") не получится, и компилятор на такой код заматерится.

Установка:
NAC требует python версии 2.6
Узнать установленную у вас версию интерпретатора можно, написав в командной строке (пуск->выполнить) "python". В открывшемся окне в первой строке будет указана версия python. Если это python 2.6.1, 2.6.2, 2.6.3. 2.6.4, 2.6.38123812965018232938912 и так далее, ничего дополнительно качать не нужно. Если же там написано python 2.5.1 (2.5.2, 2.5.n) или python 3.0 (3.1,3.n), следует скачать установщик по ссылке http://python.org/ftp/python/2.6.4/python-2.6.4.msi и установить себе православный python 2.6.4
После того, как с версией питона разобрались, просто копируем содержимое архива с NAC в папку модульной системы и запускаем installnac.bat
Все, NAC установлен.
Теперь вместо файлов module_scripts.py, module_game_menus.py, module_dialogs.py, module_simple_triggers.py, и module_triggers.py вам нужно редактировать соответственно
original_module_scripts.py, original_module_game_menus.py, original_module_dialogs.py, original_module_simple_triggers.py, и original_module_triggers.py. Ах да, я пока не добавил сюда module_mission_templates, но пока мне лень и в следующей версии обещаю исправиться.
Компилируем по старинке, через build_module.bat
После компиляции будут созданы файлы original_module_scripts.py.log, original_module_game_menus.py.log, original_module_dialogs.py.log, original_module_simple_triggers.py.log, и original_module_triggers.py.log, содержащие результаты творимого NAC-ом безобразия. Если в вашем скрипте обнаружен глюк и вы подозреваете, что виноват NAC, просто проверьте адекватность сгенерированного NAC-ом кода, просмотрев соответствующий файл.

В архиве, кстати, содержится файлик hello_world.py. Это стандартный нативовский module_scripts.py с куском NAC-кода в самом начале. Здесь я пока, уставший и голодный, наверняка много чего пропустил, так что, если что-нибудь непонятно, гляньте в этот файлик. Можете его также переименовать в original_module_scripts.py (после установки NAC), скомпилировать, и посмотреть результаты.

В общем, если есть рисковые люди, буду ждать отзывов и мата. Или просто отзывов. Или просто мата.
Качаем: http://slil.ru/28537090
« Последнее редактирование: 29 Июня, 2011, 15:16 от Scarecrow »
  • Сообщений: 44
    • Просмотр профиля
0
« Ответ #1 : 25 Января, 2010, 00:28 »
Так, тестеры валом не повалили, вот странно-то )

Так или иначе, забабахал девятую версию тулзы
http://slil.ru/28541993

Багов пока не обнаружил, потому только новые возможности:
1) Вызов скриптов через ScriptName( список аргументов )
2) Сборка скриптов из нескольких файлов, прописанных в scripts_list.py. Пока не касается менюшек, диалогов, и прочего.
3) Маленький шажок к псевдо-ООП: отныне можно писать "классы".
примерно так:
class Troop(Class):
  def getSlot( self, slot_num ):
    return TroopGetSlot( self, slot_num )
  def getFather( self ):
    return Troop( self.getSlot(slot_troop_father) )

scripts = [
  ("my_dummy_script", [NAC([
     DECLARE("troop",Troop(":troop")),
     Assign(troop, "trp_some_lord"),
     Assign(reg5, troop.getFather().getSlot(slot_troop_son)),
     DisplayMessage( "@the id of the son of his father is {reg5}" )
  ])])
]

Теперь при установке NAC заменяется build_module.bat
Алсо, добавлен файлик Troop.py, содержащий класс Troop с несколькими методами
« Последнее редактирование: 25 Января, 2010, 00:33 от Agrippa »
  • Сообщений: 44
    • Просмотр профиля
0
« Ответ #2 : 29 Января, 2010, 22:56 »
Все-таки обнаружил пару довольно критичных багов, связанных с промежуточными переменными. Исправил (вообще-то переписал всю систему контроля за промежуточными значениями, теперь вероятность появления там ошибок сведена к минимуму), добавил несколько вкусных плюшек, но новую версию выложу только после написания тестового минимода, который одновременно послужит и туториалом. Если кто всё-таки скачал одну из предыдущих - просьба сильно не пинать ногами :embarrassed:
  • Сообщений: 2122
  • За создание технических проектов различного характера
    • Просмотр профиля
0
« Ответ #3 : 02 Февраля, 2010, 08:37 »
Agrippa, ну блин, так всегда.
Только собрался скачать...
Подожду новую версию, но выглядит очень вкусно.
Мундир, кукла, зеленый шарабан, а также опилки, возвращенные минута в минуту конструкторами, подверглись исследованию под электронным микроскопом. Однако ничего, кроме маленькой бирки со словами "Это мы, опилки", найденной в опилках, обнаружено не было.

Текущее настроение: Singing death, death, death, death, devil, devil, evil, evil songs.
  • Сообщений: 47
    • Просмотр профиля
0
« Ответ #4 : 03 Февраля, 2010, 17:01 »
Диствительно интересно ждем новой версии
  • Сообщений: 2740
  • За создание крупных модов и других особо сложных проектов
    • Просмотр профиля
0
« Ответ #5 : 03 Февраля, 2010, 19:50 »
Agrippa,  удобная штучька выгладит неплохо. Ждёмс
  • Ник в M&B: DRZ_Mark7
  • Фракция: Вегиры
  • Сообщений: 2122
  • За создание технических проектов различного характера
    • Просмотр профиля
0
« Ответ #6 : 03 Февраля, 2010, 20:25 »
Наконец, в NAC имеются адекватные конструкции IF/ELSE и FOR, в будущем планирую добавить SWITCH/CASE и еще что-нибудь. К сожалению, BREAK, хоть и имеется, но не прерывает текущую итерацию. Пока без понятия, как безболезненно это исправить.
BREAK силами модульной системы можно изобразить как
(try_for_range, ":i", ":a", ":b"),

(assign, ":b", ":a"), #exit loop
(neq, ":b", ":a"),#break current iteration

(try_end),
Если, конечно, в этом дело...
Мундир, кукла, зеленый шарабан, а также опилки, возвращенные минута в минуту конструкторами, подверглись исследованию под электронным микроскопом. Однако ничего, кроме маленькой бирки со словами "Это мы, опилки", найденной в опилках, обнаружено не было.

Текущее настроение: Singing death, death, death, death, devil, devil, evil, evil songs.
  • Сообщений: 44
    • Просмотр профиля
0
« Ответ #7 : 03 Февраля, 2010, 21:14 »
Наконец, в NAC имеются адекватные конструкции IF/ELSE и FOR, в будущем планирую добавить SWITCH/CASE и еще что-нибудь. К сожалению, BREAK, хоть и имеется, но не прерывает текущую итерацию. Пока без понятия, как безболезненно это исправить.
BREAK силами модульной системы можно изобразить как
(try_for_range, ":i", ":a", ":b"),

(assign, ":b", ":a"), #exit loop
(neq, ":b", ":a"),#break current iteration

(try_end),
Если, конечно, в этом дело...

Так итерация прервется только если операции assign и neq будут находиться вне вложенных блоков (а в иных случаях BREAK, собственно, никому и не нужен), т.е.
(try_for_range, ":i", ":a", ":b"),

  (try_begin),
    <проверка некоего условия>
    (assign, ":b", ":a"),
    (neq, ":b", ":a"),
  (try_end),

<куча операций>

(try_end),

В данном случае итерация не прерывается и код исполняется вплоть до последнего try_end. В принципе, можно
после каждого вложенного блока, в котором встречается BREAK, дописывать
(neq, ":b", ":a"),

Т.е.
(try_for_range, ":i", ":a", ":b"),

  (try_begin),
    <проверка некоего условия>
       (try_begin),
       <проверка другого условия>
       (assign, ":b", ":a"),
       (neq, ":b", ":a"), #проверка 1
       (try_end),
  (neq, ":b", ":a"), #проверка 2
  <куча операций>
  (try_end),
(neq, ":b", ":a"),#проверка 3
<куча операций>
(try_end),
Попробую такой вариант, пожалуй. Т.к после BREAK остаток блока не должен исполняться в любом случае, можно после (assign,":b",":a") дополнительной проверки на их неравенство (т.е. первую проверку в вышеуказанном коде) не проводить (а, если после BREAK все-таки еще код имеется, вывести ошибку либо предупреждение).
« Последнее редактирование: 03 Февраля, 2010, 21:30 от Agrippa »
  • Сообщений: 91
  • За создание технических проектов различного характера
    • Просмотр профиля
    • Profile
0
« Ответ #8 : 23 Февраля, 2014, 16:43 »
У кого нить сохранилось сие чудо? Дайте живую ссылочку. facepalm

СиЧЪ Total War СиЧЪ Total War
Сайт "Всадники Кальрадии" не является СМИ. Администрация не несет ответственность за высказывания и публикацию каких-либо материалов, сделанные любыми пользователями форума, в том числе посредством личных и публичных сообщений. Материалы, размещенные на ресурсе третьими лицами, могут содержать информацию, не предназначенную для лиц, не достигнувших совершеннолетия. При обнаружении на ресурсе материалов, нарушающих законодательство Российской Федерации, необходимо обращаться к администрации.
Сайт работает на быстром VPS/VDS хостинге от FASTVPS


Powered by SMF 2.0 | SMF © Simple Machines LLC