XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Желтая пресса: обучающие статьи
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Результаты опроса: Актуальна ли эта статья в настоящее время?
Да 6 33.33%
Нет 12 66.67%
Голосовавшие: 18. Вы еще не голосовали в этом опросе

 
deemon12

offline
Опыт: 7,563
Активность:
Создаем триггерное шансовое заклинание.
Я уверен, что все, кто когда-либо играл в WarCraft (других здесь и нет) встречался со способностями, содержащими в себе шанс. Например – шанс нанести больший урон, шанс оглушить противника, шанс увернуться. И, как мне кажется, многие хотели бы научиться создавать подобные абилки. Стандартные шансовые заклинания – это одно, но ведь часто возникают ситуации, когда Вам хочется чего-то своего, чего-то отличающегося от стандарта. Или, на худой конец, чого-то, чего в стандартном наборе попросту нет. Мне хочется научить Вас создавать подобные спеллы. В качестве примера мы будем рассматривать триггерное заклинание «Увертливость», идею которого подкинул мне DoomHammer, за что ему огромное спасибо. Смысл спела заключается вот в чем:

Когда героя , имеющего абилку «Увертливость» атакуют, он имеет шанс стань неуязвимым на несколько секунд. На первый взгляд данная пассивка кажется довольно простой. Но именно поэтому я и использую ее в качестве примера.

Итак, начнем. Первое, что мы должны сделать, это создать «пустышку» - пассивную (в нашем случае) способность, которая станет основой триггерного спела. Основная функция этой абилки – определять юнита, который ее изучил для занесения этого юнита в переменную. В данном случае нам полностью подходит способность «Сожжение манны (ведьмак)». Создаем на основе этой пассивки новую, меняем имя и описание на нужные нам (но я бы посоветовал не убивать на это время – можно и вконце сделать). Я заменил имя на «Увертливость». Теперь необходимо изменить (или обнулить) некоторые строки этого спелла. Ставим вместо числовых значений 0 в строках:
Данные – Коэффициент урона: войска (%)
Данные – Коэффициент урона: герои (%)
Данные – Макс. украденной маны: войска (%)
Данные – Макс. украденной маны: герои (%)

В строке «Характеристики – Разрешенные цели» ставим «Сам воин». Все, пустышка теперь есть, заходим в Редактор триггеров и начинаем работу. Как минимум у нас должно в итоге получиться 2 триггера. Их количество зависит от числа уровней спела, который мы создаем. Итак, создаем 1-й триггер, его имя не играет никакого значения, т.к. его задача – занести в переменную героя, который исследовал способность «Увертливость». Пред созданием триггера необходимо создать новую переменную с типом «Боевая единица» и именем HeroUv. Сам триггер должен выглядеть таким образом:

События:
Боевая единица – A unit Приобретает способность
Условия:
(Learned Hero Skill) равно Увертливость
Действия:
Set HeroUv = Triggering Unit

Все, первый триггер готов. Теперь, как только герой исследует данную абилку, игра занесет его в переменную HeroUv.

Второй триггер будет гораздо сложнее первого. Он как раз и будет содержать в себе шанс героя стать неуязвимым. Здесь нам понадобятся еще 2 переменные: обе целочисленные, с именами Udari и Shans. Объясню, зачем эти переменные нужны. В переменную Udari мы будем заносить количество ударов, нанесенных нашему герою. Переменная Shans – это, как Вы уже наверное догадались, и есть шанс нашего героя стать неуязвимым. Все готово к созданию 2-го триггера. Он будет выглядеть так:

