Уроки моддинга
GTA Script GeneratorЗадать вопрос
  • О сайте
    • Проекту помогали
  • GTA SA, VC, III (PC, Classic)
    • Раздел 01. Основы
      • Общие сведения об уроках и минимальный набор программ
      • Установка Sanny Builder. Базовые настройки
      • Синтаксис, комментарии, опкоды, команды. Ключевые слова
      • Типы данных. Литералы. Константы
      • Типы проектов
      • Переменные. Операторы
      • 00012. Редактирование main.scm. Переменные (Часть 3)
      • 000175. Трюк с локальными массивами
      • 00073. Переменные, как члены класса. Коментарии в поиске опкодов. Макросы
      • 00017. Условия в Sanny Builder (Часть 1)
      • 00018. Условия в Sanny Builder (Часть 2)
      • 00019. Условия в Sanny Builder (Часть 3)
      • 000181. Условия в Sanny Builder (Часть 4)
      • 00045. Циклы (Часть 1 - while)
      • 00047. Циклы ( Часть 2 - for )
      • 00049. Циклы ( Часть 3 - repeat ). Вложенные циклы
      • 00087. Таблицы переходов
      • 00059. Подключение текстовых файлов, scm-функции
      • 000155. Использование SCM-функций (опкод 0AB1)
      • 000162. Используем scm-функции в качестве проверок
      • Координаты. Угол. Получение координат и угла Z
      • 000154. Вся правда о wait 0
    • Раздел 02. CLEO
      • Текст
        • 000158. Динамическая GXT-таблица или виртуальные GXT-записи
        • 00033. Работа с текстом
      • Игрок
        • 00021. Одежда СЖ
      • Транспорт
        • 00026. Создание транспорта
        • 000115. Работа с грузовиками и прицепами
        • 000172. Эктра-части автомобилей
        • 00042. Всё о поездах
        • 00080. Тюнинг транспорта, работа с компонентами тюнинга
        • 00029. Транспорт и команды, свойственны ему
        • 00046. Плавающие и лётные средства передвижения
        • 00082. Работа с частями автомобиля
      • Актёры
        • 000152. Заставляем актёра говорить. Аудио-таблицы
        • 000177. Трюк со специальными актёрами
        • 00020. Типы пешеходов, номера банд и отношение между ними
        • 00024. Модель. Создание актёра
        • 00028. Актёры и команды, свойственны им. Команды для игрока
        • 00056. Специальные актёры
        • 00060. События актёров
        • 00084. Модели поведения актёров
      • Объекты
        • 00030. Объекты и команды, свойственны им
        • 00025. Создание объекта
        • 000142. Метание объектов
      • 00027. Пикапы
      • 00031. Маркеры и сферы
      • 000122. Типы чекпоинтов, маркеров. Детальный обзор
      • 00055. Cleo. Основные понятия, отличия от main'а, простые примеры
      • 00061. Cleo-миссии
      • 00064. Работа со стартерами ( Cleo - Часть 1 )
      • 00065. Работа со стартерами ( Cleo - Часть 2 )
      • 00083. Запуск другого потока с Cleo-скрипта
      • 00079. Немного о глобальных CLEO-переменных
      • 00066. Работа со стартерами ( Дополнительные условия )
      • 000137. Группы в GTA San Andreas
      • 00098. Последовательность в анимации
      • 000120. Пути пешеходов и анимационные пути
      • 000178. RRR-файлы в GTA SA. Как их делать и использовать-
      • 000180. Длинные последовательности в анимации
      • 00022. Типы зон. Аудио-зоны
      • 00023. Работа с клавишами. Делаем сохранение
      • 00037. Анимация. Основные команды и примеры их использования
      • 00041. Работа с интерьерами
      • 00036. Катсцены и всё, что необходимо для примитивного видеоролика
      • 000174. Снова статистика игрока
      • 00040. Как создать свой чит-
      • 00090. Работа с гаражами
      • 000176. Выделение памяти
      • 00076. Статистика игрока
      • 00094. Пропуск видеороликов
      • 00072. Работа со светом. Прожектор
      • 00092. Работа с файлами ( форматированное чтение )
      • 00093. Работа с файлами ( Дозапись )
      • 00071. Визуальные эффекты в GTA San Andreas
      • 00069. Взрывы и всё, что связано с огнём.
      • 00086. Движения объектов и эффектов
      • 00068. Использование RC
      • 00067. Использование турелей
      • 00057. Работа с INI-файлами ( запись и считывание )
      • 00044. Работа с панелями ( таблицами )
      • 00043. Работа с аудио
      • 00038. Рисование на экране (Часть 1 - Текст)
      • 00039. Рисование на экране (Часть 2 - Текстуры)
    • Раздел 03. MAIN.SCM
      • 0009. Редактирование main.scm. Потоки и опкоды (Часть 1)
      • 00014. Редактирование main.scm. Потоки и опкоды (Часть 2)
      • 00013. Редактирование main.scm. Потоки и опкоды (Часть 3)
      • 00062. Работа со стартерами ( MAIN.SCM - Часть 1 )
      • 00063. Работа со стартерами ( MAIN.SCM - Часть 2 )
      • 00054. Внешние скрипты в main.scm
      • 00050. Статус-тексты
      • 00053. Таймеры
      • 00035. Делаем простую миссию
    • Раздел 04. Разное
      • 00088. Интересные опкоды (Часть 1)
      • 00089. Интересные опкоды (Часть 2)
      • Интересное в скриптинге
      • 000167. Интересное в скриптинге. Часть 2
      • 00081. Защита скриптов, снятие слабой защиты
      • 000157. Защита скриптов,снятие её + Подробнее об $NOSOURCE
      • 000121. Варианты использования main.scm
      • 000179. Избавляемся от "ёлочек"
      • 000171. Контроль за перемещениями мыши
      • 000182. Колода карт в GTA San Andreas
      • Работа с магазинами
      • 00091. Создания собственных классов и кейвордов
      • 00085. Работа с битами переменных
      • 00051. Работа с HEX. HEX-буфер
      • 00097. Написания DLL библиотек и использование их с скриптах
    • Раздел 05. Игровая память
      • 00058. Работа с игровой памятью (Часть 1- статические адреса)
      • 00074. Динамические адреса памяти. ( Часть 1 - структура актёра )
      • 00075. Динамические адреса памяти. ( Часть 2 - структура автомобиля )
      • 00077. Динамические адреса памяти. ( Часть 3 - структура объекта )
      • 00096. Игровая память. Динамические адреса (структура weapon.dat)
    • Раздел 06. Алгоритмы и примеры
      • 000153. Пример полноценной миссии "Ограбление"
      • 00095. Как сделать нервометр-
      • 00052. Пример полноценной миссии "Взрывчатка"
      • 000114. Делаем спидометр!
      • 000161. Очень длинные миссии в main.scm
      • 000112. Делаем графическое меню
      • 000113. Делаем гоночную миссию ( SARMC v0.9 )
      • 000133. Делаем диалоги в миссиях
      • 00032. Делаем простой скрипт (приходим к точке и убиваем нужную цель)
    • Раздел 07. Plugin SDK (SA)
      • Простейший плагин
      • Работа с массивами объектов
      • Рисуем
      • Короны
      • Класс шрифта (CFont)
    • Раздел 08. Руководство по программам
      • Руководство по использованию программы GTA-SA Crazy IMG Editor
      • Руководство по использованию программы Ped Editor
      • Руководство по использованию программы Rus2gxtCoder
      • Руководство по использованию программы FXT Editor
      • Руководство по использованию программы GTA Animation Manager
      • Руководство по использованию программы TXD Workshop
      • Руководство по использованию программы GTA GXT Editor
      • Руководство по использованию Map Editor
      • Руководство по использованию программы MapCleaner
  • GTA 4 (PC)
    • Раздел 01. ScriptHookDotNet
      • Всё, что необходимо перед началом скриптинга GTA 4
      • Создание проекта и его открытие
      • Наш первый скрипт. Необходимые условия его написания
      • 000102. Метки и прыжки
      • 00034. Что такое Blip- Основные комадны
      • 000107. Обзор класса GAME
      • 000108. Обзор класса PLAYER(Часть 1)
      • 000109. Обзор класса PLAYER(Часть 2)
      • 000110. Обзор класса PLAYER(Часть 3)
      • 000111. Vector - Что это такое и с чем его едят
      • 000116. Обзор класса World
      • 000117. Обзор класса Model
      • 000118. Обзор класса Vehicles
      • 000119. Обзор класса Ped
      • 000126. Pickup в GTA 4
      • 000127. Обзор класса Group
      • 000141. Списки в c#. Запуск нескольких скритов в GTA 4
  • Программирование
    • C#
      • 000103. Типы данных в C#. Базовые операции над ними.
      • 000104. Блочные конструкции. Условия
      • 000105. Блочные конструкции. Циклы
      • 000106. Массивы и структуры
      • 000123. Блочные конструкции. Перечисления
      • 000124. Блочные конструкции. Оператор управдения swith
      • 000125. Блочные конструкции. Цикл foreach
      • 000128. Как делать функции c#- Часть 1
      • 000129. Как делать функции c#- Часть 2
      • 000130. Альтернативные условия
      • 000131. Как делать функции c#- Часть 3
      • 000132. ООП в c# Часть 1
      • 000135. ООП в c# Часть 2 - Полиморфизм
      • 000136. Как делать функции c#- Часть 4
      • 000138. Детальнее о static
      • 000139. Блочные конструкции. Исключения
      • 000140. Делегаты и события в c#
      • 000143. Знакомство с формами
      • 000144. Панель элементов
      • 000149. Кнопки, Текст-боксы и метки
      • 000151. Запуск другой формы из основной, ListBox, MenuStrip
      • 000160. Сериализация и десериализация XML в c#
      • 000163. Консоль. Основные команды
      • 000165. Цикл foreach для своих классов
      • 000168. Перегрузка операторов в c#
      • 000169. Анонимные и динамические типы в c#
      • 000170. Анонимные функции и лямбда-выражения в c#
      • 000173. C# введение в Linq
      • 00048. Детальнее о ref, out и checked
      • 000150. Подключаем dll-библиотеку, работа с файлами
    • C++
      • Выбор среды компилирования, типы данных, первая программа
      • Математика, адреса данных
  • Полезные ссылки
    • Уроки от Vital (видео)
    • База опкодов (SBL)
    • Сайт Sanny Builder
    • Сайт CLEO
  • На удаление
    • Раздел 99. Старые уроки
      • 00010. Управление Sanny Builder и её особенности
      • 0000. Всё, что необходимо перед началом скриптинга
      • 000156. Вступление в скриптинг GTA 3
