📖 Документация Wall Plast

Полное руководство по языку программирования для создания игр

Синтаксис языка

Синтаксис языка состоит в следующем: сначала идёт команда (без разницы, заглавными буквами или нет), и после каждой команды/параметра идёт знак подчеркивания _, а параметры отделяются друг от друга также _.

Пример базовой команды: Log_"Hello world!"

Здесь Log - команда, а "Hello world!" - параметр

Основные правила синтаксиса:

  • Команда не зависит от заглавных букв (Log, log, LOG - работают одинаково)
  • Параметры отделяются знаком _
  • Текстовые параметры обычно пишутся в кавычках, что облегчает понимание скриптом вводимых параметров
  • Несколько команд разделяются ; для последовательного выполнения
Выполнение нескольких команд подряд: SetActive_"Block"_false; Log_"block hidden";

Сначала выполнится SetActive, потом Log. Таким образом можно комбинировать выполнение команд в несколько строк.

Математика в скриптах

Язык поддерживает математические вычисления и позволяет вычислять значения прямо в коде. Поддерживаются следующие операции: + (сложение), - (вычитание), * (умножение), / (деление).

Примеры математических операций: Wait_2+2; transform_"Block"_position_y = 10 * 5; player_target_activated_moveSpeed *= 2;

Скрипт подождёт 4 секунды, телепортирует блок на высоту 50, удвоит скорость игрока

Операторы присваивания:

Когда вы меняете значения (например, позицию или текст), вы можете использовать различные операторы:

  • = - установить точное значение
  • += - прибавить к текущему значению
  • -= - отнять от текущего значения
  • *= - умножить текущее значение
  • /= - поделить текущее значение

Работа с текстом (склейка):

Если вы используете текст, его можно "склеивать" знаком +. Это позволяет объединять текстовые строки и значения переменных:

Примеры текстовых операций: text_"Sign" = "Уровень: " + 5; text_"Status" = "Игрок: " + "Alice"; local_Message = "HP: " + player_target_activated_hp;

События плиты (Events)

Скрипты привязываются к конкретным событиям плиты. Важно понимать, когда именно срабатывает каждое из них. Событие определяет момент и условия, при которых будет выполнен ваш скрипт.

Событие Описание
Start Выполняется всего один раз, когда вы запускаете тест карты. Если вы вернётесь в режим строительства, а затем снова начнёте тест, скрипт выполнится заново.
Update Этот скрипт крутится постоянно и непрерывно на протяжении всей игры, выполняясь каждый кадр.
OnPress Срабатывает ровно ОДИН раз в тот момент, когда игрок (или несколько) наступает на плиту и она опускается. Скрипты OnRelease или WhileNotPressed мгновенно прерываются.
WhilePressed Выполняется непрерывно по кругу все время, пока на плите кто-то стоит.
OnRelease Срабатывает ровно ОДИН раз, когда плита возвращается в исходное (ненажатое) состояние. Скрипты OnPress и WhilePressed мгновенно останавливаются.
WhileNotPressed Выполняется непрерывно по кругу все время, пока на плите никого нет.
Важное примечание: Все запущенные события и циклы жестко прерываются, когда вы включаете режим строительства, чтобы вы могли спокойно редактировать карту без вмешательства скриптов.

Координаты и векторы (Vector3)

Для управления объектами в трёхмерном пространстве используется понятие вектора Vector3_X_Y_Z, где X, Y, Z — это числа, значения переменных или математические выражения. X - горизонтальное положение, Y - вертикальное положение, Z - глубина.

Создание вектора: Vector3_10_5_1.5
Применение вектора к объекту целиком: transform_"Block"_position = Vector3_0_10_0;
Изменение отдельных осей (x, y, z): transform_"Block"_position_y += 5; transform_"Block"_position_x = 20;

Преобразование в текст (_tostring)

Для вывода координат, характеристик или результатов вычислений на текстовую панель, добавьте суффикс _tostring в конце переменной или свойства.

Вывести позицию блока: text_"MySign" = "Блок: " + transform_"Block"_position_tostring;
Вывести здоровье игрока: text_"HealthBar" = "Ваше здоровье: " + player_target_activated_hp_tostring;

