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

Vellum — современный скриптовый язык для Creation Engine


Рекомендуемые сообщения

Опубликовано (изменено)

Всем привет! Хочу немного рассказать о проекте, которым занимался последний год.

В какой-то момент захотелось немного переосмыслить Papyrus. Улучшить его синтаксис, сделать более эргономичным. Привнести лучшие практики из других языков программирования, насколько это возможно в рамках ограничений движка Creation Engine. Основным требованием и одновременно ограничением являлась полная совместимость с PEX (бинарный формат скриптов, написанных на Papyrus). 

Если вы пишите скрипты для Skyrim и хотелось более удобный синтаксис без потери совместимости с PEX — это как раз оно.

Итогом стал Vellum. Коротко перечислю реализованные фишки, которых нет в Papyrus:

  • Автоматический вывод типа для переменных (при помощи ключевого слова var)
  • Цикл for в различных вариациях (можно итерироваться по массивам, по FormList'ам, по заданному диапазону)
  • Операторы break и continue для циклов
  • Форматирование строк
  • Pattern matching (позволяет сократить цепочку if-elseif-else)
  • Однострочное создание и заполнение массивов (var nums = [1, 2, 3])
  • Тернарный условный оператор (?:)
  • Оператор is для проверки типов (source is Weapon) (как в FO4; в Vellum есть и для Skyrim)

Vellum полностью совместим с Papyrus и рантаймом движка Creation Engine. Что это значит на практике?

  • Можно наследоваться от Papyrus скриптов (ObjectReference, Actor и др) и вызывать функции из Papyrus
  • Игроку не нужно устанавливать доп. зависимостей. Автору мода достаточно скомпилировать Vellum скрипты в pex.

Пример того, что можно написать на Vellum:

Спойлер
import Debug

script ReliquaryAltar : ObjectReference {
    var offerings: [Form] { get set }

    event OnActivate(who: ObjectReference) {
        var actor = who as Actor
        if actor != Game.GetPlayer() { return }

        var held = 0
        var missing = ""
        for relic in offerings {
            if actor.GetItemCount(relic) > 0 {
                held += 1
            } else {
                missing += $"{relic} "
            }
        }

        if held == offerings.length {
            MessageBox($"The tomb accepts your offering, {actor.GetName()}.")
        } else {
            MessageBox($"Relics {held}/{offerings.length}. Still missing: {missing}")
        }
    }
}

 


На текущий момент поддержан только Skyrim. Есть планы добавить поддержку Fallout и Starfield.

Есть расширение для VS Code (подсветка синтаксиса, completion, go-to-definition, команда для компиляции).

Ссылки

  • Исходный код доступен на GitHub
  • Скачать компилятор можно на Nexus, либо на странице GitHub Releases (там же расширение для VS Code)
  • Документация по языку и компилятору
Изменено пользователем Naratzul
Опубликовано

Это довольно внезапно и очень неожиданно. 

Сам лично, я вряд ли такое буду использовать, для этого надо моддингом заниматься, но вообще - интересный проект. 

  • Нравится 1

Обо всех замечаниях по работе новой версии сайта пишите в соответствующей теме.

Haem Projects

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...