Powered by GitBook
On this page

Was this helpful?

  1. GTA SA, VC, III (PC, Classic)
  2. Раздел 04. Разное

000179. Избавляемся от "ёлочек"

Previous000121. Варианты использования main.scmNext000171. Контроль за перемещениями мыши

Last updated 3 years ago

Was this helpful?

Избавляемся от "ёлочек"|Привет! В этой статье я хотел бы поделится опытом написания скриптов. А точнее принципом написания кода таким способом, чтобы его легче было читать. Речь пойдёт о "ёлочках".|wmysterio|wmysterio||||Под этим термином обычно подразумевается конструкция типа "IF-THEN-ELSE-END". Сама по себе она лёгкая и часто используется. Проблемы начинаются тогда, когда такие конструкции являются вложенными в другие, такие же, конструкции. Иногда таких конструкций становится настолько много, что читать такой код очень тяжело как опытным скриптерам, так и самому автору.

Давайте рассмотрим простой пример для лучшего понимания ситуации, а дальше будут примеры более сложные. Есть такой код:

:LABEL
wait 0
if
056D: actor 0@ defined
then
02AB: set_actor 0@ immunities BP 1 FP 1 EP 1 CP 1 MP 1
jump @LABEL_2
else
0376: 0@ = create_random_actor_at -1576.88 55.26 8.57
end
jump @LABEL