SetActive - Управление видимостью

Управляет активностью объектов в игре. Неактивные объекты не отображаются, не взаимодействуют с физикой и не выполняют скрипты.

Синтаксис: SetActive_(a)_(b)

  • a - Имя объекта в кавычках ("Door")
  • b - true или false (активно/не активно)
Примеры: SetActive_"Door"_false; SetActive_"Light"_true;

ChangeSound - Управление звуком

Позволяет управлять параметрами динамика в реальном времени.

Синтаксис:

ChangeSound_"speaker"_"WpNight"_1_1_15_false_true_false_true
Параметр Описание
aИмя объекта динамика
bКод музыки
cГромкость (float)
dСкорость (float)
eРадиус доступности звука
fМожет ли игрок переключать динамик (true/false)
gВоспроизводить при старте (true/false)
hВидна ли 3D-модель динамика (true/false)
kСлышно ли везде на карте (true/false)

Log - Вывод отладки

Выводит отладочные сообщения в консоль разработчика.

Примеры: Log_"Hello World!"; Log_"Низкое значение HP"_"warning"; Log_"Критическая ошибка!"_"error";

Wait и Cycle (Задержки и циклы)

Wait останавливает выполнение скрипта на указанное количество секунд (поддерживает float).

Wait_2; Wait_0.5; Wait_2+3;

Cycle выполняет блок кода определенное количество раз (число или inf для бесконечности).

Cycle_5 { Log_"cycled"; }

Трансформация, Клонирование и Удаление

Transform изменяет позицию, вращение и размер объектов.

transform_"Block"_position_y += 5; transform_"Block"_scale = Vector3_2_2_2;

Clone создает точные копии объектов.

Clone_"WoodCube"; // Автоимя: WoodCube_(1) Clone_"WoodCube"_"MyCube"; // Свое имя local_Spawned = clone_"WoodCube"; // Сохранить в переменную

Destroy удаляет объект.

Destroy_"Door"; Destroy_"self"; // Удалить плиту со скриптом

Parent и Text

Parent привязывает объекты друг к другу или к игроку.

transform_"Hat"_parent = transform_"HeadBlock"; transform_"Block"_parent = player_target_activated; transform_"Hat"_parent = "none";

Text изменяет надписи на объектах.

text_"MySign" = "Привет!"; text_"MySign" += " Как дела?"; textraw_"MySign" = "Просто текст без склейки";

Управление игроком и Характеристики

Мощная команда для взаимодействия с игроками: player_(mode)_(selector)_(stat)

Селекторы для target: all, nearest, farthest, random, activated, local.

Также можно искать по nickname или использовать сохраненного игрока (saved).

Характеристика Описание
hp / maxHpТекущее и максимальное здоровье
moveSpeedСкорость бега
jumpForceВысота прыжка
respawnDurationВремя до возрождения
doesNotNeedStaminaОтключить усталость (1=да, 0=нет)
maxStaminaValueМаксимальная выносливость
staminaValueТекущая выносливость
staminaRegenСкорость восстановления стамины
Примеры: player_target_activated_hp -= 10; player_target_all_doesNotNeedStamina = 1; player_save_"Winner"_target_activated; player_saved_"Winner"_hp = 100;

Чтение характеристик мира

Помимо ваших собственных переменных, вы можете использовать любые характеристики объектов или игроков в качестве чисел или текста для расчетов!

Примеры использования: local_BlockHeight = transform_"MyBlock"_position_y; local_HpDifference = player_target_activated_maxHp - player_target_activated_hp; transform_"Block1"_position_y = transform_"Block2"_position_y + 10;

Последний пример заставит Блок 1 всегда быть на 10 единиц выше Блока 2.

Настройки камеры

Управлять камерой игрока можно так же, как и другими его характеристиками - через команду player_(mode)_(selector)_(stat). Ниже представлены все доступные настройки камеры.

