02.10.2006, 21:37
Да. Нич-чё не понял.
Сегодняшняя лекция будет посвящена квестосозданию.
Короче чтобы сделать новый квест, надо:
Ресурсы:
-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 и выполнить квест]
Каждая пара <...>->[...] задаётся одним скриптом.
Для выполнения "пары" нужно вызвать скрипт так:
Он выполняется как обычный оператор. Чтобы после действия перейти к следующему блоку, нужно в конце действия вызвать этот скрипт.
Так, ребята, пожалуйста разговаривайте потише. Тех, кому всё понятно, я не держу. Экзамен покажет всё лучше моей жестикуляции.
Пример полностью рабочего скрипта:
Вот на этом примере можно увидеть и уловить идею правильного квестописания.
Ладно, на сегодня всё. Спасибо за внимание, встретимся на семинаре!
PS: Так, с третьего ряда - да, я вам - заберите пожалуйста свою банку из-под Кака-Калы. Здесь уборку делают два раза в неделю - сами понимаете, аудитории лучше не загрязнять... Спасибо, и вас туда же. Ничего, увидимся ещё
Сегодняшняя лекция будет посвящена квестосозданию.
Короче чтобы сделать новый квест, надо:
Ресурсы:
-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: Так, с третьего ряда - да, я вам - заберите пожалуйста свою банку из-под Кака-Калы. Здесь уборку делают два раза в неделю - сами понимаете, аудитории лучше не загрязнять... Спасибо, и вас туда же. Ничего, увидимся ещё