> For the complete documentation index, see [llms.txt](https://lessons.sannybuilder.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lessons.sannybuilder.com/00100/00300/00013.-redaktirovanie-main.scm.-potoki-i-opkody-chast-3.md).

# 00013. Редактирование main.scm. Потоки и опкоды (Часть 3)

Редактирование main.scm. Потоки и опкоды (Часть 3)|В этом уроке мы продолжим изучать потоки. На этот раз мы познакомимся с командами gosub и return|wmysterio|wmysterio||||Если вы владеете какими то языками программирования, то для Вас это может показаться знакомой вешью. Итак, ознакомимся с тем, как пишется команда **gosub**:

```
gosub @POTOK_1
```

Эта команда переходит на метку "POTOK\_1" так же само, как и "jump", только разница том, что шарик будет возвращаться к месту, где этот переход состоялся. Возвращаться он будет когда встретит ближайший **return**. Следовательно **return** - команда возврата. Давайте напишем небольшой скрипт, что бы вы поняли как он работает:

```
:POTOK
thread 'POTOK'
wait 0
gosub @POTOK_1
end_thread

:POTOK_1
wait 0
return
```

Графически можно представить так:

![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/0/84529523.png)

Давайте проследим за тем, так будет двигаться шарик. Сначала он пройдёт 3 строчки. На 4-й он встретит "gosub", дальше идёт прыжок на 7 строку, так как именно там находится метка "@POTOK\_1". Проходит дальше 2 строки и встречает "return". Дальше шарик прыгает обратно на строку, где был "gosub" и продолжает путь, то есть переходит на 5 строку и "уходит на пенсию" =)

Напишем более сложный скрипт, где есть несколько "gosub", и посмотрим на движение шарика:

![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/0/52091111.png)

Что бы вам было легче представить как работают эти 2 опкода, я наведу пример в реальной жизни:

Папа Васе:\
\- Сын, пойди в магазин.\
Вася идёт.\
По дороге ему девочка Рита:\
\- Вася, сорви для меня цветок.\
Вася идёт рвать цветы. Возвращается. Девочка благодарит. Вася идёт в магазин, покупает там, и приходит домой. Папа даёт Васе 5 рублей.

Теперь давайте рассмотрим картинку, которая "транслирует" эту историю в Sanny Builder:

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

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

И, конечно, не забываем о правилах переходов, которые я написал в предыдущем уроке. Думаю основы работы с потоками и метками вы научились. Пора переходить к новому материалу. Если у вас возникли вопросы, задайте их на форуме.

× \*\*ВАЖНО:\*\* Любой "gosub" требует обязательного возврата командой "ruturn".× \*\*Примечание:\*\* В SCM скриптинге есть лимит на количество вложенных "gosub" - 8 штук. Под "вложенными" имеется ввиду те "gosub", которые вызываются внутри существующего "gosub". В последнем примере таких вложенных "gosub" было 2 ( "@POTOK\_1" и "@POTOK\_2" ). Остальные находились на одном уровне вложенности.|1360|1|0|84529523\`png\`285\`183 \`\`\`

`\|52091111`png`290`343

```
`\|80340610`png`574`379`400`264``\||redaktirovanie_main_scm_potoki_i_opkody_chast_3|1498207216
```
