Вечер добрый
Я тут сварганил дополнение к модульной системе и хочу теперь обзавестись парочкой тестеров ) Один я буду оооочень долго всё тестить.
Вкратце, тулза (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