# 00061. Cleo-миссии

Cleo-миссии|В этом уроке мы рассмотрим как создавать миссии, используя CLEO.|wmysterio|wmysterio||||Как и в main.scm в Cleo можно создавать миссии. Преимущество в Cleo в том, что количество миссий неограниченное! То есть если в мейне максимум 200, то в Cleo может быть 500, 600 и так дальше. Сегодня мы напишем первую Cleo-миссию ;)

Что бы компилятор сделал Cleo-миссию, нужно указать ему в директиве расширение "\*.cm" ( custom mission ):

```
{$cleo .cm}
```

Дальше указать код миссии. Вот очень стабильный код миссий:

```
{$CLEO .cm}
//------------- Mission ---------------

:MISSION
thread 'MISSION'
gosub @MISSION_29_57
if
wasted_or_busted
jf @MISSION_29_46
gosub @MISSION_29_144

:MISSION_29_46
$ONMISSION = 0
mission_cleanup
end_thread

:MISSION_29_57
increment_mission_attempts
$ONMISSION = 1

//
{ Код миссии }
//


gosub @MISSION_END
00BA: show_text_styled GXT 'M_PASS' time 5000 style 1 // MISSION PASSED
0318: set_latest_mission_passed 'MISS_01' // GXT mission name
return

:MISSION_29_144
wait 0
gosub @MISSION_END
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // MISSION FAILED
return

:MISSION_END
wait 0
return
```

Обратите внимание, что завершается поток командой "end\_thread"! После компиляции, SB создаст файл "\*.cm" в папке Cleo. Вы можете поместить его и в другую директорию, например в папку "CLEO\MISSIONS", что бы отделить написанные миссии от Cleo-скриптов.

Давайте напишем миссию, что бы на CJ-я нападали три тела и нужно их убить. После убийства мы получим 1000$.

```
{$CLEO .cm}
//------------- Mission ---------------

:MISSION
thread 'MISSION'
gosub @MISSION_29_57
if
wasted_or_busted
jf @MISSION_29_46
gosub @MISSION_29_144

:MISSION_29_46
$ONMISSION = 0
mission_cleanup
end_thread

:MISSION_29_57
increment_mission_attempts
$ONMISSION = 1
model.Load(#BALLAS1)
038B: load_requested_models

:MISSION_1
wait 0
if
model.Available(#BALLAS1)
jf @MISSION_1
actor.PutAt($PLAYER_ACTOR, 2488.8188, -1678.9363, 12.3361)
actor.Angle($PLAYER_ACTOR) = 7.1576
0@ = actor.Create(7, #BALLAS1, 2484.7991, -1660.7439, 12.3359)
actor.Angle(0@) = 199.2093
077A: set_actor 0@ acquaintance 4 to_actors_pedtype 0
1@ = actor.Create(7, #BALLAS1, 2480.4097, -1661.7654, 12.3437)
actor.Angle(1@) = 207.3561
077A: set_actor 1@ acquaintance 4 to_actors_pedtype 0
2@ = actor.Create(7, #BALLAS1, 2490.8955, -1661.2186, 12.3359)
actor.Angle(2@) = 167.8757
077A: set_actor 2@ acquaintance 4 to_actors_pedtype 0
Camera.Restore_WithJumpCut
Camera.SetBehindPlayer
wait 2000
fade 1 1000
wait 1000
05E2: AS_actor 0@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 1@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 2@ kill_actor $PLAYER_ACTOR
actor.SetImmunities($PLAYER_ACTOR, 0, 0, 0, 0, 0)
player.CanMove($PLAYER_CHAR) = true
3@ = marker.CreateAboveActor(0@)
4@ = marker.CreateAboveActor(1@)
5@ = marker.CreateAboveActor(2@)
07E0: set_marker 3@ type_to 0
07E0: set_marker 4@ type_to 0
07E0: set_marker 5@ type_to 0

:MISSION_2
wait 0
if
actor.Dead(0@)
then
marker.Disable(3@)
end
if
actor.Dead(1@)
then
marker.Disable(4@)
end
if
actor.Dead(2@)
then
marker.Disable(5@)
end
if AND
actor.Dead(0@)
actor.Dead(1@)
actor.Dead(2@)
then
jump @MISSION_3
end
jump @MISSION_2

:MISSION_3
wait 0
gosub @MISSION_END
01E3: show_text_1number_styled GXT 'M_PASS' number 1000 time 5000 style 1
Player.Money($PLAYER_CHAR) += 1000
return

:MISSION_29_144
wait 0
gosub @MISSION_END
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // MISSION FAILED
return

:MISSION_END
wait 0
if
056D: actor 0@ defined
then
actor.RemoveReferences(0@)
actor.DestroyInstantly(0@)
end
if
056D: actor 1@ defined
then
actor.RemoveReferences(1@)
actor.DestroyInstantly(1@)
end
if
056D: actor 2@ defined
then
actor.RemoveReferences(2@)
actor.DestroyInstantly(2@)
end
marker.Disable(3@)
marker.Disable(4@)
marker.Disable(5@)
return
```

Компилируем файл. В нас получился файл "MISSION.cm". Отлично! Мы создали миссию!

Как и в мейне, нам необходимо написать стартер для миссии - набор условий для запуска. Кстати, что бы запустить Cleo-миссию, необходимо использовать опкод:

```
0A94: start_custom_mission "MISSION"
```

Здесь:\
"MISSION" - имя миссии ( название файла! ). Обратите внимание, что расширение "\*.cm" писать не надо!

Давайте напишем простой стартер. Для этого создадим Cleo-скрипт с таким содержимым:

```
{$CLEO}
0000:

:STARTER
thread 'STARTER'
wait 0
if
$ONMISSION == 0
jf @STARTER
02A7: 0@ = create_icon_marker_and_sphere 15 at 2496.6348 -1684.6963 12.3935

:STARTER_1
wait 0
if
$ONMISSION == 1
then
marker.Disable(0@)
jump @STARTER
end

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
 0102: actor $PLAYER_ACTOR in_sphere 2496.6348 -1684.6963 12.3935 radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
 then
 jump @STARTER_2
 end
end
jump @STARTER_1
 
:STARTER_2
wait 0
player.CanMove($PLAYER_CHAR) = false
actor.SetImmunities($PLAYER_ACTOR, 1, 1, 1, 1, 1)
Marker.Disable(0@)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_01' time 1000 style 2
fade 0 1000
wait 2000
0A94: start_custom_mission "MISSION"
jump @STARTER
```

Таким образом мы сделали полноценный стартер и миссия запустилась без проблем:

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/0/01068717.png)

Обратите внимание на последний "jump". Мы перейдём на начало потока, что даёт возможность пройти миссию ещё раз. Если поставить в место неё опкод "0A93: end\_custom\_thread", то пройти миссию мы сможем только 1 раз за загрузку игры ( в том числе когда миссия провалена ), так что оставляем "jump".

Так по-немножку, мы подошли к стартерам. В следующем уроке мы подробнее рассмотрим стартеры, а именно будем учится запускать миссии по-очереди, делать что бы при завершении одной миссии открывались две новых и в таком духе. Материал достаточно сложный в освоении, так как нужно всегда всё держать в своей памяти.

Думаю основу создания cleo-миссий мы рассмотрели. Создайте несколько своих миссий. Тестируйте на здоровье :)|4071|1|0|01068717`png`600`375`400\`250\`\`||cleo\_missii|1499616943


---

# 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/00200/00061.-cleo-missii.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.
