00035. Делаем простую миссию

Делаем простую миссию|Наконец-то мы дошли до нашей цели - создание миссии.|wmysterio|wmysterio||||Но для её создания мы должны изучить необходимый минимум. Обратите внимание на начало мейна, а именно на "DEFINE MISSIONS 0". В этом блоке указываются номера всех миссий и название потоков, служащим их началом, а ноль - указывается количество миссий. Давайте создадим поток ":MISSION_0" в конце мейна. Потом после строки с "DEFINE MISSIONS 0" пишем такое:

DEFINE MISSION 0 AT @MISSION_0

У вас должно быть так:

DEFINE MISSIONS 0
DEFINE MISSION 0 AT @MISSION_0

Рассмотрим вторую строчку, а именно цифру ноль. Это - номер миссии. Дальше нам необходимо указать количество миссий. Так, как в нас всего одна миссия, то нам достаточно заменить ноль на единицу в "DEFINE MISSIONS"

× **ВАЖНО:** Миссии начинаются с нуля!

В результате мы получим:

DEFINE MISSIONS 1 // указываем количество миссий
DEFINE MISSION 0 AT @MISSION_0 // указываем номер миссии

Далее мы сможем запускать её в любом месте нашего скрипта. Для этого используйте команду:

0417: start_mission 0 // в Sanny Builder можно использовать команду: "start_mission 0"

× **ВАЖНО:** одновременно можно запускать только 1 миссию!Здесь: 0 — номер миссии

Но нам нужно написать стартер к нему. То есть скрипт, который будет запускать миссию в зависимости от условий. Некий стартер ми уже писали ранее, поэтому мы можем немного переделать его. Прежде всего, для удобства, переименуем поток ":MODEL" на ":STARTER". Далее пишем условия перед тем, как запускать миссию. Напишем 2 условия, одно из них очень важно! Это проверка "включена ли миссия?" ( $ONMISSION ). В результате, у меня получился такой мини-стартер:

:STARTER
thread 'STARTER'
wait 0
$ICON = marker.CreateIconAndSphere(15, 2287.793, -1667.109, 15.0317)

:STARTER_1
wait 0
if AND
$ONMISSION = = 0 // проверка: миссия выключена
00EC: actor $PLAYER_ACTOR 0 near_point 2287.793 -1667.109 radius 3.0 3.0 // Проверка: находится ли СЖ в точке
jf @STARTER_1
marker.Disable($ICON)
start_mission 0 // старт миссии № 0
end_thread

Стартер написали. Теперь перейдём к блоку с миссиями. Рассмотрим опкоды, необходимые для запуска миссий:

Данный опкод увеличивает количество попыток прохождения миссий на 1 ( элемент статистики ).

Этот опкод выгружает память, которую мы заняли миссией и завершает миссию. Всегда используйте эту команду!

В учебнике есть шаблон миссии. Мы его используем здесь, так как он настолько идеален, что я использую его по сей день и практически ничего не меняю! Вот он:

Всё что нам необходимо - это написать код самой миссии. Теперь нам не нужно проверять умер игрок или пойман. Теперь шаблон будет делать всё за нас! :) Это связано с особенностью "gosub" в миссиях, которые делает автоматический возврат если игрока убили или тот был арестован.

Обратите внимание, что в режиме миссии теперь доступны много возможностей. Самой главной, наверное, является количество используемых локальных переменных. Теперь их число составляет 1024! А так же много опкодов, например проверка "wasted_or_busted", которую можно использовать только в миссии. Проверка: "СЖ убил или пойман?".

Напишем код миссии. Допустим СЖ нужно приехать в некую точку, после этого уничтожить красную бочку. За это СЖ получит 5000$. В первую очередь нам нужно создать точку, куда надо добраться. Вот я выбрал точку и создал сферу с чекпоинтом:

Раз мы скриптеры, то понемногу будем избавляться от привычки использования глобальных переменных без необходимости.

В блоке ":MISSION_0_END" сразу же напишем удаление маркера и сферы:

Теперь мы будем уверены, что после прохождения миссии не останутся лишние маркеры или сферы. Возвращаемся к коду миссии, напишем условие: "СЖ находится в точке?" и после отключим сферу и маркер, созданные ранее:

Сразу же после этого нам нужно создать бочку. Загружаем модель бочки и создаём объект:

Естественно, после прохождения миссии нам необходимо освободить память от объекта, если игра вдруг не сможет этого сделать. Переходим к блоку ":MISSION_0_END" и добавляем условие:

Возвращаемся к нашему к нашему созданному объекту. Создадим маркер над ним, что бы мы могли увидеть его местоположение. Дальше нам нужно проверить уничтожен ли он. Для этого используем опкод:

В результате должно выйти:

В блоке ":MISSION_0_END" также отключим маркер над объектом. Теперь финал! :) Когда мы уничтожим объект миссия будет считаться выполненной. Однако юзер не сможет даже увидеть это, по этому прибавим денег игроку. А так же визуально покажем ему об этом событии:

Опкод "01E3" выводит на экран текст: "Миссия выполнена!" а ниже будет указано количество денег. 5000 - это сумма денег, которая будет выведена на экран, 4000 - сообщение будет показано 4 секунды, 1 - стиль текста. Пока мы текст не будем рассматривать, а сделаем это в следующих уроках. Здесь это не на столь важно. Но графически вывести, что мы получили 5000 мало, нужно ещё прибавить опкодами деньги. Опкод, ниже в примере делает это. Все вместе это делает эффект как в оригинале.

Если есть победа, то где то всегда есть и поражение. Если СЖ убьют или арестуют, то нам необходимо сообщить юзеру, что миссия провалена. Для этого находим метку ":MISSION_0_29_144". Эта метка является кодом провала. Добавим такой текст:

И, напоследок, поставим звук победы, как мы это делали в предыдущем уроке.

В прошлом уроке я упомянул о том, что при смерти или аресте игрока игра начинала глючить по объективным причинам. Сейчас я расскажу почему и как это исправить. Дело в том, что игра не знает в каком месте нужно восстанавливать игрока. Для этого служат так званные точки рестарта. Есть 2 типа точек - фиксированные и переменные. Первые указывают где игрок будет всегда появляться. Другие - переопределяют точку рестарта при следующей смерти ( аресте ). Я буду рассматривать только первый тип. Другой будет как-нибуть в другой раз. Рассмотрим опкоды:

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

Как видим всё работает безотказно!

Теперь даже если СЖ убьют или арестуют никаких глюков или багов наблюдаться на будет! :)

Поздравляю! Вы сделали свою первую миссию!!!

Экспериментируйте с кодом миссии, пробуйте написать свою миссию. Если у вас что то не получается - обращайтесь на форум, там вам всегда помогут чем смогут.|1584|1|0|88963945png640400400`250``||delaem_prostuju_missiju|1498859707

Last updated

Was this helpful?