Версия парсера: 0.5.0.6 Входные параметры =================== NxtParser [script_file] [label] Если указан первый параметр, парсер загружает этот скрипт. Если указан второй, прыгает на метку с таким именем. Входные параметры игнорируются, если в ini-файле указан параметр Script. Ini-файл =================== При запуске NxtParser ищет в директории с приложением файл "NxtParser.ini". Если вы переименуете приложение, например, в MyNovel.exe, оно станет искать файл "MyNovel.ini". В этом файле поддерживаются следующие параметры: Script=script_filename EntryPoint=label_name Позволяет задать имя файла скрипта для автозагрузки. Если скрипт задан, параметры командной строки NxtParser игнорируются, и приложение всегда загружает указанный скрипт, начиная исполнение с указанной метки или с начала файла, если метка не указана. Fullscreen=[true/false] Если установлено в True, приложение запустится сразу в полноэкранном режиме. Менять режим можно комбинацией клавиш Alt+Enter. DisplayFps=[true/false] Если установлено в True, приложение будет отображать в правом верхнем углу экрана текущие FPS и среднее время отрисовки кадра. Debug=[true/false] Если установлено в True, в меню программы появятся дополнительные отладочные опции и инструменты. ShowScriptOnStartup=[true/false] ShowToolsOnStartup=[true/false] ShowConsoleOnStartup=[true/false] Если Debug установлено в True, эти параметры влияют на отображение скрипта, панели отладочных инструментов и отладочной консоли при старте программы. Показывать/скрывать эти панели можно из меню программы. LogFilename=filename Если эта опция присутствует и указано имя файла, все отладочные сообщения, выводящиеся на консоль, будут также сохраняться в этот текстовый файл. Для работы этой опции необязательна установка Debug в True. Scramble=[0-255] Если задано, устанавливает байт шифрования (смотри раздел "Скрамблинг"). Скрамблинг =================== Для того, чтобы игрок не мог легко посмотреть содержимое скрипта, используется шифрование текста. В настоящей версии шифрование довольно простое: это XOR с указанным числом. Процесс шифрования называется "скрамблинг". Разработку и отладку игры следует вести в расшированном виде. Когда готовый продукт оформляется для выпуска, следует зашифровать все файлы скрипта при помощи утилиты Scrambler: Scrambler.exe [file2.nxt] [file3.nxt] ... Утилита генерирует рядом с исходными файлами новые, с расширением nxs. Эти файлы зашифрованы указанным ключом. Их следует класть вместо nxt-файлов в финальную сборку игры. Чтобы парсер мог загрузить такие зашифрованные скрипты, ключ нужно указать в ini-файле парсера: Scramble=scramble_byte При загрузке файла скрипта, будь то первоначальная загрузка или включение одного файла в другой с помощью @include, парсер сначала ищет расшифрованный файл с расширением nxt. Если такой существует, парсер использует его. Иначе выполняется поиск зашифрованного файла с расширением nxs. Таким образом, в командах @include и в других местах не следует специально указывать расширение nxs вместо nxt, даже если вы планируете впоследствии шифровать ваш скрипт. Всегда ссылайтесь на файлы только по расширению nxt, преобразование будет выполнено автоматически. Единственное исключение - параметр Script внутри ini-файла программы. Хотя в нём также можно продолжать указывать файл с nxt-расширением, для опрятности можно указать и nxs. Формат данных =================== Везде, где нужно указать значение цвета, можно использовать одно из следующего: - HTML-цвета и синонимы (black, maroon, green, olive, navy, purple, teal, gray, silver, red, lime, yellow, blue, fuchsia, magenta, aqua, cyan, white). - X11-цвета (http://en.wikipedia.org/wiki/X11_color_names). Для четырёх цветов, которые в X11 и HTML отличаются, можно использовать альясы x11gray, x11green, x11maroon, x11purple. - BGR-тройки в формате $BBGGRR, например: $FF0000 (blue), $00FF00 (green), $0000FF (red). - RGB-тройки в формате 0xRRGGBB, например: 0x0000FF (blue), 0x00FF00 (green), 0xFF0000 (red). Везде, где нужно указывать размер шрифта, можно использовать: - Один из предустановленных размеров (Tiny, Small, Normal, Large, Huge). - Число, стандартный размер шрифта Windows. Везде, где нужно указать интервал в миллисекундах, можно указывать "now" (ноль). Везде, где нужно указать громкость, можно указывать "off" (0), "min" (1) и "max" (255). Везде, где нужно указать значение прозрачности (0-255), можно указывать "transparent" (0) и "opaque" (255). Ресурсы новеллы =================== Игровые ресурсы следует располагать в подпапках той папки, где находится исходный скрипт программы. Используются следующие подпапки: \images - для всех рисунков, включая фоны, позы персонажей, объекты, курсоры и подложки окна выбора/вывода текста. Поддерживаются форматы: bmp, jpg, png. Везде, где требуется указать имя рисунка, можно (а в некоторых командах даже необходимо) опускать расширение, оставляя только имя файла. Подходящее расширение будет найдено автоматически. \sound - для звуков, упоминающихся в командах @sound, @bgsound. Поддерживаются форматы: wav, mp3, flac, aif, ogg. Везде, где требуется указать имя звука, необходимо опускать расширение, оставляя только имя файла. Подходящее расширение будет найдено автоматически. \music - для музыки, упоминающейся в команде @bgmusic Поддерживаются форматы: mp3, ogg. Везде, где требуется указать имя мелодии, необходимо опускать расширение, оставляя только имя файла. Подходящее расширение будет найдено автоматически. \fonts - для шрифтов, использующихся в игре. Поддерживаются форматы: ttf, otf. Все шрифты из папки fonts автоматически регистрируются при загрузке скрипта, и доступны в скрипте по их внутренним именам. Кодификаторы =================== В папке \images можно создать файл _images.code. Если файл найден, парсер прочитает из него конфигурацию изображений. Формат файла следующий: [section] line line [section] line Поддерживаются секции SETTINGS и ALIASES, прочие секции игнорируются. В секции SETTINGS записи имеют вид: filename, transparent_color, frame_width, frame_height, animation_speed Здесь filename - имя файла рисунка, transparent_color - прозрачный цвет в нём, frame_width и frame_height - размеры кадра на полотне для многокадровых анимаций, animation_speed - время в микросекундах на показ одного кадра анимации. Любые параметры, не считая первого, могут быть опущены. В качестве любого параметра может быть указана пустая строка. Опущенные параметры полагаются по умолчанию. Например, допустимо написать: filename (нет конфигурации) filename,,,frame_height (файл состоит из столбика кадров, высота одного кадра - frame_height) filename,white,,, (у файла белый прозрачный фон) filename,white (то же самое) Допускается определять лишь одну запись для одного значения filename. Если указано несколько, использоваться будет каждый раз какая-то одна. В секции ALIASES записи имеют вид: alias=[subpath\]filename.ext Здесь alias - используемый в игровом скрипте псевдоним файла картинки. Обычно псевдоним превращается в имя файла путём добавления подходящего расширения (то есть такого, файл с каким существует в \images). Однако, если запись в ALIASES прямо переназначает псевдоним другому файлу, загружен будет именно он. Таким образом, можно вынести часть файлов из images в подпапки этой папки. Внутри подпапок файлов _images.code быть не должно, они не будут прочитаны. Кроме того, система альясов позволяет устанавливать разные конфигурации для одного рисунка. Записи в секции SETTINGS ищутся в первую очередь по альясу, и только потом по имени файла. Например, можно записать такой кодификатор: [SETTINGS] animation_fast,,,,10 animation_slow,,,,50 [ALIASES] animation_fast=animation.png animation_slow=animation.png Теперь, указывая в игровом скрипте рисунок animation_fast, мы получим быстро проигрывающуюся анимацию, а указывая animation_slow - медленно проигрывающуюся. Общий формат скрипта =================== // - комментарий # - метка @ - команда Вывод текста =================== :- Строка 1. Строка 2. Строка 3. -: Авторский текст и реплики героев поддерживают команды разметки: **Текст** жирный текст ~~Текст~~ курсив --Текст-- зачёркнутый __Текст__ подчёркнутый \++++ каждый плюс увеличивает размер шрифта на два \= восстанавливает исходный размер шрифта \c:[цвет]: устанавливает цвет текста \c:: восстанавливает исходный цвет текста \s:[размер]: устанавливает размер шрифта \s:: восстанавливает исходный размер шрифта \f:[шрифт]: устанавливает шрифт по его внутреннему имени \f:: восстанавливает исходный шрифт \n новая строка \\ символ \ \% символ % %var% значение переменной var %:var% значение параметра текущей функции с названием var %:1% значение первого параметра текущей функции (работает и для других чисел) Например: Жила-была \c:red:Красная\c:: шапочка. Села Машенька на \+++большой\= стульчик - неудобно сидеть. Села на стульчик \++поменьше\= - всё равно неудобно. Не злоупотребляйте эффектами. Хотя рендер эффектов, в общем, довольно быстрый, а парсинг производится лишь однажды на строку. Реплики героев =================== Герой (спрайт[, положение]): Текст. Спрайт - это картинка героя, с которой тот появляется на экране. Картинки именуются русскими буквами, осмысленно, например "обижен", "удивлён". Регистрация картинок производится с помощью команды @pose, подробнее о которой в разделе "Персонажи". Слову "невидим" обычно назначают действие "убрать героя с экрана" (invisible). Положение - это позиция героя на экране. Позиции также именуются русскими буквами, например: "слева", "справа", "по центру". Регистрация позиций производится с помощью команды @position. Можно просто показать или убрать героя без вывода текста: Герой (спрайт[, положение]). (В конце стоит точка). Можно произнести несколько строк: Герой ([...]):- Фраза 1. Фраза 2. -: Можно не открывать скобок или опустить в них какие-то параметры. Если героя ещё нет на экране, он появится, а в качестве опущенных параметров будут использованы параметры по умолчанию - спрайт "" (пустая строка) и одно из нескольких положений, объявленных как стандартные (default): Герой: Текст. Герой (спрайт): Текст. Герой. Герой (спрайт). Если герой уже присутствует на экране, его положение и/или поза не изменятся. Когда вы указываете герою занять некоторое положение, предыдущий герой, занимавший это положение, автоматически его освобождает. Когда вы отображаете на экране героя без указания положения, и парсер сам выбирает одно из стандартных положений для героя, а все стандартные положения заняты, какое-то из них будет освобождено. Такая логика позволяет вам не заботиться о положениях героев, если они вам безразличны. Например, допустим, что вы зарегистрировали одно стандартное положение и написали следующий диалог: Вася: Привет, Петя! Петя: Друг мой Вася, здравствуй! Вася: Как дела твои, Петя? Петя: Прекрасно, а твои как, Вася? При проигрывании герои будут появляться на единственном стандартном положении по очереди, замещая друг друга. Если вы объявите второе стандартное положение, герои займут каждый одно из положений и будут оставаться весь диалог на экране. Формат команды =================== @command param1, param2, param3 Пробелы по краям параметра игнорируются (<@cmd param1 ,param2> превращается в <@cmd param1, param2>). Пробелы внутри - не игнорируются (У <@cmd param 1, param2> первый параметр - ). Оборачивая слова в кавычки, можно сохранить пробелы (У <@cmd " ", " "> оба параметра - " "). В параметрах команды допускается использовать следующие спецсимволы: \\ символ \ \% символ % %var% значение переменной var %:var% значение параметра текущей функции с названием var %:1% значение первого параметра текущей функции (работает и для других чисел) Общие команды ================= @reset - устанавливает состояние всего в "по умолчанию", не сбрасывая, однако, переменных и скрипта. @include script_file - включает содержимое файла в этом месте скрипта @wait ticks - ждёт столько микросекунд @waitclk - ждёт нажатия клавиши (как будто выведен текст) @repaint off - выключает перерисовку изменений. Все последующие команды не будут обновлять картинку на экране, пока не будет явно подана "repaint on" или какая-то команда не включит перерисовку неявно. Перерисовка включается, в том числе: когда требуется ввод действий пользователя (ожидание щелчка, активация меню, новая строка текста). @repaint on - включает перерисовку и перерисовывает все изменения прямо сейчас. Если перерисовка и так была включена, ничего не выполняется. @repaint - безусловно перерисовывает все изменения прямо сейчас (нужно, если какие-то изменения не успевают примениться, как уже затираются другими). Автоматически включает перерисовку. Бэкграунд ========================= @bgcolor color - задаёт цвет подложки. Подложка видна, если двигать фоновую картинку. @bg bg_name - устанавливает картинку фоном, сбрасывая все эффекты (центрирование, приближение), удаляя объекты и скрывая персонажей. Сразу перерисовывает её. В качестве bg_name указывается имя картинки. Обычно это имя файла картинки без расширения, но возможно переназначение таких имён другим файлам (смотри раздел "Кодификаторы") @bg color - устанавливает фоном цвет и удаляет картинку. Эквивалентно @bgcolor color с последующим @bg none. @bg none - удаляет любой фон. Становится виден bgcolor. @bgpic bg_name - устанавливает картинку фоном, не меняя эффекты. Не перерисовывает картинки. @bgpic color - устанавливает фоном цвет. @bgpic none - удаляет любой фон. То же, что "@bg none". Существует для единообразия. @bgfit - устанавливает режим "подгонки". 100% задника - это залитый полный экран. @bgfree - устанавливает режим "свободного задника". 100% задника - это его оригинальный размер. @bgpos x, y[, time] - устанавливает координаты точки картинки, которая будет находиться в центре экрана. Если указан параметр time, будет выполнено плавное изменение текущего центра на новый за time миллисекунд. В качестве time можно указать now, это равносильно нулю. Задержки на время анимации выполнено не будет: если хотите дождаться завершения анимации, выполните любой вид @wait вручную. @bgalpha alpha[, time] - устанавливает прозрачность картинки alpha. Прозрачность задаётся (0-255), сквозь картинку видно цвет подложки. @bgzoom z[, time] - устанавливает приближение картинки z. Приближение задаётся в целых процентах. @bgtint color, alpha[, time] - устанавливает полупрозрачную цветовую заливку поверх текущего задника. Музыка и звуки ======================= @bgmusic silence - ничего не проигрывает @bgmusic none - то же @bgmusic music_name - проигрывает музыку циклично на заднем плане. В качестве music_name указывается название файла музыки без расширения. @bgmusic music_name, time - устанавливает новую музыку за время time. Старая музыка постепенно затихает, а новая появляется. @bgmusic music_name, time, volume - устанавливает ещё и громкость [0-255] @bgmusicvol volume[, time] - устанавливает новую громкость для текущей музыки заднего плана. Если указано время, музыка наберёт указанную громкость постепенно. @bgsound silence - прекращает цикличный звук заднего плана @bgsound none - то же @bgsound sound_name [, time] - устанавливает цикличный звук на заднем плане. Если указано время, звук будет заменён постепенно. В качестве sound_name указывается название файла звука без расширения. @bgsound sound_name, time, volume[, effect] - устанавливает звук с эффектом и громкостью. Громкость задаётся [0-255]. Поддерживаемые эффекты: пустая строка: без эффекта once: звук будет проигран однократно, затем прекратится @bgsoundvol volume[, time] - устанавливает новую громкость для текущего звука заднего плана. Если указано время, звук наберёт указанную громкость постепенно. @bgsoundch channel, silence - прекращает звук на указанном звуковом канале. Доступно четыре канала (0-3). Нулевой канал - тот, что используется в bgsound/bgsoundvol. @bgsoundch all, silence - прекращает звук на всех каналах. @bgsoundch channel, time, volume, effect - устанавливает звук на канале с эффектом и громкостью. Параметры опциональны, значения параметров такие же, как в bgsound. @bgsoundchvol channel, volume[, time] - изменяет громкость звука на выбранном канале. Аналогично bgsoundvol. @sound sound_name, effect, volume, wait - разовое проигрывание звука. Звук будет проигран синхронно, пока не кончится, или пока не истечёт интервал wait, который задаётся в микросекундах. В качестве wait можно указать "waitend" - ждать окончания звука, и "nowait" - вообще не ждать звука, а только запустить его и сразу продолжить. В последнем случае sound эквивалентен bgsound once (но не прерывает его!). По умолчанию wait равно половине секунды. Громкость задаётся [0-255]. Поддерживаемые эффекты: пустая строка: без эффекта cut: прервать звук, когда истечёт таймаут ожидания. Иначе звук будет продолжаться до завершения асинхронно. Например: ждёт не больше полсекунды. Если звук не успел завершиться, обрубает его и продолжает игру. ждёт не больше полсекунды. Если звук не успел завершиться, он продолжится асихнронно, параллельно с игрой. ждёт окончания звука, сколько бы это не заняло. Окно вывода текста ===================== @font font_name[, size[, color]] - устанавливает шрифт панели текста. Шрифт либо системный, либо файл с ним должен лежать в папке fonts. @fontsize size - меняет размер шрифта @fontsz size - то же, что fontsize @fontcolor color - меняет цвет шрифта @charfont font_name, size - устанавливает шрифт слов персонажа И ОДНОВРЕМЕННО шрифт имени персонажа. @charfontsize - аналогично @charfontsz - аналогично @charfontcolor - аналогично @namefont font_name, size - устанавливает шрифт имени персонажа. @namefontsize - аналогично @namefontsz - аналогично @namefontcolor - аналогично @selfont font_name[, size[, color]] - устанавливает шрифт окна выбора варианта. @selfontsize size - аналогично @selfontsz size - аналогично @selfontcolor color - аналогично @showtw - показывает окно с текстом @showtext - то же, что showtw @hidetw - скрывает окно с текстом @hidetext - то же, что Стилизация окна с текстом: @twcolor - задаёт цвет окна с текстом @settwcolor - то же, deprecated @twalpha - задаёт прозрачность (0-255) @settwalpha - то же, deprecated @twpic imgname.ext - устанавливает картинку для окна с текстом. Положение окна с текстом: @twpos left, top, right, bottom - устанавливает положение окна с текстом @settwpos - то же, deprecated @twmargin margin - устанавливает отступ текста от границ окна @twmargin width, height - вертикальный и горизонтаньный отступы отдельно @twmargin left, top, right, bottom - отступ с каждой стороны отдельно @twtextpos left, top, right, bottom - устанавливает рамку для авторского текста (относительно окна с текстом). Взаимозаменяемо с twmargin, но устанавливается в других величинах (координаты, а не поля). Иными словами, @twmargin 10, 20, 30, 40 - это @twtextpos 10, 20, tw_width-30, tw_height-40. Если рамки для имени и текста персонажей не переопределены, как будет описано ниже, они выбираются автоматически непересекающимися внутри поля для авторского текста. При изменении размера окна текста с помощью @twpos, рамка авторского текста сохраняется в формате margin (сжимается при сжатии окна текста). @twnamepos left, top, right, bottom - устанавливает рамку для имени (относительно окна с текстом) @twnamepos auto - восстанавливает для имени рамку по умолчанию @twchartextpos left, top, right, bottom - устанавливает рамку для текста персонажа (относительно окна с текстом) @twchartextpos auto - восстанавливает для текста персонажа рамку по умолчанию При изменении размера окна текста с помощью @twpos, переопределённые рамки сохраняются без изменений (не сжимаются при сжатии). Автоматические рамки, разумеется, изменяются автоматически. Стилизация окна со вариантами выбора @selcolor - задаёт цвет окна с вариантами выбора @selalpha - задаёт прозрачность (0-255) @selmargin margin - устанавливает отступ текста от границ окна (допускаются аналогичные twmargin варианты вызова) @selpic imgname.ext - устанавливает картинку для окна @selhlcolor color - устанавливает цвет выбранного элемента окна Курсоры: @cursor set, imgname - устанавливает анимированный курсор текста. @cursor none - выключает анимированный курсор @selcursor1 set, imgname - устанавливает левый анимированный курсор для окна выбора. @selcursor1 none - выключает анимированный курсор @selcursor2 set, imgname - устанавливает правый анимированный курсор для окна выбора. @selcursor2 none - выключает анимированный курсор @mousecursor set, imgname - устанавливает мышиный курсор @mousecursor none - включает мышиный курсор по умолчанию (курсор местной операционной системы) Персонажи =============== @hidechars - скрывает всех персонажей с экрана. Это же автоматически выполняется некоторыми другими командами (например, bg). @resetchars - удаляет весь реестр актёров, их поз и положений @actors clear - удаляет весь реестр актёров и их поз. Это автоматически убирает всех персонажей с экрана. @actor name - объявляет актёра с указанным именем @poses actor, clear - удаляет все позы для персонажа @pose actor, pose, filename[, transp_color] - добавляет в список поз актёра указанную. Для неё будет использоваться указанный файл, с указанным цветом прозрачности. Можно использовать пустой параметр в качестве позы, это дефолтная поза (без указания). //@pose actor, pose,,,invisible - применение этой позы уберёт персонаж с экрана, но сохранит за ним место в разговоре. Иными словами, повторные упоминания персонажа не вернут его на экран. //@pose actor, pose,,,off - применение этой позы уберёт персонаж с экрана и из разговора. Повторное упоминание персонажа вернёт его на экран. @positions clear - удаляет весь реестр положений. Это автоматически убирает всех персонажей с экрана. @positions default - восстанавливает реестр положений "по умолчанию", который автоматически создаётся при запуске парсера. Реестр положений "по умолчанию" содержит некоторое количество безымянных положений. Нельзя выбрать одно из них, но если не указывать положения, они будут использоваться. @position posname,cx,cy - добавляет положение posname. CX, CY - координаты центра рисунка. В качестве координат можно указать специальные команды, располагающие персонажа относительно сторон экрана. На месте CX: left, right, center. На месте CY: top, bottom, center. В качестве имени можно указать пустую строку, причём таких позиций можно зарегистрировать несколько. Все они автоматически будут позициями "по умолчанию", отменить это нельзя. //Не сделано, но ожидается: //Flip - настройки отражения, доступны следующие: // "" (пустая строка) - отображать без изменений. // flipv - отразить вертикально. // fliph - отразить горизонтально. //Rot - настройки поворота, доступны следующие: // "" (пустая строка) - отображать без изменений. // rot90, rot180, rot270 - повернуть на указанный угол по часовой стрелке. @position posname,default - добавляет уже созданную позицию в список позиций "по умолчанию". @position posname,nodefault - убирает позицию из списка позиций "по умолчанию". Безымянные позиции нельзя убрать из списка "по умолчанию". Главы ========= @chapter chapter_name, chapter_subtitle - показывает заголовок новой главы и задерживается на несколько секунд @scene scene_name - устанавливает название сцены для сохранений @section scene_name - то же самое Переходы ============= @goto label - переходит на метку @call label - вызывает процедуру, переходя на метку @return - возврашается из процедуры @return label - возвращается из процедуры на новую метку Меню ========== @item text, label - добавляет элемент в будущее меню @menu run - показывает меню, даёт сделать выбор, перескакивает на нужную метку и сбрасывает меню Экранные объекты ===================== Движок позволяет показывать на экране различные объекты, с которыми игрок может взаимодействовать - например, дополнительные картинки или кнопки. С их помощью можно устраивать игровое меню, добавлять в игру интерактивность. @drop - удаляет все объекты с экрана. Это же случается автоматически при некоторых других командах, например, @bg. @drop obj - удаляет объект с именем "obj" @image, @img @img obj[,file.ext],x,y - добавляет рисунок из файла file.ext по виртуальным координатам x, y. Имя объекта устанавливается в "obj". Если файл с рисунком не задан, будет выполнен поиск файла "obj.ext" c различными расширениями. @img obj,file.ext,x,y[,color] - добавляет рисунок. Если рисунок поддерживает прозрачный цвет, то прозрачным станет цвет color. Рисунки никак не реагируют на действия пользователя. Они просто отображаются на экране. @button, @btn @button obj[,file.ext],x,y,label - добавляет кнопку по виртуальным координатам x, y. При нажатии на кнопку будет выполнен переход на метку label. @button obj,file.ext,x,y,color,label - добавляет кнопку с прозрачным цветом. Изображение для кнопки должно состоять из четырёх картинок равной ширины, скленных вместе по горизонтали. Первая картинка - кнопка, вторая - кнопка нажатая, третья - подсвеченная, четвёртая - выключенная. @choose - ждёт, пока пользователь не нажмёт на одну из предложенных кнопок. Осторожно: если кнопок нет, играть дальше невозможно! Отличие от обычного режима в том, что нельзя щёлкнуть на свободном месте экрана и перейти на следующую текстовую строку. Конфигурация и переменные =============================== Пока NxtParser поддерживает только целые числовые и булевские переменные. Работа с ними описана в разделе "Арифметика". Различаются два вида переменных: - Глобальные переменные: относящиеся к игре в целом. Такие переменные сохраняются при перезапуске игры, даже при выходе из программы. - Локальные переменные: относящиеся к текущему прохождению игры. При начале новой игры они будут сброшены. Глобальные переменные хранятся в системном файле, который заводится для текущего пользователя и для текущей игры. Они автоматически загружаются при указании имени продукта (@product) и сохраняются при выходе, если имя продукта было указано. Локальные переменные будут сохраняться в save-файлах игры и восстанавливаться при их загрузке. Пока это не реализовано. Глобальные и локальные переменные отличаются префиксом названия. Глобальные переменные начинаются с буквы "g" любого регистра. Локальные начинаются с любых других букв. @product ["Company name", ]"Product name" - устанавливает имя компании-производителя и название текущей игры. Эти данные используются для того, чтобы хранить конфигурацию и глобальные переменные игры. Данные игры хранятся в папке "%APPDATA%\Company name\Product name". При исполнении команды @product будут автоматически загружены текущая конфигурация и глобальные переменные иры, если они найдены. Локальные переменные будут сброшены. @clearglobals - сбрасывает все переменные игры, как глобальные, так и локальные. При этом выполняется сохранение глобальных переменных. @clearlocals - сбрасывает локальные переменные игры. Эту функцию можно вызывать, например, при старте новой ветки. @saveglobals - сохраняет глобальные переменные игры. Необязательно вызывать эту функцию: переменные сохраняются автоматически по мере необходимости. Если @product не был выполнен, функция завершится с ошибкой. @loadglobals - загружает глобальные переменные игры. При этом уничтожаются локальные переменные. Необязательно вызывать эту функцию: переменные загружаются самостоятельно в момент выполнения @product. Если @product не был выполнен, функция завершится с ошибкой. Арифметика ================= @set var_name, value - устанавливает значение переменной @set var_name - то же, что @set var_name, true @clear var_name - то же, что @set var_name, false @inc var_name, value - прибавляет value к переменной @inc var_name - то же, что @inc var_name, 1 @dec var_name, value - вычитает value из переменной @dec var_name - то же, что @dec var_name, 1 @define var_name - то же, что @set var_name, true @undef var_name - удаляет переменную из списка, так что та становится неопределан @ifdef var_name, [command] - исполняет команду, если переменная var_name определена @ifndef var_name, [command] - исполняет команду, если переменная var_name не определена @if bool_expr, [command] - исполняет команду, если верно условие Возможные условия: var {>, <, =, >=, <=, !=} var var (верно, если var > 0) !var Здесь var значит либо число, либо true/false, либо имя переменной. Например: @if var1 >= 5, goto label1 @if 0 < 9, setcharfont "Verdana", 10, red @if !false, bg black Блоковый ifdef/ifndef: @ifdef VAR @else @endif Блоковый if: @if condition @elseif condition @else @endif