:LABEL_2

Как же решать подобную проблему и сделать код легко читаемым? Первый принцип подхода таков: создаём (или используем) метку выхода с конструкции и пытаемся написать код таким способом, чтобы избавится от блока "ELSE".

У нас сейчас доступны две метки: "LABEL" и "LABEL_2". Мы можем использовать их чтобы делать простые прыжки. Сами условия пишем так, чтобы блок "ELSE" оказался не нужным.

Вариант решения №1:

:LABEL
if
856D: not actor 0@ defined
then 
0376: 0@ = create_random_actor_at -1576.88 55.26 8.57
end 
02AB: set_actor 0@ immunities BP 1 FP 1 EP 1 CP 1 MP 1
//jump @LABEL_2 // <-- не обязательно

:LABEL_2

Вариант решения №2:

:LABEL
if
856D: not actor 0@ defined
jf @LABEL_2
0376: 0@ = create_random_actor_at -1576.88 55.26 8.57 
02AB: set_actor 0@ immunities BP 1 FP 1 EP 1 CP 1 MP 1
//jump @LABEL_2 // <-- не обязательно

:LABEL_2

13 строк кода мы сократили до 10 (8) строк и ещё избавились от цикла. Удивительно, но такой простой принцип лежит в основе "лёгкого" кода. Здесь важно не количество строк, f отсутствие отступов. Мы пишем код сверху вниз, а не в ширину. Давайте рассмотрим код посложнее, где эти "отступы" будут явно видны:

:LABEL
wait 0
if
056D: actor 0@ defined
then
 if and
 8741: not actor 0@ busted
 8118: not actor 0@ dead
 then 
 if
 056D: actor $PLAYER_ACTOR defined
 then
 05E2: AS_actor 0@ kill_actor $PLAYER_ACTOR
 jump @LABEL_2
 end
 else
 009B: destroy_actor 0@
 end
else 
0376: 0@ = create_random_actor_at -1576.88 55.26 8.57 
02AB: set_actor 0@ immunities BP 1 FP 1 EP 1 CP 1 MP 1
end
jump @LABEL

:LABEL_2

Давайте попытаемся избавится от всех блоков "ELSE":

:LABEL
wait 0
if
856D: not actor 0@ defined
then 
0376: 0@ = create_random_actor_at -1576.88 55.26 8.57 
02AB: set_actor 0@ immunities BP 1 FP 1 EP 1 CP 1 MP 1
end
if or
0741: actor 0@ busted
0118: actor 0@ dead 
then 
009B: destroy_actor 0@
jump @LABEL
end
if
856D: not actor $PLAYER_ACTOR defined 
jf @LABEL
05E2: AS_actor 0@ kill_actor $PLAYER_ACTOR
//jump @LABEL_2 // <-- не обязательно

:LABEL_2

Мы по прежнему сократили количество строк и код у нас никуда не едет вправо. Читая скрипт, мы точно знаем что происходит в каждом блоке, без поиска отдельной части "ELSE", которая находилась где-то в "подвале" кода. Рассмотрим пример ещё сложнее:

10@ = 0

while true
wait 0
 077E: get_active_interior_to 0@
 if
 0@ == 0
 then
 if
 056D: actor $PLAYER_ACTOR defined
 then
 if
 10@ == 0
 then
 00A1: put_actor $PLAYER_ACTOR at 1@ 2@ 3@
 10@ = 1
 end
 else
 10@ = 0
 end
 else
 if
 0@ == 1
 then 
 1@ = 101.0
 2@ = 141.0
 3@ = 151.0
 else
 if
 0@ == 2
 then 
 1@ = 1641.0
 2@ = 1641.0
 3@ = 1641.0 
 else 
 if
 0@ == 3
 then 
 1@ = 1301.0
 2@ = 1341.0
 3@ = 1351.0
 else 
 1@ = 1041.0
 2@ = 1441.0
 3@ = 1541.0
 end 
 end
 end
 end