События:
Боевая единица – A unit Атакован
Условия:
(Triggering Unit) равно HeroUv (игра проверяет, тот ли это герой, который изучил способность «Увертливость»)
(Level of Увертливость for (Triggering Unit) ) равно 1 (данное условие проверяет уровень спелла, его следует вставлять только если ваше заклинание содержит несколько уровней)
Действия:
Set Udari = (Udari+1) (это счетчик; данное действие заносит переменную Udari количество ударов по герою)
---далее нам понадобится блок If/Then/Else---
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Если – Условия
Udari больше или равно 15 (это самая важная часть! Как раз число 15 и является основой триггера и данного шансового заклинания. По задумке именно 1 из этих 15 ударов и будет делать нашего героя неуязвимым. На деле это где-то 6-7% шанс. Еще один важный момент – чем больше данное число, тем меньше шанс героя стать неуязвимым, чем оно меньше – тем шанс больше. Тут, я думаю, все ясно.)
То – Действия
Set Udari = 0 (мы обнуляем переменную Udari, чтобы она не выскочила за пределы нашего шанса. Если мы ее не обнулим, пассивка сработает всего 1 раз!)
Set Shans = (Random integer number between 1 and 15) (данное действие присваивает переменной Shans случайное целочисленное значение от 1 до 15; именно от того, какое число будет содержать в себе переменная и зависит, как скоро герой станет неуязвимым)
Иначе – Действия
Do nothing (это действие следует добавить, иначе триггер может не работать)
---cоздаем еще один блок If/Then/Else---
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Если – Условия
Udari равно Shans (мы сравниваем значения переменных счетчика и случайного числа каждый раз, когда героя бьют. Кок только эти значения совпадут, запустятся действия данного блока)
То – Действия
Боевая единица - Make HeroUv Неуязвимый (здесь мы делаем героя неуязвимым)
Wait 2.00 seconds (в этом действии назначается время, которое герой будет неуязвимым)
Боевая единица - Make HeroUv Уязвимый (теперь делаем героя снова уязвимым)
Иначе – Действия
Do nothing


Все, оба триггера завершены, пассивка теперь будет раюотать. В зависимости от количества уровней заклинания необходимо буде создать несколько триггеров 2-го типа. Они будут точно такими же, единственные отличия: в условии (Level of Увертливость for (Triggering Unit) ) равно 1 единицу нужно заменить на номер того уровня, на котором будет работать абилка; а в действии Wait 2.00 seconds будет выставляться иное время длительности неуязвимости. Также можно уменьшать счетчик и изменять в соответствии с ним диапазон случайных значений переменной Shans. Комбинаций масса! Главное – внимательно со всем ознакомиться и понять, что к чему. Повторю, что это лишь пример. По данному принципу Вы можете рассчитывать любые шансы.

Отредактировано deemon12, 22.02.2007 в 14:09.
Старый 22.02.2007, 14:02
dk

offline
Опыт: 60,293
Активность:
Офигеть что стали писать люди)
Ну вопервых пример для одного юнита, тоесть даже если у игрока уже есть 2 юнита с этой способностью спелл работать не будет...
Потом офигенно геморный механизм шанса, лучше юзать общеизвестный: Берем случайное число от 1 до 10, если оно равно 7 то делаем какие-то действия, итого шанс 10 процентов...
Делайте выводы...
Старый 22.02.2007, 14:13
Q

offline
Опыт: 360,164
Активность:
а слабо код нормально писать без идиотизмов вроде udari и shans?
Старый 22.02.2007, 14:17
DioD

offline
Опыт: 45,134
Активность:
поддержу автора, бывает еще хуже...

DioD добавил:
всё же страшно жить стало...
Старый 22.02.2007, 14:22
deemon12

offline
Опыт: 7,563
Активность:
Dead_knight, спелл действительно только для одного юнита. Это пример, если ты не понял. Главное - принцип. К тому же насчет числа 7 - тут ты не прав! При таком раскладе юнит будет становиться неуязвимым точно через 10 ударов. И по-другому никак. А в том методе, что предлагаю я, юнит может стать неуязвимым как 2 раза в течение 3-х секунд, так и 1 раз в течение 30. Это НАМНОГО реалестичнее. Стандартные станы, выпадающие с вероятностью 10%, также отнюдь не каждые 10 ударов выпадают. Это мое мнение, хоть оно и не совпадает с твоим.

Q, поясни, плиzz, что ты хотел сказать, я не понял просто.

DioD, хоть тебе спасибо за поддержку.
Старый 22.02.2007, 15:11
dk

offline
Опыт: 60,293
Активность:
Цитата:
К тому же насчет числа 7 - тут ты не прав! При таком раскладе юнит будет становиться неуязвимым точно через 10 ударов.

