Использование условий if… elseif
If (condition)
Elseif (condition)
Else
Endif
Большинство скриптов в TES основываются на использовании if… elseif и их вариаций.
Очень важно полностью понимать эти конструкции, так как условия могут запускать события в игровом мире.
Вообще, условие истинно, если оно имеет значение 1 (или просто “не 0”, то есть –1 также истинно) и ложно, если имеет значение 0.
Есть определенные функции в игре, которые возвращают “истину” в определенных условиях.
Например, взгляните на функцию GetAIPackageDone ниже.
Она возвращает 1 в том фрейме, когда пакет действий для AI завершен.
Все строчки кода между if и endif (которые называются if-блоком) будут исполняться только, когда условие истинно.
Так что:
If ( GetAIPackageDone )
;[делать что-то]
endif
будет исполняться только, когда GetAIPackageDone вернет 1.
В дополнение к просто значению, условие может содержать более расширенный набор условий.
Условия, такие как “А равно В” или “А больше чем В” будут оценены, и все выражение будет истинно (равно 1), когда условие будет выполнено. Например:
if ( GetAIPackageDone == 1 )
;[делать что-то]
endif
является эквивалентом приведенному выше.
Можно проверять следующие условия:
|
Обозначение
|
Условный оператор
|
|
равно
|
==
|
|
не равно
|
!=
|
|
больше чем
|
>
|
|
меньше чем
|
<
|
|
больше или равно
|
>=
|
|
меньше или равно
|
<=
|
Если у вас есть несколько независимых блоков условий, каждый будет оценен отдельно.
Например, если у вас в коде такие строки:
if ( timer >= 2 )
;[Блок A,делать что-то]
endif
if ( timer <= 3 )
;[Блок B, делать что-то другое]
endif
Оба условия будут равны единице и код в блоках будет выполнен, когда timer будет между 2 и 3.
Вы можете создавать вложенные блоки, чтобы условия выполнялись одновременно:
if ( timer >= 2 )
if ( controlvar == 0 )
;[делать что-то]
endif
endif
Код в внутреннем блоке будет выполнен, когда оба условия (timer >= 2 и controlvar == 0 ) равны истине одновременно.
Для более сложных конструкций используйте Else и Elseif.
Elseif проверяет отдельное условие, если предыдущее условие оказалось ложью (если – истиной, то не проверяет)
if ( timer >= 2 )
;[Блок A,что-то делать]
elseif ( timer <= 3 )
; [Блок B, делать что-то еще]
endif
В отличие от вышеприведенного примера, оба блока не могут быть выполнены одновременно.
Если timer >= 2, то исполняется блок А или если timer не >= 2, а <= 3, то есть, в данном случае, если timer < 2, то исполняется блок В.
Во всех других случаях ни один блок не будет исполнен. Можно поставить несколько elseif один за другим:
if ( counter == 1 )
; [Юлок A,что-то делать]
elseif ( counter == 2 )
; [Юлок B, делать что-то другое]
elseif ( counter == 3 )
; [Юлок C, делать еще что-то]
endif
Else создает условие по умолчанию.
Блок else будет выполнен, если только все предыдущие условия оказались ложью:
If ( foo_var == 1 )
[Блок A: делать что-то]
elseif ( foo_var == 2 )
[Блок B: делать что-то еще]
else
[Блок C: делать что-то совершенно другое]
endif
В этом примере блок С будет выполнен, если foo_var не 1 и не 2.
Примечание: Исходя из моего опыта, самый безопасный способ протестировать разные значение одной переменной – использовать elseif вместо многих отдельных if.
Существует максимальное количество возможных условий if-elseif в одном скрипте.
Согласно последней информации он равно где-то 128 (а не 256, как упоминалось ранее).
Слишком большое расстояние между if и endif может также вызвать проблемы.
Они начнутся, если оно (расстояние) будет больше 120-240 строк. (Информация с форума / MentalElf)