DM Guide 16
A long time ago in a galaxy far, far away... |
Данная статья помечена как устаревшая, её содержание может быть неверным или неактуальным. Если она не будет актуализирована или не появится веского повода для снятия этой плашки, то вскоре она будет перемещена в Священный архив. При желании вы можете помочь проекту Onyx и сообществу SS13 в целом — загляните на наш Портал сообщества. |
Это 16-я глава перевода оригинального руководства по Dream Maker от разработчиков.
Остальные главы руководства и статьи о программировании на коде BYOND от любителей на русском.
Глава 16: Математика
Вы когда-нибудь задавались вопросом, почему математики на вас странно смотрят? Где-то в разрядах числа π сокрыт ваш личный дневник в обычном ASCII.
Базовые математические операторы уже были описаны в 6-ой главе. Предусмотрено много дополнительных математических функций для специфических целей. Они описаны в нижеследующих разделах.
Генерация случайных чисел
Случай играет большую роль во многих типах игр, так что DM предоставляет несколько способов генерации случайных чисел. На самом деле они все основаны на генераторе псевдослучайных чисел и только кажутся случайными. Однако, на практике, на них можно положиться для получения чисел без заметного закона распределения.
rand
rand позволяет сгенерировать случайное число из заданного диапазона. Возвращаемое число всегда целое, так что если требуется дробное число, нужно задать больший диапазон и затем разделить результат.
rand | (L=0,U) |
L - нижняя граница. | |
U - верхняя граница. | |
Возвращает число в диапазоне от L до U (включая L и U). |
Если задан только один аргумент, то он считается верхней границей, а нижней границей берется нуль.
Ниже следует пример кода «зелья игрока».
obj/potion/lucky verb/drink() usr.AddLife(rand(-20,20))
В зависимости от удачи пользователя, зелье может нанести 20 урона или восстановить 20 здоровья.
Этот код предполагает, что описана процедура AddLife(), которая лечит или наносит урон мобу. Она аналогична процедуре HurtMe(), описанной в главе 6, но с аргументом, взятым с обратным знаком
prob
prob возвращает true или false с вероятностью, задаваемой в процентах.
prob | (P) |
P – процентная вероятность возвратить true. | |
Возвращает 1 в P процентах случаев, в остальных возвращает 0. |
Она может быть использована для выбора одного из двух возможных результатов. В приведенном ниже примере, зелью дан небольшой шанс наложения на игрока отрицательного эффекта.
obj/potion/health verb/drink() if(prob(20)) //не повезет в 20% случаев usr.AddLife(-10) else usr.AddLife(20)
roll
roll «кидает» несколько костей и возвращает «выпавшую» сумму. Грани костей пронумерованы от единицы и до заданного числа граней, выпадение каждой грани равновероятно.
roll | (dice=1,sides) |
roll | ("dicedsides") |
dice – количество бросаемых костей. | |
sides – количество граней бросаемых костей. | |
Возвращает сумму выпавших на всех костях граней. |
Параметры костей могут быть заданы как два отдельных числовых аргумента или как одна текстовая переменная. Текстовое представление может быть полезно, если вы хотите сохранить параметры костей как одну переменную.
В следующем примере roll использована для подсчета урона оружия.
obj/weapon var/power clipboard power = "1d4" calculator power = "2d6" verb/swing(mob/trg in view(1)) var/damage = roll(power) view() << "[usr] hits [trg] with \a [src] for [damage] point\s!"
И в программировании, и в бою вам приходится довольствоваться тем, что есть.
pick
pick случайным образом выбирает один из её аргументов и возвращает его значение.
pick | (Val1,Val2,...) |
Возвращает одно из заданных значений. |
Если вы хотите, что бы у определенного аргумента была большая или меньшая вероятность быть выбранным, задайте т.н. относительную вероятность. Относительная вероятность равная 200 означает, что аргумент будет выбираться в два раза чаще, при 50 – в два раза реже и т.д.
prob ( | P); Val |
или | P; Val) |
P – относительная вероятность (по умолчанию равна 100). | |
Val – значение с измененной вероятностью выбора. |
В нижеследующем примере pick() использована в коде печенья с предсказанием.
obj/fortune_cookie verb/eat() usr << "The message inside says:" usr << pick ( "Never trust an undead doctor.", "Only trust undead lawyers.", prob(25) "The throne marks the way.", prob(10) "The wall behind the throne is an illusion!" ) del(src)
В этом примере два сообщения имеют нормальную вероятность появления, одно четверть от нормальной вероятности и одно десятую часть. Заметьте, с prob() вместо точки с запятой может использоваться новая строка. Это позволяет выстраивать элементы по линии, если вы любитель этого дела.
abs
abs вычисляет модуль числа.
abs | (N) |
N – численное выражение. | |
В |
min
min возвращает значение минимального из его аргументов.
min | (N1,N2,...) |
N1 – первое численное выражение. | |
N2 – второе и последующие численные выражения. | |
Возвращает минимальное значение. |
max
max возвращает значение максимального из его аргументов.
max | (N1,N2,...) |
N1 – первое численное выражение. | |
N2 – второе и последующие численные выражения. | |
Возвращает максимальное значение. |
round
round округляет число до ближайшего кратного заданному множителю. Если множитель не задан (или он равен нулю), возвращает целую часть. Обратите внимание, что при множителе равном 1, число округляется до ближайшего целого.
round | (N,M) |
N – численное выражение, требующее округления. | |
M – множитель. | |
Возвращает ближайшее к N число кратное M. |
sqrt
sqrt вычисляет квадратный корень числа. Эта операция эквивалентна возведению числа в степень ½ при помощи оператора **, представлена в таком виде для удобства.
sqrt | (N) |
N – численное выражение. | |
Возвращает квадратный корень. |