Характеристика Описание
cameraMode Вид камеры. 0 - от первого лица (FPV), 1 - от третьего лица (TPV).
CanChangeView Может ли игрок сам переключать вид камеры (1 - можно, 0 - нельзя).
fov Угол обзора камеры для обоих видов. Чем больше число, тем шире обзор.
1fov / 3fov Угол обзора только для вида от первого лица (1fov) или третьего лица (3fov).
minZoomMultiplier Мин. приближение камеры от 3 лица (0.4 = 40% от обычного расстояния).
maxZoomMultiplier Макс. отдаление камеры от 3 лица (3 = 300% от обычного расстояния).
Примеры использования: player_target_activated_cameraMode = 0; player_target_all_CanChangeView = 0; player_target_activated_1fov = 90; player_target_activated_minZoomMultiplier = 1; player_target_activated_maxZoomMultiplier = 1;

Две последние команды полностью зафиксируют зум камеры игрока.

Переменные (Хранение данных)

Переменные - это виртуальные "коробочки" для сохранения значений (текста или чисел). Создание и изменение переменных не требует специальных команд.

Тип Область видимости Пример
local_ Личные для игрока, общие для всех плит на карте local_Coins = 10;
global_ Синхронизируются на сервере, видны всем global_Score = 100;
self_ Только в этой плите, для текущего локального игрока self_Count = 5;
globalself_ Только в плите, но синхронизируется для всех globalself_Health = 50;
plate_ Доступ к чужой локальной переменной plate_"Manager"_Value += 1;
globalplate_ Доступ к чужой глобальной переменной globalplate_"Boss"_HP = 100;
Работа с числами, текстом и клонами: local_Health = 100; local_Health *= 2; global_Name = "Player1"; local_Message = "Привет, " + global_Name; local_MyEnemy = clone_"Zombie";

Random - Случайные числа

В языке есть встроенный мощный генератор случайных чисел. Синтаксис: random_(Мин)_(Макс)

Случайное целое число (int): local_Dice = random_1_6;
Случайное число с точкой (float): local_Chance = random_0_1_float;
Случайное число с шагом (округление): local_Angle = random_0_360_float_0.5;

Условия (If / Else) и Contains

Условия позволяют выполнять разный код в зависимости от ситуации. Операторы: ==, !=, >, <, >=, <=. Логические: && (И), || (ИЛИ).

Сложная проверка: if (local_Coins >= 10 && local_HasKey == "true") { Log_"Сундук открыт!"; } else if (local_Coins < 10) { Log_"Мало монет"; } else { Log_"Нужен ключ"; }

Проверка текста (contains)

Оператор contains проверяет, содержится ли один текст внутри другого (без учета регистра).

Пример: if (transform_"SecretDoor"_name contains "Door") { Log_"В имени есть слово Door!"; }

Подсчет игроков (standingplayers)

Каждая плита сама помнит, кто из игроков сейчас на ней стоит (даже если их несколько). Этот список называется standingplayers, и его можно узнать как у самой плиты, так и у любой другой на карте.

Узнать количество игроков:

plate_"self"_standingplayers_count plate_"OtherPlate"_standingplayers_count
Пример вывода на экран: text_"Counter" = "Игроков на плите: " + plate_"self"_standingplayers_count;
Пример условия: if (plate_"self"_standingplayers_count >= 2) { Log_"На плите толпа!"; }

Перебор стоящих игроков (без _count):

Вы можете перебрать всех игроков на плите через цикл foreach:

foreach (local_P in plate_"self"_standingplayers) { player_nickname_local_P_hp = 100; }

Массивы: Подсчет (_count) и вложенность

У любого списка (массива) можно узнать не только сами элементы, но и их количество, если добавить в конце _count. Игра сама посчитает элементы, без необходимости перебирать их вручную.

Массив с _count Описание
GetAllPlayers_count Сколько всего игроков сейчас в игре
GetAllObjects_count Сколько всего объектов сейчас на карте
transform_"A"_childs_count Сколько дочерних объектов у блока "A"
player_target_all_childs_count Сколько дочерних объектов у игрока
Пример проверки перед действием: if (GetAllPlayers_count > 0) { Log_"В игре есть игроки!"; }

