Разделы:  

Флаги и переменные

Введение

Флаги и переменные – это наиважнейшая особенность ERM для трансформации Героев в высокодинамичную игру, отвечающую на действия игрока. ERM скрипты могут быть написаны без использования флагов и переменных, но это будет сугубо локальный подход.

Условные флаги

Флаг – это условный рычаг, который имеет положение Истина (1) или Ложь (0). Как и двоичные числа, они имеют только два значения. В начале все флаги установлены на Ложь (0). Значение 1 (Истина) обычно называют "установлен", 0 (ложь) - "не установлен".

Установка флагов

В ERM есть 1000 условных флагов и каждый из них обладает своим номером от 1 до 1000. Флаги устанавливаются с помощью ресивера IF, используя опцию V. Чтобы установить флаг на Истину, используйте значение 1, а чтобы на ложь, значение 0.
Например: В дополнение к опции V, ещё есть несколько опций ресивера IF (A,S,R) для установки первых 10 флагов за раз. Смотрите ресивер IF для подробной информации.

Использование условных флагов

Обычно флаги используют для проверок на что-либо как условие. Например, если вы хотите, чтобы при посещении объекта на карте показывалось сообщение только в первый раз любому герою, и никогда больше, вы можете использовать флаги для этой цели; сообщение будет показываться, если флаг был ложь (не установлен) и дальнейшей командой вы изменили его значение на Истину (1), так, если в следующий раз объект будет посещён, сообщение не будет показано. Символ для определения флага (или переменной) - & (амперсанд), который обязательно предшествует значению флага (переменной) в ресиверах, или предшествуя точке с запятой в триггерах. Амперсанд указывает, что нужно проверить флаг. Если тест для флага-"истины" (т.е. установленного на 1), просто используется номер флага. Если тест для флага-"лжи" (т.е. установленного на 0), используют минус (-) перед номером. Так, если нужен флаг №5 как Истина, вы должны использовать &5, а если флаг нужен как №5 - ложь, вы должны использовать &-5.
Пример кода:

Проверка нескольких флагов

Иногда вам требуется проверить более одного флага или переменных. Чтобы сделать это, отделите каждый флаг (переменную) слэшем (/). Если существует несколько флагов или переменных для проверки, все условия должны быть выполнены перед выполнением ресивера. Например, если вы хотите, чтобы действовало, когда флаг №7 - истина, флаг №8 - ложь, и флаг 10 - истина, если хоть один из флагов будет иметь другое значение, сообщение не появится.
Пример кода:

Инициализация флагов

При инициализации флаги 1..500 будут сброшены на Ложь (0), но флаги 501..1000 будут хранить своё последнее значение, если вы начали новую карту без перезапуска самой игры. Они могут быть использованы для кампаний, в которых вы хотите использовать значения флагов для последующих карт в кампаниях. Если вы избегаете потенциальной возможности того, что флаги будут отличатся от Лжи (т.е, вам нужно, чтобы все флаги были 0), установите флаги от 500 и дальше на 0 в начале карты (или в начале скрипта - команда IF:V), которые вы хотите использовать.

Особые флаги

Некоторые флаги имеют специализированные значения в игре.
Флаг 1 используется некоторыми командами для хранения результата и определения результата условных флагов (проверить значение) (см. выше). Следовательно, не рекомендуется использовать флаг 1 для необходимых в дальнейшем значений. Или, для верности, не используйте этот флаг вообще, ведь есть и другие.

Флаг 996 автоматически очищается (устанавливается на ложь), когда выполняется любая опция !!LE и устанавливается на 1 (истина), если там (в локации, определённой командой LE) нет локального события (помните, что события исчезают после первого посещения).

Флаг 997 и 998 хранят следующее:
Флаг 997 хранит мультиплеерный статус битвы.
= 0 (ложь), если это битва на данном компьютере,
= 1 (истина), если это интернет-битва.

Если флаг 997=1, тогда флаг 998=0, ИИ атакует игрока-человека на другом компьютере.
Заметьте, что битва запускается только на одном ПК, но этот ПК удалён от текущего активного игрока.
Флаг 998=1, если битва Человек на Человека. Здесь у нас реальная мультиплеерная битва.

