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 секунд;

  • Добавьте в стартер код запуска:

: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
  • Добавьте условие перехода на метку запуска:

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

Last updated