Это еще раз подтверждает абсолютное незнание темы, таким способом срабатывать будет тоже через случаное кол-во ударов...
Почитай еще раз пост диода до конца)
Старый 22.02.2007, 15:13
AnD
Weighted Companion Cube
offline
Опыт: 7,351
Активность:
Триггер 1:
Initialization

Событие:
Map initialization
Действие:
Set Die_Unit = Аффтор 0009
Триггер - Run KillCircle <gen> (ignoring conditions)

Триггер 2:
KillCircle

Событие:
Время - Every 0.05 seconds of game time
Действие:
Боевая единица - Kill Die_Unit

Имхо так правильнее будет.
Старый 22.02.2007, 15:23
BarracuDa
aka ShaggyBear
offline
Опыт: 4,708
Активность:
У меня такое ощущение, что народ пишет статьи, только для того, чтобы 1000 опыта сорвать! А так статья фифти фифти!
Старый 22.02.2007, 15:54
and_y87
Тру Кодер
offline
Опыт: 21,030
Активность:
для начинающий есть что обмозговать.
а мне она ничего не дала =(
Старый 22.02.2007, 16:03
GadenbIsh
Просто Гад
offline
Опыт: 71,030
Активность:
deemon12
насмешил, честно говоря=))
Ты хотя бы академический FAQ почитал, там написано что надо сделать, чтобы Random Integer возвращал именно случайное число.
Старый 22.02.2007, 16:39
deemon12

offline
Опыт: 7,563
Активность:
1) мне, вообще-то, плевать на 1000 опыта. Я человек не азартный и никогда за легкой добычей не гоняюсь.
2) статья итак для новичков написана.
3) Dead_knight, прочитай пост DioD'а с начала. Я перечитал твой пост. Все понял.
4) AnD, сам убейся.
Старый 22.02.2007, 16:43
dk

offline
Опыт: 60,293
Активность:
Так как статья написана для новичков, она должна быть еще лучше проработанной, ибо они запомнят этот способ и будут юзать, а если он не оптимальный то это не гуд...
Старый 22.02.2007, 16:46
S

offline
Опыт: 43,833
Активность:
гуд... для мну - начинающему джассеру помогло
Старый 22.02.2007, 17:07
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Цитата:
для мну - начинающему джассеру помогло

И чем тебе это помогло? Тут всё полностью на ГУИ!
Старый 22.02.2007, 17:37
AnD
Weighted Companion Cube
offline
Опыт: 7,351
Активность:
Цитата:
4) AnD, сам убейся.

Ушол убиваццо.

Боевая единица - Kill AnD
Игра - Defeat Игрок 1 (Красный) with the message: AnD помер, бедняго
Старый 22.02.2007, 18:29
GadenbIsh
Просто Гад
offline
Опыт: 71,030
Активность:
Sashaaaaa
Надо было FAQ читать
Цитата:
Сообщение от FAQ
Как сделать чтоб каждый раз генерировались разные числа?
File->Prefernces->Test Map->Uncheck "Use fixed random seed"
Старый 22.02.2007, 18:40
S

offline
Опыт: 43,833
Активность:
Цитата:
Сообщение от GadenbIsh
Sashaaaaa
Надо было FAQ читать


Йа читал, но - мриз, неоднократно закусывающий моим моском показывал, как делать шанс, но до мя недоперло... а вот ща... Аффтару thx за статью.
Старый 22.02.2007, 19:11
and_y87
Тру Кодер
offline
Опыт: 21,030
Активность:
я за число от 1 до 10.
Старый 22.02.2007, 21:45
Krol

offline
Опыт: 17,884
Активность:
Цитата:
гуд... для мну - начинающему джассеру помогло

Ты триггеры сначала выучи, лол=)

Впринцыпе статья мож кому поможет, но юзать рандомные числа имхолегче...
Старый 23.02.2007, 12:13
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
Do nothing (это действие следует добавить, иначе триггер может не работать)


Бред. Читай БЖ:
Код:
function DoNothing takes nothing returns nothing
endfunction


Данная функция не имеет никакого смысла и ее происхождение для мну загадка.

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

Код:
if GetRandomInt(1,2)==1then
  //наши действия
 endif


- и будет вам счастье=)

Статью фтопку.
Старый 23.02.2007, 16:51

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 21:05.