DM Guide 16

Материал из Chaotic Onyx
Перейти к навигацииПерейти к поиску


A long time ago in a galaxy far, far away...


Данная статья помечена как устаревшая, её содержание может быть неверным или неактуальным.

Если она не будет актуализирована или не появится веского повода для снятия этой плашки, то вскоре она будет перемещена в Священный архив.

При желании вы можете помочь проекту Onyx и сообществу Animus-logo.png SS13 в целом — загляните на наш Bus Mainframes.gif Портал сообщества.
Morgue.png


Это 16-я глава перевода оригинального руководства по Dream Maker от разработчиков.

Остальные главы руководства и статьи о программировании на коде BYOND от любителей на русском.

Оригинальная 16-я глава руководства на английском языке

Глава 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 – численное выражение.
Возвращает квадратный корень.