end

Мы видим, что у нас много разветвлений. При этом у нас в "ELSE" блоке проверки отличаются только числом, что сравнивается, и действиями. Как поступить в этом случае? Решение ситуации заключается в "разбиении" сложной конструкции на мелкие фрагменты:

while true
wait 0
 if
 856D: not actor $PLAYER_ACTOR defined
 then
 10@ = 0
 continue
 end
 077E: get_active_interior_to 0@ 
 1@ = 1041.0 // "else 0@ == 3"
 2@ = 1441.0 // "else 0@ == 3"
 3@ = 1541.0 // "else 0@ == 3" 
 if
 0@ == 1
 then 
 1@ = 101.0
 2@ = 141.0
 3@ = 151.0
 end 
 if
 0@ == 2
 then 
 1@ = 1641.0
 2@ = 1641.0
 3@ = 1641.0 
 end 
 if
 0@ == 3
 then 
 1@ = 1301.0
 2@ = 1341.0
 3@ = 1351.0
 end 
 if and
 0@ == 0 
 10@ == 0
 then
 00A1: put_actor $PLAYER_ACTOR at 1@ 2@ 3@
 10@ = 1
 end
end

Мы опять сократили код и избавились от блоков "ELSE". Первое условие в коде позволяет не выполнять код ниже (ключевое слово "continue"), если оно равно "false". Это позволило нам избавится от лишних разветвлений в блоке с условием "0@ == 0". В блоке кода с условием "0@ == 3" действия блока "ELSE" фактически являлись изначальными данными, поэтому их легче написать после опкода 077E.

Наличие "continue" и изначальных данных приводит нас к ещё одному принципу по избеганию "ёлочки". Принцип таков: сначала пишем условия, которые не позволяют выполнять всю логику, если оно равно "false".

В блоке с условиями часто пишутся переменные, которые сбрасывают значение по-умолчанию (в нашем случае это переменная 10@). Далее пишутся изначальные данные, которые могут изменяться от других условий. И только в конце уже пишется окончательные действия, ради которых все эти условия и создавались.

Тем не менее, не всегда получается избавится от "ELSE", так как это нарушит работу алгоритма или в разветвлении совершаются принципиально разные действия. В этом случае, нужно соблюдать те же принципы, но в каждом из разветвлений. Рассмотрим такой скрипт:

while true
wait 0
 if
 00DF: actor $PLAYER_ACTOR driving
 then
 03C0: 0@ = actor $PLAYER_ACTOR car 
 if
 056E: car 0@ defined
 then
 if and
 82BF: not car 0@ sunk
 8119: not car 0@ wrecked
 then
 if
 0137: car 0@ model == #REMINGTN
 then
 04BA: set_car 0@ speed_to 5.0
 else
 if
 0137: car 0@ model == #CHEETAH
 then
 04BA: set_car 0@ speed_to 10.0
 else
 if
 0137: car 0@ model == #BULLET
 then
 04BA: set_car 0@ speed_to 15.0
 else 
 04BA: set_car 0@ speed_to 0.0
 end
 end
 end
 end
 end
 else
 if
 0AD2: 0@ = player $PLAYER_CHAR targeted_actor
 then
 if
 056D: actor 0@ defined
 then
 if and
 8741: not actor 0@ busted
 8118: not actor 0@ dead
 then
 if
 02F2: actor 0@ model == #WMYST
 then
 02E2: set_actor 0@ weapon_accuracy_to 75
 else
 if
 02F2: actor 0@ model == #BFYST
 then
 02E2: set_actor 0@ weapon_accuracy_to 85
 else
 if
 02F2: actor 0@ model == #BALLAS1
 then
 02E2: set_actor 0@ weapon_accuracy_to 95
 else
 02E2: set_actor 0@ weapon_accuracy_to 10
 end 
 end 
 end 
 else 
 009B: destroy_actor 0@
 end
 end 
 end
 end
end

