# 000180. Длинные последовательности в анимации

Длинные последовательности в анимации|В этом уроке мы продолжим изучение AS Pack-ов и рассмотрим ситуацию когда последовательность анимаций нужно сделать более длинной.|wmysterio|wmysterio||||Привет, друзья! Из названия и описания ясно, что речь пойдёт о последовательности анимаций. Ранее уже был создан урок о [AS Pack-ах](https://github.com/wmysterio/scm-scripting-lessons/blob/main/publ/gta_sa/obucheniye_skriptinga/posledovatelnost_v_animacii/34-1-0-156/README.md), но некоторая часть информации ещё не рассказана.

В другом уроке я не упомянул, что есть определённый лимит на количество действий, способных воспроизводится AS Pack-ом. А точнее, что там нет конкретно-установленного лимита. В одному случае всё выполняется как надо. В другом - останавливается в каком-то моменте. Из за этого нельзя однозначно сказать сколько анимаций или действий можно выполнить в одном экшн-паке.

Из за этой неопределённости делать длинные последовательности не рекомендуется. Но что делать, если нам действительно нужна длинная последовательность?

На самом деле мы можем сделать огромную последовательность и зависеть она будет разве что от количества переменных. Принцип работы заключается в том, что мы можем запускать другую последовательность прямо внутри текущей последовательности. Этот приём использовался в оригинальном MIAN.SCM. Пора и нам научится его использовать!

Алгоритм действий таков: мы пишем всю последовательность целиком. Например: вот такую последовательность я написал:

```
07CD: AS_actor -1 walk_to 2467.3425 -1650.9974 13.4712 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2465.1921 -1667.502 13.4712 stop_with_angle 167.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2432.071 -1666.8909 13.5352 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2393.261 -1666.8276 13.478 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2351.2043 -1667.8103 13.5469 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2350.5696 -1695.3361 13.4435 stop_with_angle 180.0 within_radius 1.0 
07CD: AS_actor -1 walk_to 2467.3425 -1650.9974 13.4712 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2465.1921 -1667.502 13.4712 stop_with_angle 167.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2432.071 -1666.8909 13.5352 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2393.261 -1666.8276 13.478 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2351.2043 -1667.8103 13.5469 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2350.5696 -1695.3361 13.4435 stop_with_angle 180.0 within_radius 1.0 
07CD: AS_actor -1 walk_to 2506.5393 -1682.7019 13.5469 stop_with_angle 308.3229 within_radius 1.0 
07CD: AS_actor -1 walk_to 2511.791 -1662.2334 13.5868 stop_with_angle 36.3705 within_radius 1.0
07CD: AS_actor -1 walk_to 2496.2747 -1651.3385 13.4905 stop_with_angle 78.3575 within_radius 1.0
05BE: AS_actor -1 die
```

Если мы попытаемся "запихнуть" всё это в один пак, то есть вероятность, что актёр так и не выполнит все действия и остановится в некий момент. Это происходит не всегда, но часто.

Чтобы всё работало как надо и перестраховаться, мы должны разделить анимации по группам, например, по 6 задач:

```
// START BLOCK #1
07CD: AS_actor -1 walk_to 2467.3425 -1650.9974 13.4712 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2465.1921 -1667.502 13.4712 stop_with_angle 167.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2432.071 -1666.8909 13.5352 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2393.261 -1666.8276 13.478 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2351.2043 -1667.8103 13.5469 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2350.5696 -1695.3361 13.4435 stop_with_angle 180.0 within_radius 1.0 
// END BLOCK #1

// START BLOCK #2
07CD: AS_actor -1 walk_to 2467.3425 -1650.9974 13.4712 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2465.1921 -1667.502 13.4712 stop_with_angle 167.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2432.071 -1666.8909 13.5352 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2393.261 -1666.8276 13.478 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2351.2043 -1667.8103 13.5469 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2350.5696 -1695.3361 13.4435 stop_with_angle 180.0 within_radius 1.0 
// START BLOCK #2

// START BLOCK #3
07CD: AS_actor -1 walk_to 2506.5393 -1682.7019 13.5469 stop_with_angle 308.3229 within_radius 1.0 
07CD: AS_actor -1 walk_to 2511.791 -1662.2334 13.5868 stop_with_angle 36.3705 within_radius 1.0
07CD: AS_actor -1 walk_to 2496.2747 -1651.3385 13.4905 stop_with_angle 78.3575 within_radius 1.0
05BE: AS_actor -1 die
// START BLOCK #3
```

Далее нужно поместить эти блоки в обратном порядке, соблюдая порядок действий:

```
// START BLOCK #3
07CD: AS_actor -1 walk_to 2506.5393 -1682.7019 13.5469 stop_with_angle 308.3229 within_radius 1.0 
07CD: AS_actor -1 walk_to 2511.791 -1662.2334 13.5868 stop_with_angle 36.3705 within_radius 1.0
07CD: AS_actor -1 walk_to 2496.2747 -1651.3385 13.4905 stop_with_angle 78.3575 within_radius 1.0
05BE: AS_actor -1 die
// START BLOCK #3 

// START BLOCK #2
07CD: AS_actor -1 walk_to 2467.3425 -1650.9974 13.4712 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2465.1921 -1667.502 13.4712 stop_with_angle 167.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2432.071 -1666.8909 13.5352 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2393.261 -1666.8276 13.478 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2351.2043 -1667.8103 13.5469 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2350.5696 -1695.3361 13.4435 stop_with_angle 180.0 within_radius 1.0 
// START BLOCK #2
 
// START BLOCK #1
07CD: AS_actor -1 walk_to 2467.3425 -1650.9974 13.4712 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2465.1921 -1667.502 13.4712 stop_with_angle 167.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2432.071 -1666.8909 13.5352 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2393.261 -1666.8276 13.478 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2351.2043 -1667.8103 13.5469 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2350.5696 -1695.3361 13.4435 stop_with_angle 180.0 within_radius 1.0 
// END BLOCK #1
```

Далее вместо комментариев указывает начало и конец AS-пака:

```
0615: define_AS_pack_begin 3@
07CD: AS_actor -1 walk_to 2506.5393 -1682.7019 13.5469 stop_with_angle 308.3229 within_radius 1.0 
07CD: AS_actor -1 walk_to 2511.791 -1662.2334 13.5868 stop_with_angle 36.3705 within_radius 1.0
07CD: AS_actor -1 walk_to 2496.2747 -1651.3385 13.4905 stop_with_angle 78.3575 within_radius 1.0
05BE: AS_actor -1 die 
0616: define_AS_pack_end 3@

0615: define_AS_pack_begin 2@
07CD: AS_actor -1 walk_to 2467.3425 -1650.9974 13.4712 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2465.1921 -1667.502 13.4712 stop_with_angle 167.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2432.071 -1666.8909 13.5352 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2393.261 -1666.8276 13.478 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2351.2043 -1667.8103 13.5469 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2350.5696 -1695.3361 13.4435 stop_with_angle 180.0 within_radius 1.0 
0616: define_AS_pack_end 2@
 
0615: define_AS_pack_begin 1@
07CD: AS_actor -1 walk_to 2467.3425 -1650.9974 13.4712 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2465.1921 -1667.502 13.4712 stop_with_angle 167.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2432.071 -1666.8909 13.5352 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2393.261 -1666.8276 13.478 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2351.2043 -1667.8103 13.5469 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2350.5696 -1695.3361 13.4435 stop_with_angle 180.0 within_radius 1.0 
0616: define_AS_pack_end 1@
```

Последовательности есть. Теперь нам нужно из 1@ запустить пак 2@, чтобы действия продолжались, как будто они выполняются в одном блоке. И , аналогично, в конце блока 2@ запустить блок 3@:

```
0615: define_AS_pack_begin 3@ 
07CD: AS_actor -1 walk_to 2506.5393 -1682.7019 13.5469 stop_with_angle 308.3229 within_radius 1.0 
07CD: AS_actor -1 walk_to 2511.791 -1662.2334 13.5868 stop_with_angle 36.3705 within_radius 1.0
07CD: AS_actor -1 walk_to 2496.2747 -1651.3385 13.4905 stop_with_angle 78.3575 within_radius 1.0
05BE: AS_actor -1 die 
0616: define_AS_pack_end 3@ 
 
0615: define_AS_pack_begin 2@
07CD: AS_actor -1 walk_to 2373.5601 -1695.8665 13.4922 stop_with_angle 270.0 within_radius 1.0 
07CD: AS_actor -1 walk_to 2416.0393 -1696.1923 13.7953 stop_with_angle 270.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2416.7607 -1724.1533 13.7296 stop_with_angle 180.0 within_radius 1.0 
07CD: AS_actor -1 walk_to 2445.157 -1724.7465 13.7372 stop_with_angle 270.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2480.4011 -1726.1528 13.5547 stop_with_angle 0.0 within_radius 1.0 
07CD: AS_actor -1 walk_to 2482.4336 -1686.9985 13.5078 stop_with_angle 0.0 within_radius 1.0 
0618: assign_actor -1 to_AS_pack 3@
061B: remove_references_to_AS_pack 3@ 
0616: define_AS_pack_end 2@
 
0615: define_AS_pack_begin 1@
07CD: AS_actor -1 walk_to 2467.3425 -1650.9974 13.4712 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2465.1921 -1667.502 13.4712 stop_with_angle 167.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2432.071 -1666.8909 13.5352 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2393.261 -1666.8276 13.478 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2351.2043 -1667.8103 13.5469 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2350.5696 -1695.3361 13.4435 stop_with_angle 180.0 within_radius 1.0
0618: assign_actor -1 to_AS_pack 2@
061B: remove_references_to_AS_pack 2@ 
0616: define_AS_pack_end 1@
```

Здесь прослеживается причина почему нам нужно делать AS-Pack-и в обратном порядке: чтобы мы имели ссылки на последовательности для их запуска. Нам осталось только создать актёра и заставить его выполнять последовательность 1@:

```
{$CLEO}
wait 5000
0376: 31@ = create_random_actor_at 2498.5095 -1651.5884 12.5096
0187: 30@ = create_marker_above_actor 31@
0168: set_marker 30@ size 2
 
0615: define_AS_pack_begin 3@ 
07CD: AS_actor -1 walk_to 2506.5393 -1682.7019 13.5469 stop_with_angle 308.3229 within_radius 1.0 
07CD: AS_actor -1 walk_to 2511.791 -1662.2334 13.5868 stop_with_angle 36.3705 within_radius 1.0
07CD: AS_actor -1 walk_to 2496.2747 -1651.3385 13.4905 stop_with_angle 78.3575 within_radius 1.0
05BE: AS_actor -1 die 
0616: define_AS_pack_end 3@ 
 
0615: define_AS_pack_begin 2@
07CD: AS_actor -1 walk_to 2373.5601 -1695.8665 13.4922 stop_with_angle 270.0 within_radius 1.0 
07CD: AS_actor -1 walk_to 2416.0393 -1696.1923 13.7953 stop_with_angle 270.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2416.7607 -1724.1533 13.7296 stop_with_angle 180.0 within_radius 1.0 
07CD: AS_actor -1 walk_to 2445.157 -1724.7465 13.7372 stop_with_angle 270.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2480.4011 -1726.1528 13.5547 stop_with_angle 0.0 within_radius 1.0 
07CD: AS_actor -1 walk_to 2482.4336 -1686.9985 13.5078 stop_with_angle 0.0 within_radius 1.0 
0618: assign_actor -1 to_AS_pack 3@
061B: remove_references_to_AS_pack 3@ 
0616: define_AS_pack_end 2@
 
0615: define_AS_pack_begin 1@
07CD: AS_actor -1 walk_to 2467.3425 -1650.9974 13.4712 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2465.1921 -1667.502 13.4712 stop_with_angle 167.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2432.071 -1666.8909 13.5352 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2393.261 -1666.8276 13.478 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2351.2043 -1667.8103 13.5469 stop_with_angle 90.0 within_radius 1.0
07CD: AS_actor -1 walk_to 2350.5696 -1695.3361 13.4435 stop_with_angle 180.0 within_radius 1.0
0618: assign_actor -1 to_AS_pack 2@
061B: remove_references_to_AS_pack 2@ 
0616: define_AS_pack_end 1@
 
0618: assign_actor 31@ to_AS_pack 1@
061B: remove_references_to_AS_pack 1@
 
0A93: end_custom_thread
```

Такой способ только в редких случаях даёт сбой, но вероятность, что кто-то (что-то) помешает актёру выполить все действия всё же есть. Поэтому здесь лучше отключать трафик актёров и транспорта.

Ну и сам результат:

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/2/59027446.png)|42|1|0|59027446\`png\`640\`384\`320\`192\`\`\\||dlinnye\_posledovatelnosti\_v\_animacii|1567358078


---

# 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/000180.-dlinnye-posledovatelnosti-v-animacii.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.
