Новые квесты
#17
Да. Нич-чё не понял.

Сегодняшняя лекция будет посвящена квестосозданию.

Короче чтобы сделать новый квест, надо:

Ресурсы:
-databaselmp.res
-<map_name>.mpr
-<текстуры_для_mpr>
Квест:
-<брифинги>
-<map.txt и quest.reg>
Моб:
-Расстановка юнитов
-Правильный скрипт


На последнем остановлюсь подробнее. Я не слишком быстро говорю, "Камчатка" успевает записывать? Хорошо. Стоп, кто пустил самолётик? Слабак! Мои лучше летают :-) Это я-то лузер? Так, я убираю микрофон и говорю без него. Кому надо - услышат.


Для скрипта нужен правильный алгоритм. Сначала нарисуй алгоритм квеста в виде знаменитых ромбиков и квадратиков, а потом я опишу процесс создания полноценного скрипта. Если ты знаешь язык программирования - тем лучше.


Всем спасибо, все свободны. Перерыв 5 минут.

-----------

Итак, перерыв окончен. Побыстрее, побыстрее рассаживаемся. Времени мало.

Чтобы "закодить квест" имея алгоритм, надо:
создать набор скриптов "условие-действие", каждый из который включает в себя N действий и 1 условие. То есть, приведу пример простейшего линейного квеста:

Квест "Жаба-людоед".
1. Найти жабу
2. Убить жабу
3. Облутать жабу
4. Выйти с зоны

(НАЧАЛО)->[Назначить AreaExit, Выдать квест и Выдать подзадание 1]-><Если игрок видит жабу>->[Выполнить подзадание 1 и выдать подзадание 2]-><Если жаба мертва>->[Выполнить подзадание 2 и выдать подзадание 3]-><Если жаба облутана>->[Выполнить подзадание 3 и выдать подзадание 4]-><Если игрок в зоне ExitArea>->[Выполнить подзадание 4 и выполнить квест]

Каждая пара <...>->[...] задаётся одним скриптом.

Код:
DeclareScript SName()

Script SName
(
 if
 (
   Uslovie
 )
 then
 (
   KillScript()
   Deistvie
 )
)

Для выполнения "пары" нужно вызвать скрипт так:
Код:
SName()
Он выполняется как обычный оператор. Чтобы после действия перейти к следующему блоку, нужно в конце действия вызвать этот скрипт.

Так, ребята, пожалуйста разговаривайте потише. Тех, кому всё понятно, я не держу. Экзамен покажет всё лучше моей жестикуляции.

Пример полностью рабочего скрипта:

Код:
GlobalVars
(
 NULL : object,
 i : object,
 Heroes : group,
 AreaExit : float
)

DeclareScript PreInit()
DeclareScript CheckSee()
DeclareScript CheckKill()
DeclareScript CheckLoot()
DeclareScript CheckExit()

Script PreInit
(
 if
 (
   //Пустое условие выполняется  всегда
 )
 then
 (
   KillScript()
   AddRectToArea(AreaExit,1,2,3,4)
   GsSetVarMax(0,"q.zone_name.quest_name",1)
   GsSetVarMax(0,"q.zone_name.quest_name.1",1)
   CheckSee()
 )
)

Script CheckSee
(
 if
 (
   //Хотя бы один из героев видит жабу
   Any(i,Heroes,GroupHas(UnitSee(i),GetObjectByName("EvilToad")))
 )
 then
 (
   KillScript()
   GsSetVarMax(0,"q.zone_name.quest_name.1",2)    
   GsSetVarMax(0,"q.zone_name.quest_name.2",1)
   CheckKill()
 )
)

Script CheckKill
(
 if
 (
   //Жаба мертва
   IsDead(GetObjectByName("EvilToad"))
 )
 then
 (
   KillScript()
   GsSetVarMax(0,"q.zone_name.quest_name.2",2)    
   GsSetVarMax(0,"q.zone_name.quest_name.3",1)
   CheckLoot()
 )
)

Script CheckLoot
(
 if
 (
   //Жаба подобрана/обворована. Ввиду предыдущего подзадания, она мертва => подобрана. Хотя теоретически, её можно "воскресить" разными способами, но об этом потом.
   WasLooted(GetObjectByName("EvilToad"))
 )
 then
 (
   KillScript()
   GsSetVarMax(0,"q.zone_name.quest_name.3",2)    
   GsSetVarMax(0,"q.zone_name.quest_name.4",1)
   CheckExit()
 )
)

Script CheckExit
(
 if
 (
   //Хотя бы один из героев находится в точке, принадлежащей зоне AreaExit
   Any(i,Heroes,IsInArea(AreaExit,GetX(i),GetY(i)))
 )
 then
 (
   KillScript()
   GsSetVarMax(0,"q.zone_name.quest_name.4",2)    
   GsSetVarMax(0,"q.zone_name.quest_name",2)
 )
)

WorldScript
(
 Sleep(5) //На всякий случай подождать 5/15 секунды перед след. строчкой
 PreInit()
)

Вот на этом примере можно увидеть и уловить идею правильного квестописания.

Ладно, на сегодня всё. Спасибо за внимание, встретимся на семинаре!

PS: Так, с третьего ряда - да, я вам - заберите пожалуйста свою банку из-под Кака-Калы. Здесь уборку делают два раза в неделю - сами понимаете, аудитории лучше не загрязнять... Спасибо, и вас туда же. Ничего, увидимся ещё Wink
Ответ


Сообщения в этой теме
Новые квесты - от fa3 - 27.09.2006, 15:06
Новые квесты - от SnAIper - 27.09.2006, 19:34
Новые квесты - от fa3 - 27.09.2006, 22:23
Новые квесты - от fa3 - 28.09.2006, 15:31
Новые квесты - от SnAIper - 28.09.2006, 16:48
Новые квесты - от fa3 - 28.09.2006, 17:23
Новые квесты - от SnAIper - 28.09.2006, 17:31
Новые квесты - от fa3 - 28.09.2006, 20:21
Новые квесты - от SnAIper - 29.09.2006, 19:36
Новые квесты - от fa3 - 30.09.2006, 19:01
Новые квесты - от SnAIper - 30.09.2006, 21:54
Новые квесты - от fa3 - 01.10.2006, 13:24
Новые квесты - от SnAIper - 01.10.2006, 13:59
Новые квесты - от fa3 - 01.10.2006, 15:07
Новые квесты - от SnAIper - 01.10.2006, 17:21
Новые квесты - от fa3 - 01.10.2006, 17:48
Новые квесты - от SnAIper - 02.10.2006, 21:37
Новые квесты - от fa3 - 03.10.2006, 10:26
Новые квесты - от SnAIper - 03.10.2006, 17:24
Новые квесты - от fa3 - 08.10.2006, 16:32
Новые квесты - от SnAIper - 08.10.2006, 17:36
Новые квесты - от fa3 - 08.10.2006, 21:50
Новые квесты - от SnAIper - 09.10.2006, 00:44
Новые квесты - от fa3 - 17.10.2006, 17:41
Новые квесты - от SnAIper - 17.10.2006, 19:04
Новые квесты - от Guest - 24.12.2006, 12:05
Новые квесты - от SnAIper - 24.12.2006, 21:37
Новые квесты - от fa3 - 01.08.2007, 21:08
Новые квесты - от SnAIper - 01.08.2007, 23:46
Новые квесты - от fa3 - 02.08.2007, 12:10
Новые квесты - от Guest - 02.08.2007, 18:22
Новые квесты - от Guest - 02.08.2007, 18:24

Перейти к форуму:


Пользователи, просматривающие эту тему: 5 Гость(ей)