Решение проблемы слишком ветвистых скриптов

Ответить

Таверна | Столик Картостроителей

Подписывайтесь на наши группы:
Перейти к столику:
Автор Сообщение
Сэр mr-serg

HoMM IV: Безземельный
HoMM III: Безземельный
Сообщения: 8
Откуда: Украина

Цитировать ссылка Решение проблемы слишком ветвистых скриптов Добавлено: 10.07.2005 05:58
В редакторе карт к Героям 4 существует такая проблема, как при очень большом разветвлении скриптов, он попросту вылетает при попытке сохраниться. В результате теряеться, потом и кровью, выстраданная информация и написание крутой квестовой карты заходит в тупик.

К тому же проблемой становиться отсутствие подробных справочников по самому редактору, что отнюдь не способствует улучшению пищеварения. Про стандартный Help лучше даже не упоминать.

Мои поиски достойных FAQ не увенчалась успехом, а в качестве улова я получил лишь электронные варианты журнальных статей о редакторе и многостраничные форумные темы, на которых все собираются такой FAQ написать, но к сожалению дальше дело не идёт.

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

Реализуется всё с помощью переменных. Основной смысл таков: каждому квесту присваивается своя переменная, которая изменяется по ходу прохождения квеста и отражает прогресс его выполнения. Таким образом, многоветвистые скрипты условия:
"Если, то:(если, то: {Если, то
                           иначе},
                иначе: {Если, то
                              иначе}),
      иначе: (если, то: {Если, то
                               иначе},
                    иначе: {Если, то
                                  иначе})"
заменяются последовательностью двухуровневых скриптов условия, в которой поочерёдно проверяется условия равенства переменной каждому из возможных значений, а далее при положительном результате (т.е. "то") игроку показывается сообщение о прогрессе квеста и переменной присваивается следующее значение, а при отрицательном ("иначе") – ничего не происходит.

Получилось довольно сложно. Поэтому постараюсь объяснить на простом примере.

В "Хижине провидца 1" герой получает "Квест 1", имеющий следующую не сложную структуру:
1. Получить "Квест 1" (например, принести дрова).
2. Спросить в "Хижине провидца 2" о дровах и узнать, что для начала нужно найти проход в лес (а проход, например, закрыт "Бомбой" или непобедимым войском).
3. Вернутся в "Хижину 1" и сообщить, что не можем попасть в лес, получаем "Квест 2" (открыть проход).
4. Открываем проход (это уже второй квест, поэтому его надо рассматривать отдельно и для него будет другая переменная)
5. Находим дрова.
6. Возвращаемся в "Хижину 1" и получаем приз.

Теперь рассмотрим написание скрипта (последовательность скриптов) в "Хижине провидца 1".Сразу следует заметить, что скрипт писать надо в закладке "Скрипт триггера"; закладки "Сообщение с предложением", "Скрипт при выполнении", "Сообщение о прогрессе дел" я почти не использую.

Для начала, создаём переменную для "Квеста 1", например, kvest1 (у меня редактор понимает только английские названия переменных).
В Кампания/Свойствах карты/События/Календарные события/Новое/Общие создаём событие "Начальное обнуление переменных", Первое появление - День 1, Следующие появления - Никогда, оставляем галочку только для нужных нам игроков.
Выбираем Скрипт/Последовательность/Новый/Задать числовую переменную.
В первом поле пишем "kvest1", во втором оставляем "0". Нажимаем "ОК".
Замечу, что в этом же событии можно таким же образом обнулить все переменные, используемые на корте.

Переходим к "Хижине провидца 1".
Свойсва/Общие – пишем название домика ("Домик лесника") и сообщение, которое будет записано в журнал, и которо
Анкета История героя ЛС E-mail
В форму ответа Наверх
Сэр mr-serg

HoMM IV: Безземельный
HoMM III: Безземельный
Сообщения: 8
Откуда: Украина

Цитировать ссылка Добавлено: 10.07.2005 06:02
Переходим к "Хижине провидца 1".
Свойсва/Общие – пишем название домика ("Домик лесника") и сообщение, которое будет записано в журнал, и которое будет появлятся при наведении на хижину мышки ("Это домик лесника, мне нужно принести ему дрова.")

Переходим Скрипт триггера/Последовательность/Новый.