Вы можете использовать оба флага в триггерах BA0 или BA50, например:

Флаг 999, который устанавливается на 1, если текущий игрок (который активировал триггер) - игрок "здесь" и 0, если он или она на другом ПК. ИИ имеет всегда значение 0. Если флаг 999 установлен, вы можете быть уверены, что эта битва - человек против ИИ, причём человек за данным компьютером. Работает для всех триггеров.
Однако, учтите, что для сетевой битвы в бою флаг 999=1 только для той стороны, кто был инициатором битвы. Для другой стороны флаг 999 всегда будет установлен на ложь, даже если в битве его ход.

Флаг 1000 имеет два значения, зависящих от места использования (триггер битвы или нет). Для не-битвы этот флаг будет установлен на истину, когда хозяин героя, игрок-человек, посетит объект на карте, триггер, как объект или субъект. Если компьютерный (ИИ) герой посетил объект, флаг 1000 будет установлен на ложь. Опять же, вы можете установить значение этого флага, но это не безопасно, поскольку вы можете проверить это значение в определённом скрипте, герой ли игрока или ИИ.
Поэтому, если проверять условные флаги, -1000 значит ИИ, а 1000 значит человек.

Для боевых триггеров (например, !?BA, !?BG, !?BF, и т.д.) флаг 1000 проверяет, настоящая или теоретическая (ИИ) битва. Если флаг 1000=1 (истина), это значит, что битва настоящая (как минимум имеется один оппонент-человек). Если 1000=0 (ложь), это значит, что теоретическая ИИ-битва.

Показ значений флагов в сообщениях

Чтобы показать значение флага (0 или 1) в сообщении, используйте %F, далее - номер флага для показа статуса (1..1000). Для показа значения флага №4 в сообщении, вы должны использовать %F4. Показ значения флага может быть полезен как средство помощи в отладке неработающего скрипта.
Пример:

Сравнение значений

Для сравнения игровых параметров к определённому значению, вы можете использовать следующий способ: …[знак сравнения] значение…
Результат сравнения записывается во флаг 1. Вы можете использовать это для дальнейших сообщений.

Пример сравнения значений, используя ресивер GE:
!!GE100:F5 – установить день первого появления: 5 для Глобального события (стандартный синтаксис).
!!GE100:F=5 – проверить, если день первого появления 5 и установить условный флаг 1 на 0, если не так, на 1, если верно.
!!GE100:F<>5 – проверить, если день первого появления не 5 и установить условный флаг 1  на 0, если не так, на 1, если верно.
!!GE100:F><5 – см. предыдущее описание.
!!GE100:F>5 – проверить, если день первого появления более 5 и установить условный флаг 1 на…
!!GE100:F>=5 – проверить, если день первого появления более или равный 5 и становить условный флаг 1 на…
!!GE100:F=>5 – см. предыдущее описание.
!!GE100:F<5 – проверить, если день первого появления менее 5 и установить условный флаг 1 на…
!!GE100:F<=5 – проверить, если день первого появления меньше или равен 5 и установить условный флаг 1 на…
!!GE100:F=<5 – см. предыдущее описание.

Для WoG 3.58f существует баг с проверками. Корректно сравнивают лишь проверки =, >, >=. Остальные же должны сравниваться через запись в переменную, потому что расцениваются движком игры некорректно.

Переменные

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

Если параметр команды показывается как $, это значит, что это значение может быть записано в переменную. Если параметр показан как #, это значит, что его можно только установить, но не прочитать. И если он показан как ?$, это значит, что параметр можно прочитать, но не установить.

Типы переменных и их возможные значения

a - пока не используется
b - пока не используется
c - хранит значение текущего дня (номер игрового дня)
d - добавляет или убавляет значения от переменной
e1…e100 - переменные с плавающей запятой
e-1…e-100 - основные триггерные переменные с плавающей запятой
f…t - стандартные переменные (ещё называются быстрыми переменными)
v1…v10000 - стандартные переменные
w1…w200 - переменные героя (уникальны для каждого героя)
x1…x16 - параметры функции (зависит от функции)
y1…y100 - функциональные переменные (уникальны для каждой функции)
y-1…y-100 - основные триггерные переменные
z1…z1000 - текстовые переменные
z-1…z-10 - функциональные текстовые переменные (уникальны для каждой функции)
Замечание(показать)

