000181. Условия в Sanny Builder (Часть 4)
Условия в Sanny Builder (Часть 4)|В этом кратком уроке мы рассмотрим некоторые опкоды, которые работают в связке с условиями (0AA0 и 0AA1). Спустя столько времени, нашлось место и для четвёртой части этой темы.|wmysterio|wmysterio||||Привет! Несколько дней назад некоторые опкоды привлекли моё внимание и я решил протестировать их работу. Хоть и обычных инструментов для работы с условиями достаточно, опкоды 0AA0 и 0AA1 оказались довольно простыми в использовании.
Начну с опкода0AA0. Он позволяет выполнить перехо д на метку с возвратом, если условия не выполнились. Например: мы можем проверить существование актёра. Если он не создан, то сразу создать его:
{$CLEO}
00D6: if
056D: actor 0@ defined
0AA0: gosub_if_false @CREATE_NEW_ACTOR
05E2: AS_actor 0@ kill_actor $PLAYER_ACTOR
0A93: end_custom_thread
:CREATE_NEW_ACTOR
Model.Load(#WMYST)
038B: load_requested_models
0@ = Actor.Create(4,#WMYST,2490.5225, -1665.5012, 13.3437)
Model.Destroy(#WMYST)
return
Смысл думаю понятный. Если актёр "0@" не существует, то делаем переход к метке "CREATE_NEW_ACTOR", создаём актёра, и делаем возврат. После этого созданный актёр будет пытаться убить игрока. Это примерно тоже самое, что и этот код, только короче:
{$CLEO}
00D6: if
856D: not actor 0@ defined
then
gosub @CREATE_NEW_ACTOR
end
AS_actor 0@ kill_actor $PLAYER_ACTOR
0A93: end_custom_thread
:CREATE_NEW_ACTOR
Model.Load(#WMYST)
038B: load_requested_models
0@ = Actor.Create(4,#WMYST,2490.5225, -1665.5012, 13.3437)
Model.Destroy(#WMYST)
return
Если Вы читали статью Избавляемся от "ёлочек", то вариант с опкодом 0AA0 позволит ещё и избавляться от конструкций "IF-THEN-END". Вот результат:

Конечно, этот пример достаточно прост, чтобы его переписать привычным для Вас способом. Однако будут "экзотические" ситуации, когда переход в случае не выполнения условий, будет оправдан в полной мере.
Далее поговорим об опкоде0AA1. Он менее полезен, так как используется внутри перехода с возвратом. Давайте рассмотрим следующий пример:
{$CLEO}
0209: 1@ = random_int_in_ranges 0 100
if
1@ > 49
then
Model.Load(#WMYST)
038B: load_requested_models
0@ = Actor.Create(4,#WMYST,2490.5225, -1665.5012, 13.3437)
Model.Destroy(#WMYST)
0209: 2@ = random_int_in_ranges 20 200
0209: 3@ = random_int_in_ranges 20 101
Actor.Health(0@) = 2@
02E2: set_actor 0@ weapon_accuracy_to 3@
end
gosub @BABEL
0A93: end_custom_thread
// *** *** ***
:BABEL
if
056D: actor 0@ defined
jf @LABEL_END
if
0184: actor 0@ health >= 100
jf @LABEL_END
05E2: AS_actor 0@ kill_actor $PLAYER_ACTOR
:LABEL_END
return
Суть скрипта проста: создаём актёра с вероятностью 50 на 50. Далее устанавливаем ему случайное здоровье и точность. Далее идёт переход к метке. Вот она нас и интересует. В ней мы даём команду убить игрока, если актёр создан и его здоровье минимум стандартное.
Таких условий может быть много. Но суть здесь в том, что мы делаем прыжок на метку "LABEL_END", если эти условия не сработают. Опкод "0AA1: return_if_false" помогает избавится от этой метки, так как он делает возврат, если условие ложно (в опкоде описание какое-то кривое, уместно было бы "0AA1: else_return", но да ладно ).
Давайте теперь перепишем метку уже с использованием нового (надеюсь) для Вас опкода:
{$CLEO}
0209: 1@ = random_int_in_ranges 0 100
if
1@ > 49
then
Model.Load(#WMYST)
038B: load_requested_models
0@ = Actor.Create(4,#WMYST,2490.5225, -1665.5012, 13.3437)
Model.Destroy(#WMYST)
0209: 2@ = random_int_in_ranges 20 200
0209: 3@ = random_int_in_ranges 20 101
Actor.Health(0@) = 2@
02E2: set_actor 0@ weapon_accuracy_to 3@
end
gosub @BABEL
0A93: end_custom_thread
// *** *** ***
:BABEL
if
056D: actor 0@ defined
0AA1: return_if_false // 0AA1: else_return
if
0184: actor 0@ health >= 100
0AA1: return_if_false // 0AA1: else_return
05E2: AS_actor 0@ kill_actor $PLAYER_ACTOR
return
Опять же, его полезно использовать в "экзотических" случаях. Надеюсь, эти случаи будут попадаться чаще, чтобы пользоваться опкодом 0AA1.
На этом "экзотический" урок закончен. Спасибо за внимание!
× **ВАЖНО:** Опкоды доступны в библиотеке CLEO 4.0 и старше!|1|1|0|42197446`png`640`384`320`192``\||uslovija_v_sanny_builder_chast_4|1569703253
Last modified 1yr ago