Освоение редактора мира: Триггеры
В этой статье будут описаны основы программирования и триггеры («язык» сценариев Ваккрафта). Статья в основном предназначена для людей, которые никогда раньше не занимались программированием, но программисты могут многое узнать о триггерах именно из этой статьи.
Статья разделена на две части: Основы триггера и программирование. Первая касается Warcraft больше, чем вторая. Вторая часть предназначена для того, чтобы помочь непрограммистам научиться выполнять простые алгоритмы и некоторые простые приемы программирования.
Примечание: На мой взгляд, для освоения триггеров необходимо шаг за шагом изучать. Первая часть предназначена для новичка, чтобы понять, что такое триггеры и как их создавать. Второй шаг — выучить основные триггерные команды, практиковаться и экспериментировать с их использованием.
Третий шаг — освоить редактор на уровне языка программирования, научиться ставить задачи и находить решения. Первая и вторая части этой статьи помогут вам освоить первый и третий шаги соответственно. Но не забывайте, что между ними не хватает еще одного шага — вашей самостоятельной работы.
WarCraft 3. Урок по WE #3 — триггеры ч.7.0 (способность)
- Структура триггера: события, условия и действия
- Переменные, выражения, функции (Variables, Expressions, Functions)
- Основные операторы
- Объекты
- Объекты
- Переменные (практика)
- Циклы (практика)
- Массивы (практика)
Источник: xgm.гуру
—>Warcraft 3 —>
Приветствую тебя, дорогой новичок-триггерщик. Когда я впервые открыл World Editor около месяца назад, я подумал КЛАСС, здесь можно многое сделать. После дня или двух мучений, я понял, что без триггеров я ничего не могу сделать, поэтому пошел гуглить. Я погуглил warcraft3tft.информация и xgm.ru.
Я не знаю, что такое триггеры и для чего они нужны (кстати, warcraft3tft мне понравился больше).info и его форум, чем xgm.ru). Покопавшись на форуме, я увидел, что многие люди задают те же вопросы, поэтому я решил написать эту статью о триггерах. Да кстати если нужен пример по статье черкните пару строк в личку или на форуме.
ПРЕДУПРЕЖДЕНИЕ: ТОЛЬКО ДЛЯ ТЕХ, У КОГО ЕСТЬ РУСИФИЦИРОВАННЫЕ ТРИГГЕРЫ
Часть 1.
1. События.
Типы событий.
Когда вы создаете новое событие, в списке типов есть 9 строк, это:
1.1. Все
1.2. Поиск текста
1.3. Общие параметры
1.4. Украшения
1.5. Диалог
1.6. Игра
1.7. Игрок
1.8. Время
1.9. Боевая единица
Здесь все понятно. Во втором выпадающем списке можно выбрать событие из всех доступных событий.
1.2. Текст для поиска
Здесь тоже все понятно, скажу только, что не всегда можно найти то, что ищешь.
1.3. Общие параметры
Только одно событие — Инициализация карты.
Это событие происходит в начале карты, поэтому вы можете сделать такие вещи, как установить время суток или отключить смену дня и т.д., только один раз при загрузке карты.д.
WarCraft 3. Урок по WE #3 — триггеры ч.1 (вводный урок)
События:
1. Разрушаемый объект уничтожен
2. Разрушаемый объект(ы) уничтожен(ы) в регионе
1.4.1. Уничтоженный объект
Текст события гласит: Разрушаемое уничтожено.
Таким образом, событие происходит только тогда, когда разрушаемый объект, который вы выбрали, уничтожен, что можно выбрать, щелкнув по слову Destructible (далее: текст красного цвета и подчеркнут в редакторе мира, вам нужно перейти к определенному действию или объекту, щелкнув по нему), или из переменной, которую вы создали бы ранее и присвоили ее разрушаемому объекту-декору.
1.4.2. Разрушаемый объект(ы), уничтоженный(ые) в регионе
Текст события гласит: Разрушаемый объект(ы) уничтожен(ы) в регионе
Регион.
То же самое, что и выше, но нужно указывать не разрушаемый объект, а регион, где объекты были разрушены. Регион должен быть создан ранее в редакторе, на панели регионов или создан на лету с помощью функций (Все функции будут описаны в конце статьи).
Одно событие: Нажата кнопка диалога.
Текст события: Нажата кнопка диалога Диалог
Событие происходит, когда вы нажимаете кнопку диалога. Диалог и его кнопки должны быть созданы ранее. Так как вы не можете выбрать диалог, потому что это не объект его нужно создать с помощью переменной в редакторе триггеров (и вообще я вам скажу переменные это классная штука).
События:
1. Время суток становится
2. Значение реальной переменной
3. Загрузка игры
4. Сохранение игры
5. Нажата кнопка способностей героя
6. Нажата кнопка здания
7. Турнирное событие — нам не нужно учитывать
1.6.1. Время суток становится
Текст события: Время суток становится равным 12.00
(синий подчеркнутый текст представляет значения, которые уже установлены.).
Событие происходит, когда: текущее время равно (не равно/больше/больше или равно) заданному вами времени. Могу только добавить, что игровой день длится 24 часа. 6 часов — утро, 18 часов — вечер.
1.6.2. Значение реальной переменной
Текст события: Переменная становится равной (не равной/больше чем/меньше чем или равной/меньше чем или равной) 0.00
Событие происходит, когда реальная переменная (не массив) достигает указанного вами значения
1.6.3. Загрузка игры
Текст события: Загружена сохраненная игра
Происходит при загрузке сохраненной игры.
1.6.4. Сохранение в игре
Текст события: Игра готова к сохранению
Происходит при сохранении игры.
1.6.5. Нажата кнопка способности героя
Текст события: Нажата кнопка способности героя
Происходит, когда вы нажимаете кнопку улучшения способностей героя (красная плюс эта)
1.6.6. Кнопка «Построить» нажата
Текст события: Нажата кнопка строительства
Происходит, когда вы нажимаете кнопку строительства (e.g. для работника Альянса)
1.6.7 Событие турнира — не учитывать.
События:
1. Набранное сообщение в чате
2. Пропущенный мультфильм
3. Событие выбора
4. Событие клавиатуры
5. Свойства
6. Изменение альянса (любое)
7. Смена альянса (уточнено)
8. Победа
9. Победите
10. Выходит из игры
1.7.1. Набранное сообщение в чате
Текст события: Игрок 1 (красный) набрал это текстовое сообщение как Точное совпадение
Событие происходит, когда игрок набирает определенный текст в чате, вы можете выбрать, будет ли это точное совпадение или подстрока.
1.7.2. Пропустил мультик
Текст события: Игрок 1 (красный) пропустил анимацию
Событие происходит, когда игрок нажимает кнопку [ESC] независимо от того, воспроизводится анимация или нет.
1.7.3. Событие выбора
Текст события: Игрок 1 (красный) выбирает единицу
Происходит, когда игрок выбирает или отменяет выбор отряда.
1.7.4. Событие клавиатуры
Текст события: Игрок 1 (красный) нажимает клавишу «стрелка влево»
Происходит, когда игрок нажимает четыре клавиши — стрелка вверх, стрелка вниз, стрелка влево, стрелка вправо.
Текст события: Игрок 1 (красный) покидает игру Золото (текущее).) становится больше или равным 1000.00
Происходит, когда герой достигает определенного количества запасов, тип запасов можно выбрать из списка.
1.7.6. Измененный альянс(любой)
Текст события: Игрок 1 (красный) изменил настройки альянса
Происходит, когда игрок меняет настройки альянса.
1.7.7. Изменение союза (уточненное)
Текст события: Игрок 1 (красный) изменяет настройки Союза (ненападения)
Происходит, когда игрок меняет настройки альянса. Тип альянса можно выбрать из списка.
Текст события: Игрок 1 (красный) покидает игру победителем
Происходит, когда игрок побеждает в игре.
Текст события: Игрок 1 (красный) покидает игру побежденным
Происходит, когда игрок проигрывает игру.
1.7.10. Выходит из игры
Текст события: Игрок 1 (красный) покидает игру
Происходит, когда игрок выходит из игры.
События:
1. Истекшее время
2. Повторяющееся событие
3. Таймер истекает
1.8.1. Прошедшее время
Текст события: Пройдено 5.00 секунд
Происходит по истечении указанного вами времени.
1.8.2. Периодическое событие
Текст события: Каждые 2.00 секунд игрового времени
Событие происходит каждую указанную вами секунду.
1.8.3. Событие выбора
Текст события: Истекает таймер
Происходит, когда таймер достигает нуля.
1.9. Боевая единица
События:
1. Событие для конкретного отряда
2. Событие подразделения игрока
3. Общее событие отряда
4. Отряд вошел в зону
5. Отряд покидает зону
6. Отряд в радиусе
7. Жизнь
8. Мана
1.9.1. Событие для конкретного отряда
Текст события: Отряд погибает
Событие происходит при определенном событии конкретной боевой единицы. Можно выбрать отряд и событие отряда.
Например, если вы выбрали «Умереть», то если выбранный юнит умрет, сработает это событие.
1.9.2. Событие единицы игрока
Текст события: Событие игрока Игрок 1 (красный) умирает
Событие происходит, когда происходит определенное событие игрока.
Например, если «Дубль умирает», то при гибели любого юнита этого игрока срабатывает это событие.
1.9.3. Событие общего отряда
Текст события: Событие погибает
Событие происходит при определенном событии любого юнита любого игрока.
Например, если вы возьмете «Умереть», то при гибели любого юнита любого игрока будет срабатывать это событие.
1.9.4. Отряд вошел в зону
Текст события: Отряд вошел в регион
Происходит, когда кто-то входит в определенную зону.
1.9.5. Отряд покидает регион
Текст события: Отряд покидает регион
Происходит, когда кто-то покидает определенную зону.
1.9.6. Отряд в радиусе
Текст события: Отряд в радиусе региона
Происходит, когда кто-то находится в радиусе вокруг определенного юнита .
Текст события: Жизнь юнита становится меньше 50.00
Происходит, когда жизнь юнита равна / неравна / больше / меньше / больше или равно / меньше или равно определенному значению.
Текст события: Маны у юнита становится меньше 50.00
Происходит, когда мана юнита равна / неравна / больше / меньше / больше или равна / меньше или равна определенному значению.
Продолжение следует..
В следующей части об условиях.
Источник: warcraft3ft.информация
WarCraft 3: Текстовые триггеры (пользовательский текст)
[HR][/HR]
В этой статье я расскажу о текстовых триггерах, что это такое и зачем они нужны.
Warcraft 3 был написан на определенном языке программирования (скорее всего, C). Создатели игры решили создать редактор worldedit, чтобы упростить себе и другим работу по созданию карт. Для начала был создан собственный мини-язык (текстовые триггеры), команды которого позволяют управлять игрой. Однако такой язык был бы слишком сложен для тех, кто не занимается программированием, поэтому был создан редактор триггеров, который заметно облегчил работу. Вместо того, чтобы набирать текстовые команды вручную, разработчик карты выбирает конкретную команду из списка и указывает определенные параметры (фактически, эти триггеры — из редактора триггеров при сохранении карты автоматически переводятся на другой язык — пользовательский текст — это файлы с расширением .j а затем выполняйте их).
Итак, пользовательский текст близок к языку, на котором был написан warcraft3. Если бы Blizzard сделала хороший редактор триггеров, то работа с пользовательским текстом была бы бессмысленной.
Однако не все команды из пользовательского текста доступны в редакторе триггеров. Пример: команда для добавления таймера жизни юнита. Это не одна из обычных команд редактора триггеров. Есть и другие примеры таких команд.
Другой пример — отсутствие нормальных циклов и ветвлений в редакторе триггеров. Команды For и if then else позволяют вам сделать только одну вещь. И если нужно выполнить много действий? (на самом деле, вы можете использовать следующий трюк: укажите триггер, который будет запускать определенный триггер, и дайте ему нужные вам команды).
Команда For настолько неудобна, что мало кто ее использует. Здесь реализован только один вид цикла, причем не самый полезный.
И, наконец, третий очень серьезный недостаток редактора триггеров — отсутствие локальных переменных, но об этом подробнее в следующей статье.
Если вы хотите получить доступ к функциям, недоступным в редакторе триггеров, вам придется научиться работать с пользовательским текстом. К счастью, в редакторе триггеров есть возможность перевести обычные триггеры в пользовательский текст (edit>>custom text). Вы можете узнать, как выглядят простые триггеры в пользовательском тексте, а затем модифицировать их.
Сразу хочу предупредить, что писать свои собственные вещи в пользовательском тексте очень сложно. Если вы допустите ошибку в одном символе, вы получите десять ошибок и даже не поймете, в чем дело. Даже если нет ошибок, это не значит, что их нет. Некоторые ошибки не обнаруживаются при запуске, но когда действие триггера достигает места с ошибкой — все остальные действия после ошибки отключаются.
Для начинающих я хочу дать вам несколько советов по работе с текстовыми триггерами.
- Сначала напишите триггер обычными средствами, а затем переведите его в пользовательский текст и добавьте то, что вам нужно: циклы, новые команды, локальные переменные.
- Прежде чем переводить триггер в пользовательский текст — сделайте его копию.
- Когда вы переведете триггер в текст, вас предупредят, что действие необратимо. Ну, вы действительно не можете перевести текст в триггеры, но вы можете отменить сделанное с помощью edit>>undo или просто нажать ctrl-z.
- Набирайте как можно меньше текста самостоятельно, чтобы уменьшить вероятность ошибки. Предположим, вы уже сделали тестовый триггер, что-то в нем изменили и хотите добавить какую-то стандартную команду. Создайте новый нетекстовый триггер, содержащий одну из этих команд, переведите его в текст. Вы увидите, как выглядит команда. Не вводите их вручную! Используйте буфер обмена: выберите команду, скопируйте edit>>copy (ctrl-ins), вставьте edit>>paste (shift-ins).
- Как проверить правильность текстового триггера. Для этого нам не нужно каждый раз запускать скрипт на выполнение. Вы просто выбираете текстовый триггер, создаете его копию и изменяете для него свойство «enabled». Триггер выключится. Если вы попытаетесь включить его, а в триггере будет ошибка, вы получите предупреждающее сообщение со списком ошибок.
- Лучше не пытаться переводить триггеры со свойством enabled=off или initialy=off в текст. По крайней мере, пока вы не разберетесь с ними. В противном случае вы создадите текстовый триггер, который не будет работать, даже если вы измените его свойства (enabled, initialy). Чтобы это работало, вам придется удалить конкретную команду триггера.
При переходе от обычных к текстовым триггерам, названия единиц, констант и переменных меняются. Вместо единиц вы получаете какую-нибудь ерунду типа ‘df5b’. Спецэффекты изменят свои названия: был ли какой-либо спецэффект. В тексте нужно поставить кавычки и написать две строки вместо одной: «способности\\orc\\:».
Локальные переменные в пользовательском тексте
[HR][/HR]
Вы уже знаете, что такое глобальные переменные. Все переменные, которые вы создаете в редакторе триггеров, являются глобальными. На глобальные переменные можно ссылаться из всех триггеров. Глобальные переменные создаются в начале игры и действуют до конца игры.
Что касается локальных переменных, то это переменные, которые создаются внутри определенного триггера (даже не триггера, а определенной его части). Они создаются, когда запускается триггер, и перестают существовать, когда триггер заканчивается.
Если триггер запускается несколько раз, то при каждом запуске он будет создавать другой набор локальных переменных, которые никак не связаны с другими наборами.
В редакторе триггеров нет возможности создавать локальные переменные, что очень жаль.
Позвольте мне объяснить на примере.
Предположим, я хочу создать юнита, стреляющего огнем (огнемет). Допустим, я выбрал такой способ: когда огнемет атакует, он создает специальный эффект огня на земле. Затем он проверяет, есть ли в радиусе действия другие юниты, и наносит им урон.
Создать такой триггер не так уж сложно. (см. триггер из примера, присланного ниже). И все бы хорошо, но: Что если мы хотим сделать два юнита, огнемет? Создайте для них другой триггер, новые переменные: И если есть 10 или более огнеметчиков? Если мы хотим, чтобы этот юнит мог производить в казарме?
Я хотел бы свести все к одному триггеру, но не могу. Если в игре несколько огнеметов и они атакуют одновременно, то в одни и те же переменные сначала будут записаны одни спецэффекты, а потом другие. Но поскольку спецэффекты первого огнемета не успели убрать, они останутся. Получится своего рода «вечный огонь» (англ. Более того, если наш огнемет атакует достаточно быстро, то старые спецэффекты не успеют исчезнуть до появления новых (огонь должен гореть несколько секунд).
Эту проблему очень сложно (хотя и возможно) решить с помощью обычных триггеров. Однако с локальными переменными эта проблема решается в двух словах.
Я не буду объяснять, как я научился это делать, потому что это приходит с опытом, когда вы учитесь программировать.
Мы хотим зажечь любой огнемет в игре на несколько секунд, а затем погасить. Мы уже добились этого для одного огнемета, используя стандартные триггеры и глобальные переменные.
Переводим наш триггер в пользовательский текст. Прежде всего, мы должны поместить все параметры, относящиеся к конкретному случаю использования огнеметной единицы, в локальные переменные типа единицы.
Например — событие реакция атакующего юнита и событие реакция атакованного юнита — вот параметры. Если огнемет используется другим юнитом, значения этих функций будут совершенно другими.
Затем будут переменные со специальными эффектами. Каждый случай должен создавать свои собственные спецэффекты с огнем — поэтому вам нужны локальные переменные типа спецэффект.
И последний необходимый параметр, угол между атакующим и атакованным юнитом, в локальную переменную типа real.
Создайте локальные переменные с помощью этой команды:
local
local integer i — создаст переменную i целочисленного типа local real r — создаст переменную r реального локального эффекта s — создаст переменную s реального локального эффекта u — создаст переменную u единичного типа
Итак, мы создаем переменные, а затем помещаем в них нужные нам данные:
Set = — помещает определенное значение в переменную. Вы можете использовать функции типа EventResponseAttacking unit.
Заменяет глобальные переменные и функции на локальные.переменные.
Давайте посмотрим, что у нас есть.
Когда вы запускаете триггер, все глобальные параметры записываются в локальные переменные. Действие триггера не изменилось, но (!) если у нас есть несколько огнеметов, они никак не будут мешать друг другу. Фактически, каждый раз, когда вы запускаете триггер, он будет создавать (!) свой собственный набор локальных переменных, которые будут существовать до действия триггера.
Теперь вы можете сделать сколько угодно огнеметов, назначить им любую скорость выстрела — нет проблем со спецэффектами.
Статья скопирована из:
источник: yougame.biz