Давайте попробуем упростить скрипт по этапам:

    1. Смотрим на все блоки "ELSE", которые вложены максимально "глубоко" в другие "ELSE" или "THEN". То есть начинаем с конца.

У нас опкоды 04BA и 02E2 выполняются если все родительские блоки в условиях возвращают "false". Поэтому мы можем все вложенные условия записать без "ELSE", указав каждому блоку только действие в "THEN".

Тем не менее у нас остаётся "хвост" из тех же опкодов, которые изменяют работу алгоритма (машине задаётся всегда скорость 0, а актёру - точность 10). Чтобы алгоритм работал так же, как прежде, нам необходимо добавить "continue" в каждый блок:

if
0137: car 0@ model == #REMINGTN
then
04BA: set_car 0@ speed_to 5.0 
continue
end
if
0137: car 0@ model == #CHEETAH
then
04BA: set_car 0@ speed_to 10.0
continue
end
if
0137: car 0@ model == #BULLET
then
04BA: set_car 0@ speed_to 15.0 
continue
end 
04BA: set_car 0@ speed_to 0.0

// ***
 
if
02F2: actor 0@ model == #WMYST
then
02E2: set_actor 0@ weapon_accuracy_to 75 
continue
end
if
02F2: actor 0@ model == #BFYST
then
02E2: set_actor 0@ weapon_accuracy_to 85 
continue
end
if
02F2: actor 0@ model == #BALLAS1
then
02E2: set_actor 0@ weapon_accuracy_to 95 
continue
end
02E2: set_actor 0@ weapon_accuracy_to 10
    1. У нас по прежнему есть блок "ELSE", где проверяются различные состояния транспорта и актёров. В этом случае выполняем пункт 1, но уже с этими состояниями:

if or 
02BF: car 0@ sunk
0119: car 0@ wrecked
then 
continue
end

// ***
 
if or 
0741: actor 0@ busted
0118: actor 0@ dead
then 
009B: destroy_actor 0@
continue
end

После этих блоков кода идёт код выше, с проверками на модель транспорта и актрёров, и без блоков "ELSE".

    1. Опять у нас остались разветвления. Что же, повторим пункт 1, где избавимся от блока "ELSE", осуществив проверки на существование транспорта и актёра:

if
856E: not car 0@ defined
then
continue
end

// ***

if
856D: not actor 0@ defined 
then 
continue
end
    1. Осталось только 1 разбиение, где проверяется цель игрока. Возвращаемся к любимому пункту 1, и убираем блок "ELSE":

if
8AD2: not 0@ = player $PLAYER_CHAR targeted_actor
then 
continue
end
    1. Казалось, что последнее разветвление убрать уже не получится, так как выполняются два разных алгоритма. Но и тут я умудрился избавиться от надоедливого "ELSE".

Дело в том, что если у нас есть только два разных алгоритма, то после выполнения первого условия нам не нужно делать второй. Поэтому после выполнения кода при истинном значении условия опкода 00DF ставим любимый "continue" после выполнения алгоритма 1.

Вот так мне удалось сократить весь код:

while true
wait 0
 if
 00DF: actor $PLAYER_ACTOR driving
 then
 03C0: 0@ = actor $PLAYER_ACTOR car 
 if
 856E: not car 0@ defined
 then
 continue
 end
 if or 
 02BF: car 0@ sunk
 0119: car 0@ wrecked
 then 
 continue
 end
 if
 0137: car 0@ model == #REMINGTN
 then
 04BA: set_car 0@ speed_to 5.0 
 continue
 end
 if
 0137: car 0@ model == #CHEETAH
 then
 04BA: set_car 0@ speed_to 10.0
 continue
 end
 if
 0137: car 0@ model == #BULLET
 then
 04BA: set_car 0@ speed_to 15.0 
 continue
 end 
 04BA: set_car 0@ speed_to 0.0
 continue // не даём выполнится алгоритму #2
 end
 if
 8AD2: not 0@ = player $PLAYER_CHAR targeted_actor
 then 
 continue
 end
 if
 856D: not actor 0@ defined 
 then 
 continue
 end
 if or 
 0741: actor 0@ busted
 0118: actor 0@ dead
 then 
 009B: destroy_actor 0@
 continue
 end
 if
 02F2: actor 0@ model == #WMYST
 then
 02E2: set_actor 0@ weapon_accuracy_to 75 
 continue
 end
 if
 02F2: actor 0@ model == #BFYST
 then
 02E2: set_actor 0@ weapon_accuracy_to 85 
 continue
 end
 if
 02F2: actor 0@ model == #BALLAS1
 then
 02E2: set_actor 0@ weapon_accuracy_to 95 
 continue
 end
 02E2: set_actor 0@ weapon_accuracy_to 10 
