Ураа! Это свершилось! На маркет выложен релиз ComBat Games с поддержкой полного перечня скриптовых команд.
Описание языка здесь
https://games.combat.vision/upload/app/Script.ru.pdf
Если ест ьвопросы по реализации конкретных сценариев или сскриптовых элементов, задавайте здесь...
[video]
https://youtu.be/O39kQTvRJYc[/video]
Примеры скриптов
Автореспаун:
1) Создаем круг или кадрат респауна с системным именем resp.
2) Создаем локальный триггер:
2.1) Условие: inArea(@resp,@player)
2.2) При активации: print("Вы зашли в зону респауна. Ожидайте возрождения 30 мин..."); delay(1800); remStatus(@player, DEAD); print("Вы ожили. Можете вступать в игру.")
Минное поле (зона аномалий) c вероятностью срабатывания 50%:
1) Создаем круг, кадрат или полигон минного поля с системным именем mine.
2) Создаем локальный триггер:
2.1) Условие: inArea(@mine,@player)
2.2) При активации: if(rnd(1) > 0.5) { print("Вы подорвались на мине! Выдвигайтесь на мертвяк."); addStatus(@player, DEAD) }
Авиаудар в выбранном в процессе игры месте:
1) Создаем локальный выключенный триггер:
1.1) Условие: inArea(@art_strike,@player)
1.2) При активации: print("Вас накрыл авиа удар! Выдвигайтесь на мертвяк."); addStatus(@player, DEAD)
2) Когда нужно совершить авиа удар, создаем в нужном месте круг с именем art_strike и включаем триггер. Все кто попадут в круг - погибают.
В такой реализации авиаудар может включить только админ, включив триггер, но можно подвязать активацию триггера на какоето условие, например, сменить статуса цели с именем "Запустить ракету" на "Выполнено" или проверку игрока на вхождение в зону пункта управления ПВО.
Аналогичным способом делаються аномалии для игр сталкера, предупреждение о выходе за игровую територию и т.п.
Но все вышеописанное - это не шаблон для копирования, а скорее демонстрационный пример. По хорошему нужно все нюансы продумывать и обходить возможное не честное поведение игрока.
Автоматическое
переключение миссий с оповещением всех игроков об этом от имени Штаба с системным именем HQ:
1) Создаем группу с системным именем HQ и нзванием "Штаб". Размещаем ее где-то за картой или в условном месте.
2) Создаем задачу с именем mission1. Наносим на него все необходимые объекты, маршруты и т.п.
3) Создаем задачу с именем mission2. Наносим на него все необходимые объекты, маршруты и т.п. Скрываем ее опцией "Временно спрятать слой от всех".
4) Создаем глобальный триггер:
4.1) Условие: getStatus(@mission1) == CMP
4.2) При активации: say(@HQ, select(isUser(@obj)),"Поздравляем, вы успешно выполнили первую миссию! Получена новая задача. См. карту..."); hide(@mission1); show(@mission2)
В результе если кто либо из игроков установит у цели mission1 статус "Выполнено", то произойдет скрытие объектов первой миссии, отображение объектов второй миссии, а так же все игроки на карте получать сообщение от группы Штаб о успешном выполнении.
Пример примитивной реализации войны за территории.
0) Меняем имя админского юзера на "Штаб" для красоты отправки сообщений от имени Штаба.
1) Создаем на карте определенное количество зон в виде кругов, квадратов или многоуголтников (с именем zone1,zone2...,zoneN). Делаем их по умолчанию зелеными.
2) Зеленые зоны будут означать не занятые, жельтые - идет бой, красные - захвачены стороной красных, синие - захвачены стороной синих.
3) Создаем глобальный одноразовый выключенный триггер с подписью Reset и системным именем var для хранения и инициализации переменных счета. При включении триггера админом будет происходить сброс очков, цвета зон и выключение триггера.
3.1) Условие: TRUE (то есть всегда безусловно выполняется)
3.2) По активаци (коментари из кода перед вставкой в триггер надо убрать):
@self.side_red = 156; // Сторона красных из настроек программы
@self.side_blue = 157; // Сторона синих из настроек программы
@self.zones = "@zone1,@zone2,@zone3";
@self.score_red = 0;
@self.score_blue = 0;
foreach(val(@self.zones)) {
setColor(@obj, #FF00FF00);
update(@obj);
}
foreach(select("isPlayer(@sel)")) {
setLock(@obj, ADMIN);
update(@obj);
}
deactivate(@self);
4) Создаем локальный многоразовый триггер Core со временем повторения 60 сек (раз в сколько секунд добавлять бал за контроль) для анализа состоянй захвата территорий.
4.1) Условие: TRUE (то есть всегда безусловно выполняется)
4.2) По активации:
forEach(val(@var.zones)) {
@self.count_red = count(select("isUser(@sel) AND inArea(@obj, @sel) AND not(checkStatus(@sel, DEAD)) AND (getSide(@sel) == val(@var.side_red))"));
@self.count_blue = count(select("isUser(@sel) AND inArea(@obj, @sel) AND not(checkStatus(@sel, DEAD)) AND (getSide(@sel) == val(@var.side_blue))"));
if ((val(@self.count_red) > 0) AND (val(@self.count_blue) > 0)) then {
if(getColor(@obj) != #FFFFFF00) then {
setColor(@obj, #FFFFFF00);
update(@obj);
say(@player, @all, "Heavy fight in [getCapt(@obj)]!")
}
} else if (val(@self.count_red) > 0) then {
if(getColor(@obj) != #FFFF0000) then {
setColor(@obj, #FFFF0000);
update(@obj);
say(@player, @all, "[getCapt(@obj)] captured by RED!")
}
@var.score_red = val(@var.score_red) + 1
} else if (val(@self.count_blue) > 0) then {
if(getColor(@obj) != #FF0000FF) then {
setColor(@obj, #FF0000FF);
update(@obj);
say(@player, @all, "[getCapt(@obj)] captured by BLUE!")
}
@var.score_blue = val(@var.score_blue) + 1
} else if(getColor(@obj) == #FFFFFF00) then {
setColor(@obj, #FF00FF00);
update(@obj);
say(@player, @all, "[getCapt(@obj)] is free!")
} else if(getColor(@obj) == #FFFF0000) then {
@var.score_red = val(@var.score_red) + 1
} else if(getColor(@obj) == #FF0000FF) then {
@var.score_blue = val(@var.score_blue) + 1
}
}
forceUpdate;
deactivate(@self);
Суть механики - каждые 60 секунд все зоны на карте проверяються на наличие в них не мертвых игроков красной и синей стороны. Если в зоне пристусвуют обе стороны, то она стает желтая и очки никому не начисляються. Если в ней присутсвуют игроки только одной стороны, то зона принимает цвет стороны и начисляет по 1 балу за каждую минуту контроля. Если зона осталась желтая и в ней никого нет, она стает зеленая.
5) Создаем выключеный локальный триггер Score для показа счета:
5.1) Условие: TRUE
5.2) По активации:
say(@player, @all, "Score - RED: [val(@var.score_red)], BLUE: [val(@var.score_blue)]!");
deactivate(@self);
При включении триггера он отправит всем сообщение со счетом.