Все целочисленные переменные могут принимать значения от -2147483647 до +2147483647.
Переменные с плавающей запятой имеют диапазон от -3,4×1038 до +3,4×1038 (точность до 7 десятичный цифр)
Текстовые переменные могут иметь длину до 511 символов.

Запись переменных

Есть несколько путей записи переменных.
Ресивер VR может быть использован для установки значения любой переменной, и может быть ещё использован для арифметических операций с переменными, такими как сложение, вычитание, умножение или деление.

Исключение – переменные z, которые используются только для установления текста, в отличии от числовых переменных.

Пример установки значение 17 переменной v5:

Второй путь записи значений в переменные - это считывание значений с объектов или установок игры, таких, как номер героя, значение золота, кол-во самоцветов у игрока 4, или тип или подтип любого объекта. Для установки значения через этот путь, после команды используется знак вопроса (?), далее следует переменная, в которой и будет храниться значение.
Примеры:

Установка типа объекта в координатах x=10, y=15, уровень=1 (подземелье) в переменную j:
Установка кол-ва кристаллов (тип ресурса = 4), которые на данный момент есть у зелёного игрока (номер 3) в переменную v12:

Третий способ установки переменной - внутренняя ссылка. Некоторые ERM команды требуют номер v или z-переменной, а не букву. В этом случае, вместо использования знака вопроса, вы просто вводите номер параметра и значение командой для данной переменной (например, если команде нужен номер для v-переменной, вы ставите значение 17, которое будет установлено в переменную v17).

Использование переменных вместо чисел

Раз вы можете устанавливать значения переменных, вы можете использовать эти переменные вместо чисел своего кода. Почти везде, где вы можете просто ввести число, вы можете использовать любую переменную, содержащую значение, которое будет использоваться, если оно приемлемо по диапазону значений опции. Исключения - это переменные z, использующиеся для текстовых значений, таких, как имя героя, название артефакта, или слово или фраза. Очевидно, что они должны будут использоваться с командами, отличными от числовых.
Пример использования v-переменных для установки баллов заклинания героев: Пример использования z-переменных: добавление "Сэр" к имени героя: Замечание: оба предыдущих примера кода должны иметь триггер.

Условия с переменными

Как и флаги, вы можете использовать значения одной или более переменных как условия. Принцип действия тот же, однако, вместо номера флага (со знаком минус впереди или без него) вы вводите имя переменной. Далее, за знаком сравнения (=, >, <, <>, >= или <=) – число (или переменную), с чем вы хотите сравнить.

Пример условия, если v1 больше либо равно 7, показать сообщение:

Пример условия, сравнивающего текст, установленный в переменную z1, с текстом в переменной z2, и если они одинаковы, показать сообщение:

Проверка нескольких переменных

Выполняется тем же путём, что и с флагами, отделяя каждое условие слэшем (/). Вы можете смешивать и сравнивать флаги и переменные в одном условии, как в примере ниже, который даёт текущему герою артефакт Магические Доспехи, но только если выполнены условия (установлены флаги и переменные с определённым значением):

В примере выше героя получит артефакт, только если выполнятся все указанные условия:

  1. Флаг 7 должен быть Истиной (1);
  2. Значение в переменной v2 должно быть больше 6;
  3. Флаг 1 должен быть ложью (0);
  4. Значения переменных y4 и v8 должны быть равными.

Синтаксис проверки - условие ИЛИ: |