Вложенные списки (_true)

Обычно список выдает только "прямых" детей объекта. Если нужно получить ВСЕХ вложенных потомков сразу (детей, внуков, правнуков и т.д.), добавьте в конце суффикс _true.

Списки всех потомков: transform_"Block"_childs_true player_target_activated_childs_true
Подсчет всех потомков: transform_"Block"_childs_true_count

Это вернет общее число прямых детей и всех их вложенных объектов.

Кастомные массивы и их создание

Массивы позволяют хранить в одной переменной сразу несколько значений. В языке Wall Plast кастомные массивы создаются через текстовые переменные, где значения разделяются запятыми ,. К отдельным элементам можно обращаться по их индексу (номеру) через квадратные скобки [индекс].

Важно: Нумерация элементов начинается с 0. То есть первый элемент имеет индекс [0], второй — [1], третий — [2] и так далее.

Создание массива

Просто присвойте переменной строку с элементами, разделёнными запятыми:

Пример создания: local_Inventory = "sword,shield,potion";

Создан массив из трёх элементов: sword (индекс 0), shield (индекс 1), potion (индекс 2).

Чтение элемента по индексу

Используйте квадратные скобки с номером элемента:

Примеры чтения: text_"Display" = local_Inventory[0]; // Покажет "sword" text_"Display" = local_Inventory[1]; // Покажет "shield" local_Selected = local_Inventory[2]; // Сохранит "potion" в переменную

Изменение элемента по индексу

Можно заменить любой элемент массива, указав его индекс:

Примеры замены: local_Inventory[1] = "bow"; // Массив стал: "sword,bow,potion" local_Inventory[0] = "axe"; // Массив стал: "axe,bow,potion"
Добавление нового элемента в конец: local_Inventory += ",helmet"; // Массив стал: "axe,bow,potion,helmet"

Подсчёт элементов массива (_count)

Узнать количество элементов в массиве можно через суффикс _count:

Пример с _count: local_Total = local_Inventory_count; // Вернёт 3 text_"Info" = "В инвентаре: " + local_Inventory_count + " предмета";

Использование в условиях

Можно сравнивать элементы массива или проверять их количество:

Примеры с условиями: if (local_Inventory[0] == "sword") { Log_"У вас есть меч!"; } if (local_Inventory_count >= 3) { Log_"Инвентарь почти полон!"; }

Перебор массива через foreach

Можно перебрать все элементы массива, используя его имя как коллекцию:

Пример перебора: foreach (local_Item in local_Inventory) { Log_"Предмет: " + local_Item; }

Выведет в лог: "Предмет: sword", "Предмет: bow", "Предмет: potion".

Индексация встроенных списков

Квадратные скобки работают не только с кастомными массивами, но и со встроенными списками:

Примеры индексации: local_FirstPlayer = GetAllPlayers[0]; // Первый игрок в игре local_ThirdObject = GetAllObjects[2]; // Третий объект на карте local_FirstChild = transform_"MyBlock"_childs[0]; // Первый дочерний объект local_PlatePlayer = plate_"self"_standingplayers[0]; // Первый игрок на плите
Массивы из других плит: plate_"Manager"_Inventory[0] // Первый элемент массива из плиты "Manager" globalplate_"Data"_Items[2] // Третий элемент массива из глобальных данных плиты

Foreach - Перебор списков

Foreach - это цикл, который проходит по каждому элементу списка (массива) и на каждом шаге сохраняет имя текущего элемента в указанную переменную.

