Рейтинг - 5.0 (2)

В этом кратком уроке мы рассмотрим некоторые опкоды, которые работают в связке с условиями (0AA0 и 0AA1). Спустя столько времени, нашлось место и для четвёртой части этой темы.

Привет! Несколько дней назад некоторые опкоды привлекли моё внимание и я решил протестировать их работу. Хоть и обычных инструментов для работы с условиями достаточно, опкоды 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.

На этом "экзотический" урок закончен. Спасибо за внимание!


Теги: условия, gosub_if_false, return_if_false
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
Что Вы думаете о "Проекте 'Неизвестный': Чёрный список"?
Всего ответов: 14
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
FlameBack
Рекомендую