CSL — это собственный язык программирования All Out, созданный для того, чтобы писать многопользовательские игры было так же просто, как создавать одиночные игры.
CSL — это собственный язык сценариев All Out. Он статически типизирован и больше всего похож на Go/Odin — кроме состояние игрового процесса автоматически синхронизируется с сервера на клиенты.
Вам не нужно писать RPC, SyncVars или собственную репликацию. Сосредоточьтесь на логике игрового процесса; платформа позаботится о сетевом обмене за вас.
Ваш первый скрипт (main.csl)
Когда вы создаёте новый проект, All Out генерирует main.csl в папке scripts/ в вашем проекте.
import"core:ao"// ============================================================================// Глобальный жизненный цикл// ============================================================================ao_before_scene_load::proc(){// Зарегистрировать определения предметов, валют и т. д.// Выполняется до создания сцены.}ao_start::proc(){// Вызывается один раз при запуске сцены.}ao_update::proc(dt:float){// Вызывается каждый кадр.}ao_late_update::proc(dt:float){// Вызывается каждый кадр после ao_update.}// ============================================================================// Жизненный цикл игрока// ============================================================================Player::class:Player_Base{ao_start::method(){}ao_update::method(dt:float){}ao_late_update::method(dt:float){}ao_end::method(){}}
Например, выводите сообщение в лог при подключении каждого игрока:
Ваш main.csl должен импортировать core:ao и любые созданные вами папки (например, ui/, abilities/, и т. д).
В большинстве проектов импортируют в main.csl только. Не разбрасывайте импорты по множеству файлов — в итоге вы столкнётесь с запутанными проблемами порядка/видимости.
Объявления (переменные и константы)
Объявления связывают имя со значением.
Переменные
Можно опустить либо <тип> или <выражение> :
Константы
Константы используют :: и должны быть константами времени компиляции:
Это неверно (потому что a не является константой времени компиляции):
Типы
Примитивные типы
Знаковые целые числа: s8, s16, s32, s64
Беззнаковые целые числа: u8, u16, u32, u64
Булевы значения: b8, b16, b32, b64
Числа с плавающей точкой: f32, f64
Псевдонимы:
int == s64
uint == u64
bool == b8
float == f32
Векторы: v2, v3, v4
string
typeid
любой
Типы векторов
v2 имеет .x, .y; v3 добавляет .z; v4 добавляет .w — все поля float:
Структуры и классы
Структуры — это тип значения (копируются при присваивании). Классы — это ссылочные типы (их выделяют с помощью new).
Структуры (тип-значение)
Классы (ссылочные типы)
Наследование
Структуры/классы могут наследоваться от других структур/классов:
Процедуры и методы
Процедуры (proc)
Процедуры — это обычные значения, и их можно присваивать/хранить как любое другое значение:
Методы (method)
Используйте method() внутри структуры/класса. У методов есть неявный this параметр-ссылка.
Доступ к полям vs вызовы методов
Используйте . для полей, -> для методов:
Любую процедуру можно вызвать как «метод», если её первый параметр совпадает с типом получателя. Это распространённый шаблон CSL.
Массивы
В CSL есть несколько типов, похожих на «массивы», которые вы будете использовать постоянно:
Фиксированные массивы: [4]int
Срезы / управляемые массивы: []T (часто используется как «только для чтения» представление массива)
Динамические массивы: [..]T (изменяемый по размеру список)
Неразмещаемые массивы: [^]T (используются в сигнатурах встроенного API, например format_string, log_info, и т. д. — передавайте значения как {a, b, c})
Динамические массивы предоставляют .data, .count, и .capacity, а для операций используют синтаксис вызова метода:
Когда вам нужно изменить параметр, предпочитайте ref это вместо сырых указателей.
Колбэки: указатели на функции + userdata (без замыканий)
В CSL нет замыканий. Встроенные proc(...) { ... } не могут захватывать окружающие переменные.
Чтобы передавать контекст, связывайте колбэки с полем userdata: Object
Информация о типах (типы как значения)
typeid значения можно передавать в полиморфные процедуры:
Лучшие практики (CSL в All Out)
Избегайте глобального состояния игрового процесса. Подключается несколько игроков — храните состояние каждого игрока в Player вместо этого.
Разделяйте косметическую и игровую логику. Используйте is_local() для UI/частиц только на локальном клиенте, и is_local_or_server() для игровых входов, которые должны выполняться на сервере + локальном клиенте.
Мобильные настройки по умолчанию. Не полагайтесь на ввод с клавиатуры/мыши, если только ваша игра явно не ориентирована на ПК.
Если вы не уверены в синтаксисе или API, проверьте папку api_reference/ сгенерированную в вашем проекте (в ней содержится последняя область core.csl).