# 00062. Работа со стартерами ( MAIN.SCM - Часть 1 )

Работа со стартерами ( MAIN.SCM - Часть 1 )|В этом мы рассмотрим примеры запуска нескольких миссий.|wmysterio|wmysterio||||Доброго времени суток, дорогие друзья! Как Вы уже догадались, речь пойдет о стартерах. Когда я был новичком, мне никак не удавалось запускать миссии в нужном порядке. Стартер, что был в учебнике, был для меня плохим примером, так как он был в скомпилированном виде, и с помощью него я смог запустить максимум 3 миссии.

Как я решил данную проблему? Ответ оказался очень простым! Дело было в глобальных переменных, которые были в качестве счетчика, то есть за каждую выполненную миссию мы увеличиваем счетчик на 1. Вот несколько миссий в качестве примера ( Счетчиком будет переменная "$TOTAL\_MISSION" ):

```
//------------- GUN (mission 1) ---------------
:GUN
thread 'GUN'
gosub @GUN_29_57
if
wasted_or_busted
jf @GUN_29_46
gosub @GUN_29_144

:GUN_29_46
$ONMISSION = 0
mission_cleanup
end_thread

:GUN_29_57
increment_mission_attempts
$ONMISSION = 1
fade 1 1000
wait 1000
gosub @GUN_END
00BA: show_text_styled GXT 'M_PASS' time 5000 style 1 // GUN PASSED
0318: set_latest_mission_passed 'MISS_00' // GXT GUN name
$TOTAL_MISSION += 1
create_thread @STARTER
return

:GUN_29_144
wait 0
gosub @GUN_END
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // GUN FAILED
create_thread @STARTER
return

:GUN_END
wait 0
return


//------------- MYS (mission 1) ---------------
:MYS
thread 'MYS'
gosub @MYS_29_57
if
wasted_or_busted
jf @MYS_29_46
gosub @MYS_29_144

:MYS_29_46
$ONMISSION = 0
mission_cleanup
end_thread

:MYS_29_57
increment_mission_attempts
$ONMISSION = 1
fade 1 1000
wait 1000
gosub @MYS_END
00BA: show_text_styled GXT 'M_PASS' time 5000 style 1 // GUN PASSED
0318: set_latest_mission_passed 'MISS_01' // GXT GUN name
$TOTAL_MISSION += 1
create_thread @STARTER
return

:MYS_29_144
wait 0
gosub @MYS_END
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // GUN FAILED
create_thread @STARTER
return

:MYS_END
wait 0
return


//------------- TES (mission 2) ---------------
:TES
thread 'TES'
gosub @TES_29_57
if
wasted_or_busted
jf @TES_29_46
gosub @TES_29_144

:TES_29_46
$ONMISSION = 0
mission_cleanup
end_thread

:TES_29_57
increment_mission_attempts
$ONMISSION = 1
fade 1 1000
wait 1000
gosub @TES_END
00BA: show_text_styled GXT 'M_PASS' time 5000 style 1 // GUN PASSED
0318: set_latest_mission_passed 'MISS_02' // GXT GUN name
$TOTAL_MISSION += 1
create_thread @STARTER
return

:TES_29_144
wait 0
gosub @TES_END
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // GUN FAILED
create_thread @STARTER
return

:TES_END
wait 0
return
```

В нашем арсенале есть три миссии. Как видите во всех присутствует команда "create\_thread @STARTER". Значит их запускает поток с именем ":STARTER". Давайте напишем условия перехода:

```
:STARTER
thread 'STARTER'
wait 0
$MARKER_INDEX_T = marker.CreateIconAndSphere(15, $MISSION_T_COORD_X, $MISSION_T_COORD_Y, $MISSION_T_COORD_Z)
 
:STARTER_1
wait 0
if AND
not actor.Dead($PLAYER_ACTOR)
not actor.Driving($PLAYER_ACTOR)
8A0C: not player $PLAYER_CHAR on_jetpack
8741: not actor $PLAYER_ACTOR busted
then
 if
 $ONMISSION == 0
 then
 if AND
 $TOTAL_MISSION == 0
 0102: actor $PLAYER_ACTOR in_sphere $MISSION_T_COORD_X $MISSION_T_COORD_Y $MISSION_T_COORD_Z radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
 then
 jump @STARTER_2 
 end
 if AND
 $TOTAL_MISSION == 1
 0102: actor $PLAYER_ACTOR in_sphere $MISSION_T_COORD_X $MISSION_T_COORD_Y $MISSION_T_COORD_Z radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
 then
 jump @STARTER_3 
 end 
 if AND
 $TOTAL_MISSION == 2
 0102: actor $PLAYER_ACTOR in_sphere $MISSION_T_COORD_X $MISSION_T_COORD_Y $MISSION_T_COORD_Z radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
 then
 jump @STARTER_4 
 end 
 end
end
jump @STARTER_1

:STARTER_2
wait 0
Marker.Disable($MARKER_INDEX_T)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_01' time 1000 style 2
fade 0 1000
wait 2000
start_mission 0
end_thread

:STARTER_3
wait 0
Marker.Disable($MARKER_INDEX_T)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_02' time 1000 style 2
fade 0 1000
wait 2000
start_mission 1 
end_thread

:STARTER_4
wait 0
Marker.Disable($MARKER_INDEX_T)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_03' time 1000 style 2
fade 0 1000
wait 2000
start_mission 2 
end_thread
```