foreach (переменная in список) { // Код выполнится для каждого элемента }

Доступные базовые списки:

  • GetAllObjects - все объекты на карте
  • GetAllPlayers - все игроки
  • transform_"A"_childs - дочерние объекты блока "A"
Пример использования: foreach (local_Item in GetAllObjects) { Log_"Нашел объект: " + local_Item; } foreach (local_P in GetAllPlayers) { player_nickname_local_P_hp = 100; }

Имена объектов и игроков (name)

У каждого объекта и каждого игрока есть свое имя, которое можно прочитать, а у объектов — даже изменить во время игры.

Получить имя: text_"MySign" = "Имя: " + transform_"Block"_name; text_"Player" = "Привет, " + player_target_activated_nickname;
Изменить имя объекта: transform_"Block"_name = "NewName"; transform_"Block"_name += "_2";
Важно: Имя игрока изменить с помощью скрипта нельзя, это сделано для безопасности.

Fog - Управление туманом

Позволяет управлять параметрами тумана на сцене (RenderSettings) прямо из скрипта плиты - включать\выключать его, менять цвет, дальность и плотность.

Команда Описание
Fog_enabled = (a); Включает или выключает туман. a - true ИЛИ false.
Fog_color = (a); Задает цвет тумана целиком. a - Color_r_g_b ИЛИ Color_r_g_b_a (альфа необязательна, по умолчанию 1).
Fog_color_r = (a);
Fog_color_g = (a);
Fog_color_b = (a);
Fog_color_a = (a);
Меняет отдельный канал цвета тумана. Поддерживает +=, -=, *=, /=.
Fog_mode = (a); Режим тумана. a - число (0 линейный, 1 экспоненциальный, 2 экспоненциальный квадрат) ИЛИ текст ("linear", "exponential", "exponentialSquared").
Fog_startDistance = (a); Дистанция начала тумана (линейный режим). Поддерживает +=, -=, *=, /=.
Fog_endDistance = (a); Дистанция полной непрозрачности тумана (линейный режим). Поддерживает +=, -=, *=, /=.
Fog_density = (a); Плотность тумана (экспоненциальные режимы). Поддерживает +=, -=, *=, /=.
Примеры управления туманом: Fog_enabled = true; Fog_color = Color_.25_.25_.25; Fog_color_r = .5; Fog_mode = "linear"; Fog_startDistance = 10; Fog_endDistance = 50; Fog_density += .01;

Чтение параметров тумана (например, для условий if): доступны те же параметры в нижнем регистре с приставкой fog_ (без слова Fog в начале команды присваивания):

Токен для чтения Описание
fog_enabledВернет true (1), если туман включен, иначе false (0).
fog_modeВернет число текущего режима тумана (0, 1 или 2). Всегда число, даже если режим был установлен текстом.
fog_startdistance, fog_enddistance, fog_densityТекущие значения соответствующих параметров.
fog_color_r, fog_color_g, fog_color_b, fog_color_aТекущие значения каналов цвета тумана.
Важно: fog_mode при чтении всегда возвращается числом - сравнение с текстом (fog_mode == "linear") не поддерживается, используйте числа (fog_mode == 0).
Чтение состояния тумана: if (fog_enabled == true) { Log_"Туман сейчас включен"; }

Fog_syncForAllClients - Синхронизация тумана

На карте всегда есть один служебный объект с настройками игры, у которого есть флаг синхронизации тумана между всеми игроками на сервере. Когда он включен, параметры тумана хоста автоматически применяются у всех игроков. Управлять этим флагом можно прямо из скрипта плиты.

Использование: Fog_syncForAllClients = true; // Включит синхронизацию тумана для всех игроков Fog_syncForAllClients = false; // Выключит - туман снова станет локальным у каждого клиента
Только хост: Изменить этот параметр может только хост (у кого есть State Authority над объектом настроек). Если это попытается сделать обычный клиент, команда не выполнится, и в debug-меню появится предупреждение: "The current player is not the host; do not use local scripts to guarantee a change to this parameter." В режиме строительства карты (Build Mode) эта проверка отключена, чтобы можно было спокойно тестировать команду в одиночку.

Также можно прочитать текущее состояние флага в условии:

if (fog_syncforallclients == true) { Log_"Синхронизация тумана активна"; }

Булевы значения (true / false)

Помимо чисел 1 и 0, в условиях и математических выражениях теперь можно использовать привычные слова true и false - они автоматически считаются как 1 и 0 соответственно. Регистр букв не важен (TRUE, False, true - все сработает одинаково).

Пример использования: if (fog_enabled == true) { Log_"Туман включен!"; } else { Log_"Туман выключен!"; }