!(!|?|#)XX&c1/c2/c3|c4/c5/c6:…;
Полное условие будет таким: (c1 И c2 И c3) ИЛИ c4 ИЛИ c5 ИЛИ c6
Комментарий:
- секция ИЛИ может быть одна, либо обязательно после секции И
- если есть только секция ИЛИ, полное условие будет истиной, если хотя бы одно состояние ИЛИ - истина
- может быть до 16 условий И и до 16 условий ИЛИ

Другие типы переменных

Как ранее упоминалось, есть несколько различных типов переменных, каждая используется для разных нужд кода.

Стандартные переменные (f..t) и (v1..v10000) могут использоваться практически повсеместно, но определённые команды требуют номер v-переменной для записи результата. Оба типа используются для записи целых значений.

Переменные героев (w1..w200) хранят тот же тип информации, что и v-переменные, но они уникальны для каждого героя, Т.е. два разных героя могут иметь разные значения, записанные в их переменных w1 (или w2, w10 или более.. до w200). Для установки или проверки одной или более w-переменных вы сначала должны установить номер героя, у которого будет браться значение командой IF:W.
Например, если вы хотите установить или проверить w5 героя 27 (Джем), вы сначала должны вставитьперед ресивером(-ами), работающими с переменной w5.
Для текущего героя используйте -1 вместо номера. Так, означает, что следующие обращения к переменным w относятся к текущему герою (до использования другой команды IF:W)
См. также: IF:W, ресивер VR

Исключение: команда !!HT:W, где можно использовать только первые 100 w-переменных.

Переменные - параметры функции (x1..x16) также хранят те же типы значений, что и переменные v и w (числовые). Но данные переменные существуют лишь внутри функций (кода после триггера функции) и пропускают в функцию значения командой P (P - параметры). См. ресивер FU для детальной информации о функциях. Если вы вызываете функцию из другой функции, любые x-переменные, которые не были установлены (как новые параметры), хранят своё старое значение в новой функции. Когда используются с ресивером DO, параметр x16 хранит номер круга функции.

Локальные переменные (y1..y100) похожи на x-переменные тем, что используются лишь в функциях. Но они уникальны для каждой функции. Так, если вы имеете 4 разных функции, каждая имеет свои значения y-переменных. Как большинство других переменных, они хранят только числовые значения. Также эти переменные могут быть использованы вне функции, но помните, что при срабатывании другого триггера (HL, BA и т.д.) в середине вашего скрипта, значения этих переменных могут уничтожиться.

Переменные с плавающей запятой (e1..e100) Они используются в основном как y-переменные:

- не записываются в сохранённой игре;
- уникальны для каждой функции;
- установлены на 0 при старте каждой функции/круга функции;
- восстанавливаются при выходе с другой функции.

Вы можете использовать их для установки параметров, но главная особенность - использование выражений с плавающими запятыми и их дальнейшая запись в целое число.
Вы можете использовать арифметические операции ресивера VR для e-переменных с плавающей запятой, но все числа в выражении должны быть целыми.
Вы также можете показать значение e-переменной в сообщении, используя команду %E#. В этом случае будет показано только 3 знака после запятой.

Баг - ERM не обрабатывает нестрогие сравнения e-переменных: <=, >=, =>, =<.

Пример:

Триггерные локальные переменные

y-1…y-100 - целые переменные
e-1…e-100 - переменные с плавающей запятой
Вы можете использовать эти переменные там, где y и e-переменные могли использоваться раньше.
Характерные особенности:

  1. Они НЕ сохраняются при сохранении игры. Фактически, каждая секция триггера будет полностью завершена, и вы не сможете сохранить и загрузить игру в работе триггера.
  2. Эти переменные различны для каждого триггера, и если один триггер работает внутри другого, они будут иметь разные значения этих переменных. Вы не можете передавать значения из триггера к триггеру используя эти переменные.
  3. Все эти переменные установлены на 0 при старте любого триггера.
  4. Все функции, вызванные из одного триггера, смогут обмениваться этими переменными, т.к. они завязаны на триггере, но не на функции.

Текстовые переменные (z1..z1000) хранят символы (один или более) и не могут быть использованы для записи числовых переменных; они могут записывать число как текст, но число нельзя будет приравнять или выполнить с ним арифметические действия в любом виде. Z-переменные могут быть соединены, но имеют ограничение в 512 символов каждая. Они могут быть сравнены с другими z-переменными. Когда сравниваются две z-переменных, сравнение НЕ зависит от регистра. Так, если в переменной z1 записано «Это», она будет равна переменной z2, в которой записано «эТО» или любая другая комбинация больших и малых символов. При сравнении пустые линии или строки z-переменных игнорируются. 500 новых z-переменных добавлено в ERM 2.60 (WoG 3.57) к уже существующим 500, но помните, что z501-z1000 не сохраняют своё значение между разными картами.
Для этого используйте z301-z500.
Замечание: сообщения в тестовых переменных не должны содержать символов ; и ^.
Пример:

Локальные текстовые переменные (z-1..z-10) аналогичны y-переменным, но записывают значение как z-переменные. Если вы установите одно значение переменной z-, далее вызовите функцию, устанавливающую другие значения, то при возвращении к начальной функции вы получите значение переменной, равной установленной до вызова функции. Так вы можете использовать передачу переменной от функции к функции, но не можете использовать возвращённое значение. Как и обычные z-переменные, они ограничены 512 символами.

Специальные переменные

В ERM есть несколько переменных, имеющих специальное значение. Как флаги 1 и 1000, специальные переменные могут установлены как вы захотите и в любое время, но это не рекомендуется, т.к. есть риск, что другие команды могут использовать их.

Переменная v1 используется для записи результата некоторых команд. Это не частое явление, вы можете использовать её в своих скриптах для хранения выражения, но на непродолжительное время; другими словами, не устанавливайте значение в переменную v1, если вы хотите хранить её значение неизменным долгое время.

Переменная z1 используется для записи текста, введенного игроком в расширенном окне диалога. Если вы не используете расширенные диалоговые окна, вы можете не беспокоиться об этом, но всё же лучше не использовать z1 для долговременного хранения.

Переменные v998, v999, и v1000 всегда записывают позицию объекта или события, которое посетил текущий герой, или координаты героя (например, в триггере !?HM). Лучше оставить эти переменные исключительно для сравнения их значений или копировать их значения в другие переменные.

Переменная x16 (используется в функциях, вызываемых ресивером DO), хранит текущий номер круга функции. Например, если функция повторяется 12 раз (от 1 до 12), первый раз x16 будет равна значению 1, второй раз - 2 и т.д. Если вы измените значение переменной x16, вы сможете "ускорить" или "замедлить" выполнение функции, или выйти из функции, установив значение x16 на конечное значение (или большее), использованное в ресивере DO.

Инициализация переменных

Как и флаги, все переменные в начале игры имеют значение 0. Однако, как и флаги, некоторые переменные НЕ будут сброшены между картами без перезапуска самой игры. Опять же, это может помочь вам в создании кампаний.

Когда вы начинаете игру, следующие переменные будут установлены на 0 или примут пустое значение "" (для z-переменных): f…t, v1…v500, v1001-v10000, z1…z300, z501-z1000, w1-w50.

Следующие переменные будут сохранять своё текущее значение между играми (только если вы не перезапустите игру): v501-v1000, z301-z500, w51-w200.

Показ переменных в сообщениях

Значения переменных (и флагов) могут быть показаны в сообщениях, используя специальный код для каждого типа переменной:

%F# → показать текущее состояние флага #
%V# → показать значение v-переменной (# = 1..10000)
%V@ → показать значение "быстрой" переменной (@ = f…t)
%W# → показать значение переменной героя (# = 1…200)
%X# → показать значение переменной-параметра функции (# = 1…16)
%Y# → показать значение функциональной переменной y (# = 1…100)
%Z# → показать текстовую переменную z (# = 1…500)
%$macro$ → показать знчение переменной, ассоциируемой с макро-именем "macro"

Замечание: для показа значения переменных всегда используются большие буквы после знака %, и только в отношении к быстрым переменным используются всегда маленькие буквы.
Пример показа сообщения с быстрой переменной j, обычной переменной v21 и z-переменной z100 в текстовой переменной: Здесь подразумевается, что в переменной z100 хранится имя героя (скажем, это Клэнси), в переменной j хранится кол-во золота у игрока (скажем, 750), переменная v21 содержит цену артефакта (скажем, 2000), а сообщение будет выглядеть так:

Простите, Клэнси, но вы имеете только 750 золота, вам нужно 2000 золота для покупки этого артефакта.

Внедрение переменных как часть текстовых переменных

Используя команды для показа сообщений (см. выше), вы можете добавлять переменные как часть текстовой переменной. Это удобный способ контакта с z-переменной.

Пример комбинирования нескольких z-переменных и v-переменных вместе в одной z-переменной: Здесь подразумевается генерация случайного числа и запись его в переменную v25 (пусть будет 247), игроку будет показано следующее сообщение:

Клэнси всегда хотел иметь зелёную лошадь, но его лошадь была красная.
Ему было 247 лет, и Клэнси никогда не видел зелёную лошадь за всю свою жизнь!

Косвенные ссылки на переменные

Ресиверы, требующие координаты на карте (X, Y и Уровень) в теле ресивера, могут быть использованы с косвенными ссылками на переменные. Это одно число, которое идёт первым и последующие v-переменные содержат X, Y и Уровень для использования. Например, если у вас значение X записано в переменную v100, Y - в v101 и Уровень в v102, вы можете использовать число 100 в ресивере для точки, находящейся в этих координатах.
Пример использования локальных событий с косвенными ссылками:

Косвенные переменные

Иногда полезно уметь обращаться к переменной (например, число между 1 и 1000 для переменных v), номер которой записан в другой переменной. В этом случае вы можете использовать повторение функции как в ресивере DO для записи информации в переменную. Взамен вставки номера после v, вы можете вставить другую переменную и значение, сохранённое в ней, будет номером переменной.
Пример индексных v-переменных, используя y-переменные: Будет показано следующее сообщение:

Значение переменной v7 равно 5.

Это потому, что y10 равно 7. И vy10 значит, что v-переменная имеет номер, сохранённый в переменной y10, которая имеет значение 7. Следовательно, v7 становится равной 5.

Макросы

Если вы хотите обращаться к переменной по более значимому имени, вы можете установить макрос ресивером MC. Макрос может быть использован почти в любом месте, где используется переменная и взаимодействует с переменной.
Макрос – это ссылка с именем, ограниченная с двух сторон знаками доллара: $treasure$.
Для большей информации по макросам см. ресивер MC.

Руководство по использованию переменных

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

Использование y-переменных вне функций

Есть сто y-переменных [1..100]. Вы можете использовать их почти везде. Но каждый триггер функции сохраняет все текущие значения y-переменных в специальных слотах, сбрасывая их на 0, и после выполнения последнего ресивера восстанавливает их обратно.

Пример:

Дополнительные примеры:

Как использовать переменные героя?

Для использования w-переменных, сперва вы должны использовать команду !!IF для героя, у которого хотите изменять или узнать (используйте -1 для текущего героя). Использовав эту команду, все w-переменные далее ищутся у указанного героя до тех пор, пока вы не смените героя. Используйте эту команду перед установкой, тестированием или проверкой w-переменных. Так, если вам нужно использовать w-переменные героя #147 (Дракон), команда будет такова: Тогда вы сможете установить переменную w1 в точности так же, как и любую другую переменную (см. пример ниже).

Вы имеете 1 объект и 1 событие. Если герой посетил объект, событие среагирует должным образом.
Поставим объект Волшебный колодец в позицию 10/15/0.
Поставим событие в 27/18/0.

Как я могу узнать номер текущего дня?

Это просто. Модификатор "с" работает так же, как и "d", но добавляет текущий день.
Вы можете добавлять текущий день к любым другим значениям. Добавить к атаке текущего героя номер текущего дня, установить защиту равную номеру текущего дня.
Замечание: c - это НЕ переменная, вы не можете установить, проверить или получить в неё значение. Если вы хотите проверить номер дня, запомните её в другую переменную.
Пример:

Подсказка о генерации случайного значения

Давайте поговорим о генерировании чисел от 1-100, но кроме 42, 81 или 99.
Здесь три ненужных номера, так что генерируется число от 1 до 97.
Затем, если это 42 или выше, добавляем 1. Далее, если это 81 или выше, добавляем 1. Если это 99 или выше, добавляем 1.
Вы теперь имеете случайное значение, от 1 до 100, но кроме 42, 81, или 99.

Так, если вы хотите генерировать число от 1 до 100, исключая 10..19 и 73, вы генерируете число от 1 до 89, затем, если оно 10 или выше, добавляете 10, если 73 или выше, добавляете 1.

См. также:
Триггеры: общая информация
Ресиверы: общая информация