Как видите, мы создаём сферу и маркер, координаты которой "$MISSION\_T\_COORD\_X", "$MISSION\_T\_COORD\_Y", "$MISSION\_T\_COORD\_Z". Значит нам нужно написать их ещё перед запуском стартера. Обычно скриптеры пишут их в первом потоке, то есть в потоке "MAIN" и тамже задают начальное значение "$TOTAL\_MISSION". Сделаем это тоже:

```
//...
fade 1 0
$TOTAL_MISSION = 0
$MISSION_T_COORD_X = 2535.1055
$MISSION_T_COORD_Y = 2148.1006
$MISSION_T_COORD_Z = 10.8203
create_thread @STARTER
end_thread
```

Теперь сфера будет появляться в этих координатах. Но очень часто нужно сделать, что бы сфера после прохождения миссии появлялась в другой точке. Не проблема! Мы пишем переменные маркера в самой миссии ( до или после $TOTAL\_MISSION += 1 ):

```
//...
$ONMISSION = 1
fade 1 1000
wait 1000
gosub @GUN_END
00BA: show_text_styled GXT 'M_PASS' time 5000 style 1 // GUN PASSED
0318: set_latest_mission_passed 'MISS_00' // GXT GUN name
$MISSION_T_COORD_X = -1446.6484
$MISSION_T_COORD_Y = 1502.4534
$MISSION_T_COORD_Z = 1.7366
$TOTAL_MISSION += 1
create_thread @STARTER
return
//...
```

Таким образом, после прохождения миссии "GUN" позиция маркера изменится.

Что делать, если нужно запустить первую миссию в начале игры? То есть нажимаем "Новая игра" и сразу показывается какой то ролик из миссии или сразу идёт миссия. Например, у миссии 0 есть ролик ( просто представим, так как я кинул код без ролика ). Ответ очень прост! Вместо "create\_thread @STARTER" в потоке "MAIN" пишем "start\_mission 0":

```
// fade 1 0 меняем
fade 0 0 // на это, что бы игра моментально затемнилась, так как в миссии идёт осветление
$TOTAL_MISSION = 0
$MISSION_T_COORD_X = 2535.1055
$MISSION_T_COORD_Y = 2148.1006
$MISSION_T_COORD_Z = 10.8203
// create_thread @STARTER в место этого
start_mission 0 // запускаем миссию
end_thread
//...
```

Даже если миссия будет провалена мы всё равно увидим маркер, так как мы указали необходимые данные в коде провала миссии. Поэтому я закомментировал строчку "// create\_thread @STARTER в место этого". Если этого не сделать, то после прохождении миссии 0 поток ":STARTER" запустится дважды, а это приведёт к нежелательным последствиям.

Я привел пример только для 3-х миссий. Что Вам нужно сделать, чтоб было больше:

* Скопируйте код одной из миссий и в ставьте её в конец скрипта. Переименуйте метки и название потока. Это займет максимум 30 секунд;
* Добавьте в стартер код запуска:<br>

```
:STARTER_n // приставку n вы поменяйте на число
wait 0
Marker.Disable($MARKER_INDEX_T)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_04' time 1000 style 2 // указывайте название новой миссии
fade 0 1000
wait 2000
start_mission n // n - номер новой миссии
end_thread
```

* Добавьте условие перехода на метку запуска:<br>

```
if AND
$TOTAL_MISSION == n // n - увеличивайте число на 1 с каждой новой миссией
0102: actor $PLAYER_ACTOR in_sphere $MISSION_T_COORD_X $MISSION_T_COORD_Y $MISSION_T_COORD_Z radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_n // делаем переход на метку запуска
end
```

Вставляйте этот код в условие:

```
if
$ONMISSION == 0
then
// ваш код
end
```

Так же не забывайте внести их в список миссий ( DEFINE MISSIONS ).

В следующем уроке мы рассмотрим возможность выбора миссий, то есть будет несколько маркеров и в зависимости от того, куда станет игрок запустится та или иная миссия.|853|1|0||rabota\_so\_starterami\_main\_scm\_chast\_1|1499618018


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00100/00300/00062.-rabota-so-starterami-main.scm-chast-1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
