Перейти к содержанию

Синтаксис и лексика

Структура файла

Файл .fs — это последовательность деклараций верхнего уровня: триггеры (on ...:), команды (command ...:), функции (function ...:) и объявления глобалов ($name = ...). Пустые строки игнорируются.

Блоки выделяются отступом (4 пробела, табуляция = 4) и двоеточием:

command kit:
    if #kit-ready == false:
        message "Your kit is still cooling down."
        stop
    give "DIAMOND" 3

Отступы внутри скобок ()[]{} игнорируются — длинные вызовы можно переносить. Обратный слэш в конце строки — продолжение строки.

Комментарии

# начинает комментарий, но #имя без пробела — это player-переменная:

# Это комментарий
#visits = #visits + 1   # а это код: переменная #visits
message "hi" # комментарий после кода завершает строку

Правило простое: # + буква сразу = переменная, # + пробел/конец = комментарий. Конечный комментарий после кода работает как перевод строки.

Литералы

Вид Примеры
Число (number, всегда double) 0, 3, 7.5, .5
Текст (text) "hi", "Healed " + target, escapes \n \t \" \\
Логический (boolean) true, false
Пусто (null) null — литерал, не переменная

is — синоним ==, включая проверку на null: if victim is null:.

Переменные

Запись Область Пример
name Локальная (объявляется через let) let victim = player(target)
$name Глобальная, видна всем скриптам $server-started = 1
#name Per-player, в разрезе UUID игрока #kit-ready = false

Вне серверного контекста (бенчмарк) #var без игрока читается как null. Присваивание в $/# без предварительного объявления — нормально, это и есть объявление. Имя переменной может содержать -: loop-index, #kit-ready.

Затенение встроенных функций

Локальная переменная перекрывает встроенную функцию с тем же именем. Поэтому в примерах let victim = player(target), а не let player = ... — иначе следующий вызов player(...) сломается с unknown variable.