end

Обратите внимание, что новый код увеличился на 4 строки. Мы пожертвовали ими ради того, чтобы код читался максимально легко. Если количество алгоритмов больше двух, то уже с "ELSE" можно жить. В общем прицнип работы здесь такой:

while true
wait 0
 if
 УСЛОВИЯ 1
 then
 АЛГОРИТМ 1
 end
 if
 УСЛОВИЯ 1
 then
 АЛГОРИТМ 1
 end
 // ...
 if
 УСЛОВИЯ N
 then
 АЛГОРИТМ N
 end
end

Как сократить код мы научились. Как же научится писать такой код? Берём условия, которые продолжат код. Инвертируем их и в "THEN" пишем "continue", а остальной код пишем уже после, не используя "ELSE". Вот и всё решение :)

Рассмотрим ситуацию, когда у нас есть цикл на метках. Там не всё так просто, так как нет встроенного "continue". Здесь в дело вступает опкод "004D", более известный как "JF". Если в нас нет каких-либо действий при выполнении условия, то лучше использовать прыжок на первую метку цикла. Если действия всё же есть, то используем "JUMP" на первую метку цикла.

Здесь важно то, что в отличии от циклов условия инвентировать не нужно. Пишем так, как обычно:

:LABEL
wait 0
if
00DF: actor $PLAYER_ACTOR driving
then
 03C0: 0@ = actor $PLAYER_ACTOR car 
 if
 056E: car 0@ defined
 jf @LABEL // это сработает как "continue" в цикле
 if and
 82BF: not car 0@ sunk
 8119: not car 0@ wrecked
 jf @LABEL
 if
 0137: car 0@ model == #REMINGTN
 then
 04BA: set_car 0@ speed_to 5.0 // уже есть действие
 jump @LABEL // это сработает как "continue" в цикле
 end
 if
 0137: car 0@ model == #CHEETAH
 then
 04BA: set_car 0@ speed_to 10.0
 jump @LABEL
 end
 if
 0137: car 0@ model == #BULLET
 then
04BA: set_car 0@ speed_to 15.0 
jump @LABEL
end 
04BA: set_car 0@ speed_to 0.0
jump @LABEL // не даём выполнится алгоритму #2
end
if
0AD2: 0@ = player $PLAYER_CHAR targeted_actor
jf @LABEL
if
056D: actor 0@ defined 
jf @LABEL
if and 
8741: not actor 0@ busted
8118: not actor 0@ dead
then 
009B: destroy_actor 0@
jump @LABEL
end 
if
02F2: actor 0@ model == #WMYST
then
02E2: set_actor 0@ weapon_accuracy_to 75 
jump @LABEL
end
if
02F2: actor 0@ model == #BFYST
then
02E2: set_actor 0@ weapon_accuracy_to 85 
jump @LABEL
end
if
02F2: actor 0@ model == #BALLAS1
then
02E2: set_actor 0@ weapon_accuracy_to 95 
jump @LABEL
end
02E2: set_actor 0@ weapon_accuracy_to 10 
jump @LABEL

Что же, надеюсь, что этот материал был полезным и у Ваш код избавиться от лишних "ёлочек" и будет смотреться читабельно для любого пользователя.|39|1|0|48659987png600368320`196``||izbavljaemsja_ot_jolochek|1567358296