Это незаконченный документ!
NetherScript 2.0 - это настраиваемый парсер, написанный на QuakeC. Файлы, написанные на скрипте NetherScript 2.0 обычно имеют расширение NS2. Язык NetherScript состоит из общих инструкций (инструкции прекомпилятора) и предметных инструкций.
Общие инструкции являются частью ядра NetherScript и работают одинаково для всех, они управляют ходом обработки документа. С помощью общих инструкций можно выносить в шаблоны часто используемый код, разбить файл скрипта на несколько файлов, изменить ход выполнения обработки и произвести другие трюки. Вcе общие инструкции начинаются с символа «#»
Предметные инструкции определяются в коде QuakeC в зависимости от области, для которой настраивается парсер. Таким образом одно ядро NetherScript может обслуживать неограниченное число предметных областей самых разный типов. Например в Arcade Quake на нем описывается интерфейс меню, хад, монстры, предметы, оружие. В данной статье такие инструкции описаны не будут.
Весь исходный текст подразделяется на сущности двух видов - слова и строки. Строки разделяются между собой символом возврата каретки, а слова при разделении подчиняются следующим правилам:
Внимание! Многострочный комментарий вида /* */ не поддерживается! Используйте вместо него условие #if 0 … #endif (см п.6)
#include имя_файла
Подключает содержание файла к процессу парсинга. В имени файла можно указывать добавочные пути (например monsters/soldier.ns2), но нельзя указывать относительные пути. (например ../monsters.ns2).
Другие правила:
префикс './' к имени файла заставит парсер искать файл в той же папке, что и текущий файл параметр вида <имя файла> - означает что инклюдится системный файл, и искать его парсер будет в каталоге script/system/ в любом другом случае проверять файл парсер будет в папке scripts/
Пример использования #include:
#include "./my_defs.ns2" #include "my_defs.ns2" #include "monsters/mynewmonster.ns2" #include "<my_defs.ns2>"
Ограничения:
Макс. 64 подключения файлов (включая начальный)
Константы используются для вставки в код готовых шаблонов. Чтобы вставить константу в произвольное место кода, нужно использовать синтаксис [имя_константы]. Самый простой пример использования констант:
#define true 1 #define false 2 // Вместо [true] и [false] обработчик кода увидит 1 и 0 MonsterClass MySoldier { health 40 cantaketamage [true] deathobituary [false] }
Константы типа #define при вставке сохраняют свою структуру слов:
// Вместо [true] и [false] обработчик кода увидит 1 и 0 #define defMySoldier MonsterClass MySoldier [defMySoldier] { health 40 cantaketamage 1 deathobituary 0 deathstring "You have killed my soldier!" }
Но если определить константу с помощью инструкции #defword, то она при вставке будет представлять из себя одно слово
// Вместо [true] и [false] обработчик кода увидит 1 и 0 #defword mySoldierDeathMessage You have killed my soldier! // еще можно описать константу так: // #define mySoldierDeathMessage "You have killed my soldier!" MonsterClass MySoldier { health 40 cantaketamage 0 deathobituary 1 deathstring [mySoldierDeathMessage] }
+
#define имя_константы (параметр1, параметр2...параметр16) текст_константы #define имя_константы текст_константы #const имя_константы(параметр1,параметр2...) текст_константы #const имя_константы текст_константы #undef имя_константы_или_макрокоманды #redef #redefword #undefall
Ограничения: * макс. параметров: 16 * макс. длина имени параметра: 32 символа
То же самое, что и #define, но для использования в коде нужно использовать синтаксис @имя_макро_команды(параметры). Сделана для удобочитаемости кода. Имя макрофункции может совпадать с именем константы, объявленной через #define/#defword
#macro имя_константы(параметр1,параметр2...) содержание #macro имя_константы содержание #macroword имя_константы(параметр1,параметр2...) содержание #macroword имя_константы содержание
#enum int { ... } #enum flags { ... }
#if значение ... #elseif значение ... #else ... #endif #ifdef значение ... #goto метка #label имя_метки #skip количество words #skip колколичество lines #eof
#pragma параметр значение #pragma precompiler on/off #pragma warnings 0/1/2/3 #pragma debug 0/1 #pragma debugmessages 0/1 #pragma labels_on_failed_ifs 0/1
#message сообщение #error сообщение #warning сообщение #debug сообщение #printdef имя_константы #printmacro имя_макрокоманды
@true @on @false @off @random @random(x,y) @crandom @chance(x) @defined(n) @equal(x,y) @bitand(x,y) @bitor(x,y) @label_list @define_list