# Выражения сценария

При написании сценариев naninovel можно вводить конструкции выражений в значения параметров команд и общие текстовые строки с помощью фигурных скобок {}:

One plus two equals {1 + 2}.

— выведет "One plus two equals 3" при исполнении сценария.

Вы можете использовать любые математические и логические операторы, а также все математические функции из пространств имён UnityEngine.Mathf и System.Math:

@char Kohaku scale:{Pow(Cosh(33.5), 3) % Log(0.5)}

– будет масштабировать персонажа с ID "Kohaku" со значением от деления гиперболического косинуса угла в 33,5 °, возведённого в третью степень, на натуральный логарифм от 0,5.

Выражение вычисляется в момент выполнения команды, что позволяет использовать пользовательские переменные внутри выражений:

@input color summary:"What's your favorite color?"
@stop
{color}, huh? { color == "orange" ? "Mine too!" : "I see..."}

— выведет пользовательский интерфейс ввода, позволяющий игроку ввести свой любимый цвет, назначив его пользовательской переменной color, а затем распечатать введенный цвет, а затем либо "Mine too!" – на случай, если это "orange", или же "I see...".

Чтобы отличить обычное текстовое значение от имени переменной, заключите его в двойные кавычки ":

This is just a plain text: { "score" }.
And this is the value of "score" variable: { score }.

Если вы хотите включить двойные кавычки в выражение, экранируйте их дважды:

Saying { \\"Stop the car\\" } was a mistake.

Выражения сценария с использованием команд @set и @if (а также set и if параметры в других командах) не требуют фигурных скобок:

@set randomScore=Random(-100,100)
@goto EpicLabel if:Abs(randomScore)>=50

Однако, как и во всех других значениях параметров, если вы хотите использовать пробелы внутри выражений, вам следует заключить их в двойные кавычки:

@set "randomScore = Random(-100, 100)"
@goto EpicLabel if:"Abs(randomScore) >= 50"

Чтобы напечатать фигурные скобки внутри общей текстовой строки и предотвратить их распознавание как начальных и конечных литералов выражения, экранируйте фигурные скобки с помощью обратной косой черты, например:

Some text \{ text inside braces \}

— напечатает "Some text { text inside braces }" в игре.

# Функции выражений

Внутри выражений сценария также можно использовать следующие функции.

Сигнатура? Описание Пример
Random (System.Double min, System.Double max) Возвращает случайное число с плавающей точкой между минимальным [включительно] и максимальным [включительно] значениями. Random(0.1, 0.85)
Random (System.Int32 min, System.Int32 max) Возвращает случайное целое число между минимальным [включительно] и максимальным [включительно] значениями. Random(0, 100)
Random (System.String[] args) Возвращает одну случайную из предоставленных строк. Random("Foo", "Bar", "Foobar")
CalculateProgress () Возвращает число с плавающей точкой в диапазоне от 0.0 до 1.0, представляющее, сколько уникальных команд было когда-либо выполнено по сравнению с общим числом команд во всех доступных скриптах Naninovel. 1.0 означает, что игрок прочитал или увидел весь доступный игровой контент. Перед использованием этой функции убедитесь, что в меню конфигурации скрипта включена функция Count Total Commands. CalculateProgress()

# Добавление пользовательских функций

Можно добавить пользовательские функции выражений, присваивая атрибут ExpressionFunctions статическому классу C#. Все открытые методы этого класса с совместимыми сигнатурами будут автоматически доступны в выражениях сценария.

Совместимые подписи – это те, которые принимают и возвращают простые и строковые типы, а также массивы этих типов (с ключевым словом params).

[Naninovel.ExpressionFunctions]
public static class CustomFunctions
{
	// Возвращает предоставленную строку, конвертировав все её символы в нижний регистр.
    public static string ToLower (string content) => content.ToLower();

    // Возвращает сумму предоставленных чисел.
    public static int Add (int a, int b) => a + b;

    // Возвращает одну случайную из предоставленных строк.
    public static string Random (params string[] args) 
	{
		if (args == null || args.Length == 0) 
			return default;
        
        var randomIndex = UnityEngine.Random.Range(0, args.Length);
		return args[randomIndex];
	} 
}

ПРИМЕР

Другой пример добавления пользовательских функций выражений для проверки наличия элемента в инвентаре можно найти в проекте пример инвентаря на GitHub.

В частности, пользовательские функции реализуются через сценарий выполнения Inventory Functions.cs.

Обновлено: October 28, 2020