Скрипт 1. Если kvest1=0, то: последовательность:
                 скрипт 1.1. показать сообщение "Лесник: Мне нужны дрова."
                 скрипт 1.2. задать числовую переменную kvest1=1 (мы выполнили первый пункт "квеста 1")
                                           иначе: ничего не делать (смотри Примечания пункт 1)

Скрипт 2. Если kvest1=1, то: показать сообщение "Лесник: Ты принёс дрова? Герой: Ещё нет." (сообщение о невыполненном задании).

Теперь переходим к "Хижине провидца 2".
Свойства/Общие – "Справочное бюро".

Скрипт 1. Если kvest1=1, то: последовательность:
                 скрипт 1.1. показать сообщение "Герой: Где мне взять дрова? Провидец: Нужно попасть в лес."
                 скрипт 1.2. задать числовую переменную kvest1=2 (мы выполнили второй пункт "квеста 1").

Возвращаемся в "Хижину провидца 1"

Скрипт 3. Если kvest1=2, то: последовательность:
                 скрипт 3.1. показать сообщение "Лесник: Дрова принёс? Герой: Нет, я не могу попасть в лес."
                 скрипт 3.2. задать числовую переменную kvest1=3 (мы выполнили первую половину третьего пункта "квеста 1")
                 скрипт 3.3. задать числовую переменную kvest2=1 (мы выполнили вторую половину третьего пункта "квеста 1"и получили начало "Квеста 2")

Скрипт 4. Если kvest1=3, то: показать сообщение "Лесник: Ты принёс дрова? Герой: Я ещё не смог попасть в лес." (сообщение о невыполненном задании).

Теперь следует сосредоточить свои силы на написании скриптов для второго квеста, чего мы сейчас делать не будем. А вот в последнем скрипте "квеста 2" после того как получили награду за открытый проход вставляем следующее: задать числовую переменную kvest1=4 (это пункт четыре первого квеста).

В "хижине 1"

Скрипт 5. Если kvest1=4, то: показать сообщение "Лесник: Ты вошел в лес? Герой: Да, но дров пока не нашел." (сообщение о невыполненном задании).

Далее Кампания/Свойствах карты/События/Локальные события/Новое/Общие "Вязанка дров", проверяем галочки игроков (если этого не сделать, то компьютерный игрок может использовать данное событие вместо вас и квест накроется медным тазом)
Скрипт/последовательность/новый:
Скрипт 1. Если kvest1=4, то: последовательность:
                 скрипт 1.1. показать сообщение "Герой: Ура. Я нашел дрова."
                 скрипт 1.2. задать числовую переменную kvest1=5 (мы выполнили пятый пункт "квеста 1")
                 скрипт 1.3. удалить скрипт (смотри примечание пункт 3)

Теперь на карте кладём вязанку дров, а вокруг оранжевые сферы локального события, в свойсвах которых выбираем название события "Вязанка дров".

Замечание: Сами дрова можно и не подбирать. Но если обязательно необходимо их физическое наличие у героя, а не сам факт находки, то в финальном скрипте добавляем условие проверки ресурсов (см. ниже).
Анкета История героя ЛС E-mail
В форму ответа Наверх
Сэр mr-serg

HoMM IV: Безземельный
HoMM III: Безземельный
Сообщения: 8
Откуда: Украина

Цитировать ссылка Добавлено: 10.07.2005 06:04
В "хижине 1"

Скрипт 6 (финальный). Если kvest1=5, то: (здесь можно добавить условие проверки наличия ресурсов) последовательность:
                 скрипт 6.1. показать сообщение "Вот дрова!"
                 скрипт 6.2. задать числовую переменную kvest1=6 (конец "квеста 1")
                 скрипт 6.3. отбираем ресурсы (в данном случае дрова, вот только проблема с количеством, так как на карте нельзя редактировать свойства ресурсов, а именно их количество, которое комп выбирает рандомом и в зависимости от сложности игры и карты)
                 скрипт 6.4. выдаём вознаграждение (артефакт, опыт, армию, ресурсы (можно дрова дать biglol и т.д.)
                 скрипт 6.5. удалить скрипт (только если в этом домике больше не задействованы другие квесты, т.е. не проверяются другие переменные).

КОНЕЦ.

Для прикола можно добавить проверку переменной kvest1 в другие хижины провидцев или даже в замок.
Напимер, в "Хижине 2, Справочное бюро" добавляем помимо скриптов второго квеста следующее:

Скрипт 2. Если kvest1=2, то: показать сообщение "Провидец: Что ты ищешь? Герой: Не могу найти дрова в лесу."
Скрипт 3. Если kvest1=5, то: показать сообщение "Герой: Я нашел дрова. Провидец: Они мне не нужны."
Скрипт 4. Если kvest1=6, то: показать сообщение "Герой: Я принёс леснику дрова. Провидец: Молодец."

Примечания.

А теперь о подводных камнях, о которые я набил много шишек.

1. Внимание! Оставляйте пустыми ("ничего не делать") поля "иначе" в скриптах условия (если, то, иначе).

2. В "Хижину провидца 1" можно также запихнуть скрипты из других квестов, только обязательно с другими переменными (смотри прикол выше), и не вздумайте где-нибудь вставить "Удалить скрипт".

3. Внимание! Никогда не ставьте в объектах с несколькими скриптами (в нашем примере в "Хижине 1" их 6 шт, а в "Хижине 2" - 4) скрипт "удалить скрипт", так как он удалит сразу все скрипты. Удалять надо только одноразовые скрипты, например "вязанка дров". Делается это для того, чтобы вы два раза не поднимали дрова (переменной присвоиться значение, меньшее чем вы уже иметь, т.е. в прогрессе квеста вас откинет назад и возникнут проблемы). Так же не следует удалять скрипты, сообщающие о невыполненном задании, ведь это, своего рода, многоразовые напоминания (например, в ворота можно вставить тест "Вся стража спит, можете проходить", который будет появлятся при каждом вашем проходе).

4. Нужно очень чётко продумать логику увязки разных квестов, например в скрипте 3 меняются сразу две переменные, относящиеся к разным квестам. И может получиться, что прогресс второго квеста обгонит ход событий в первом и вы присвоите второй переменной меньшее значение, чем уже есть.

5. И напоследок, хочется обратить внимание на один глюк в нашем примере. Смотрим на скрипты 1 и 2 в "Хижине 1". В первом, присваиваеться переменной kvest1 значение 1, а во втором сразу же выполняется условие kvest1=1. То есть когда герой первый раз входит в хижину, появляется сообщение "Лесник: Мне нужны дрова.", а затем сразу же следующее "Лесник: Ты принёс дрова? Герой: Ещё нет." Получается, что герой ещё никуда не уходил, а лесник уже сообщает о невыполненом задании.
Данный глюк я исправил, положив перед хижиной локальное событие "Выход из хижины" (только не вплотную, а на один шаг отступив, чтобы герой проходил транзитом, а не останавливался на нём* и так, чтобы его нельзя было обойти, выйдя из хижины). В котором добавил скрипты, проверяющие изменение переменной и увеличивающие её на единицу:
Анкета История героя ЛС E-mail
В форму ответа Наверх
Сэр mr-serg

HoMM IV: Безземельный
HoMM III: Безземельный
Сообщения: 8
Откуда: Украина

Цитировать ссылка Добавлено: 10.07.2005 06:06
Скрипт 1. Если kvest1=1, то: последовательность:
                 скрипт 1.1. показать сообщение "Герой: Мне нужно принести леснику дрова."
                 скрипт 1.2. задать числовую переменную kvest1=2 (здесь полностью меняется структура квеста, поэтому в примере изложенном изначально, необходимо смещать значения переменной в большую сторону**.)

* - Скрипты выполняются при входе на локальное событие, а если его положить вплотную к хижине, то герой на нём остановится. И при изменении переменной в хижине скрипт локального события выполниться не сразу после выхода из хижины, а только при повторном заходе героя на локальное событие.

** - В "хижине 1" условие для скрипта 2 измениться с kvest1=1 на kvest1=2, и т.д.

Ну вот и всё, вроде. Кто не понял, я не виноват. Я старался объяснить как можно попонятней. Если кому-то покажется мой метод слишком сложным, то я плакать по этому поводу не буду.

Буду очень рад, если все-таки мне удалось хоть кому-то помочь.

Простите за ошибки и возможные неточности (в разных версиях редакторов названия стандартных скриптов и закладок свойств варьируются).

с ув. mr_serg, начинающий картостроитль, sergey_kharkovskiy[@]rambler[dot]ru
Анкета История героя ЛС E-mail
В форму ответа Наверх
Перейти к столику:

Ответить

Таверна | Столик Картостроителей