API UO Random - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
UO.Random
Оглавление · Алфавитный указатель · Files / JSON / Data
ClassicUO • Runtime API
Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max−1. Результат можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
Точный синтаксис
UO.Random(max:Integer) -> Integer
UO.Random(min:Integer, max:Integer) -> Integer
Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.
Параметры
min— Первый аргумент ТОЛЬКО двухаргументной формы — включённая нижняя граница, целое от −2147483648 до 2147483647. Может быть отрицательной, нулём или положительной. Должна быть не больше max. В одноаргументной форме min отсутствует, а переданное число означает max.max— В двухаргументной форме — второй аргумент, включённая верхняя граница Integer от −2147483648 до 2147483647. В прежней одноаргументной форме — единственный аргумент, ИСКЛЮЧЁННАЯ верхняя граница, целое от 0 до 2147483647; Random(0) возвращает 0. Отрицательное max в одноаргументной форме недопустимо.
Возвращает
Integer — одно псевдослучайное целое число. При двух аргументах min ≤ результат ≤ max; обе границы могут выпасть. При одном положительном аргументе 0 ≤ результат < max. Повторение ранее выпавшего числа допустимо: команда не выбирает числа без повторений.
Поведение
- Поддерживаются ровно две формы: UO.Random(max) и UO.Random(min, max). Вызов без аргументов не зарегистрирован. Для диапазона «от и до» используйте два аргумента.
- Random(5, 5) всегда возвращает 5. Random(10, 1) сообщает ошибку диапазона: границы не переставляются молча. Random(-10, -1) корректен, потому что −10 меньше −1.
- Обе границы — целые Integer; для десятичных долей можно выбрать целые единицы нужного масштаба и затем разделить. Например, Random(0, 100) / 100.0 даёт дискретные значения от 0 до 1 с шагом 0,01.
- Полный диапазон Random(-2147483648, 2147483647) допустим. Реализация не прибавляет 1 к max в Integer и поэтому не переполняется на верхней границе. Для широких диапазонов используется отбрасывание лишних значений, чтобы остаток от деления не смещал выбор.
- Вызов вычисляет число локально, не отправляет пакеты и сам по себе не делает паузу. Для случайной паузы передайте результат в UO.Wait. Минимальную необходимую серверу задержку должен сохранять ваш скрипт.
- Генератор принадлежит runtime скрипта. Одновременные вызовы синхронизированы. Случайные значения не задают воспроизводимую последовательность; параметра seed у UO.Random нет. Это другая функция, чем BASIC Rnd.
- Сохраните результат в VAR, если одно и то же число нужно несколько раз. Два отдельных вызова Random могут вернуть разные значения. Команда не проверяет, допустима ли выбранная клетка для движения или переноса: это проверяет соответствующая игровая команда.
Примеры
Пример 1. Случайное число от 1 до 6
# Случайное число от 1 до 6
#
# Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max
# включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max−1. Результат
# можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
#
# Integer — одно псевдослучайное целое число. При двух аргументах min ≤ результат ≤ max; обе
# границы могут выпасть. При одном положительном аргументе 0 ≤ результат < max. Повторение ранее
# выпавшего числа допустимо: команда не выбирает числа без повторений.
# min получает lower=1, max получает upper=6. Возможны ровно шесть значений: 1, 2, 3, 4, 5 и 6.
# roll хранит одно полученное число. Print выводит именно его; STR преобразует Integer в строку.
# Повторный запуск может дать то же число.
SUB RollDice()
VAR lower = 1
VAR upper = 6
VAR roll = UO.Random(lower, upper)
UO.Print('Roll: ' + STR(roll))
END SUB
Разбор параметров и выполнения:
- min получает lower=1, max получает upper=6. Возможны ровно шесть значений: 1, 2, 3, 4, 5 и 6.
- roll хранит одно полученное число. Print выводит именно его; STR преобразует Integer в строку. Повторный запуск может дать то же число.
Пример 2. Случайная пауза между 350 и 700 миллисекундами
# Случайная пауза между 350 и 700 миллисекундами
#
# Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max
# включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max−1. Результат
# можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
#
# Integer — одно псевдослучайное целое число. При двух аргументах min ≤ результат ≤ max; обе
# границы могут выпасть. При одном положительном аргументе 0 ≤ результат < max. Повторение ранее
# выпавшего числа допустимо: команда не выбирает числа без повторений.
# min=350 и max=700 задают включённые границы задержки. Результат, например 350, 512 или 700,
# записывается в delay.
# UO.Wait получает один аргумент delay в миллисекундах. Пауза происходит в Wait; Random только
# вычисляет число.
# Подберите нижнюю границу под действия и требования вашего сервера. Случайная задержка не
# заменяет ожидание ответа сервера, если следующему действию нужен этот ответ.
SUB RandomPause()
VAR delay = UO.Random(350, 700)
UO.Print('Waiting ' + STR(delay) + ' ms')
UO.Wait(delay)
UO.Print('Wait finished')
END SUB
Разбор параметров и выполнения:
- min=350 и max=700 задают включённые границы задержки. Результат, например 350, 512 или 700, записывается в delay.
- UO.Wait получает один аргумент delay в миллисекундах. Пауза происходит в Wait; Random только вычисляет число.
- Подберите нижнюю границу под действия и требования вашего сервера. Случайная задержка не заменяет ожидание ответа сервера, если следующему действию нужен этот ответ.
Пример 3. Выбрать одно из трёх действий условием
# Выбрать одно из трёх действий условием
#
# Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max
# включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max−1. Результат
# можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
#
# Integer — одно псевдослучайное целое число. При двух аргументах min ≤ результат ≤ max; обе
# границы могут выпасть. При одном положительном аргументе 0 ≤ результат < max. Повторение ранее
# выпавшего числа допустимо: команда не выбирает числа без повторений.
# min=1, max=3: choice равен 1, 2 или 3. Каждой ветке соответствует одно из допустимых чисел.
# Вызов Random выполняется один раз до IF. Если вызывать его заново в каждом условии, это будут
# разные выборы.
# Замените Print нужными действиями вашего скрипта, сохранив проверки условий, дальности и
# ответа сервера для этих действий.
SUB ChooseAction()
VAR choice = UO.Random(1, 3)
IF choice == 1 THEN
UO.Print('First action')
ELSE
IF choice == 2 THEN
UO.Print('Second action')
ELSE
UO.Print('Third action')
END IF
END IF
END SUB
Разбор параметров и выполнения:
- min=1, max=3: choice равен 1, 2 или 3. Каждой ветке соответствует одно из допустимых чисел.
- Вызов Random выполняется один раз до IF. Если вызывать его заново в каждом условии, это будут разные выборы.
- Замените Print нужными действиями вашего скрипта, сохранив проверки условий, дальности и ответа сервера для этих действий.
Пример 4. Выбрать место для MassMove внутри рюкзака
# Выбрать место для MassMove внутри рюкзака
#
# Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max
# включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max−1. Результат
# можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
#
# Integer — одно псевдослучайное целое число. При двух аргументах min ≤ результат ≤ max; обе
# границы могут выпасть. При одном положительном аргументе 0 ≤ результат < max. Повторение ранее
# выпавшего числа допустимо: команда не выбирает числа без повторений.
# Первый Random: min=50, max=90, результат x. Второй: min=60, max=100, результат y. Это две
# независимые координаты внутри контейнера, не экранные координаты и не координаты карты.
# В MassMove delay=350 мс, quantity=10 целых items, type=0 определяется первым ручным переносом,
# destination=backpack, x/y берутся из переменных, z=0.
# После команды перетащите образец мышью из исходного контейнера. Всё это включение MassMove
# использует одну выбранную позицию. Для случайной позиции каждого отдельного предмета нужен
# цикл с отдельными MoveItem, а не один вызов MassMove.
# Выберите диапазон X/Y внутри доступной области вашего рюкзака. Сервер может изменить
# размещение предметов.
SUB RandomBagPosition()
VAR x = UO.Random(50, 90)
VAR y = UO.Random(60, 100)
UO.MassMove(350, 10, 0, 'backpack', x, y, 0)
UO.Print('Drag a source item; position: ' + STR(x) + ', ' + STR(y))
END SUB
Разбор параметров и выполнения:
- Первый Random: min=50, max=90, результат x. Второй: min=60, max=100, результат y. Это две независимые координаты внутри контейнера, не экранные координаты и не координаты карты.
- В MassMove delay=350 мс, quantity=10 целых items, type=0 определяется первым ручным переносом, destination=backpack, x/y берутся из переменных, z=0.
- После команды перетащите образец мышью из исходного контейнера. Всё это включение MassMove использует одну выбранную позицию. Для случайной позиции каждого отдельного предмета нужен цикл с отдельными MoveItem, а не один вызов MassMove.
- Выберите диапазон X/Y внутри доступной области вашего рюкзака. Сервер может изменить размещение предметов.
Пример 5. Отрицательное смещение относительно исходной координаты
# Отрицательное смещение относительно исходной координаты
#
# Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max
# включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max−1. Результат
# можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
#
# Integer — одно псевдослучайное целое число. При двух аргументах min ≤ результат ≤ max; обе
# границы могут выпасть. При одном положительном аргументе 0 ≤ результат < max. Повторение ранее
# выпавшего числа допустимо: команда не выбирает числа без повторений.
# В обоих вызовах min=−2 и max=2: возможны −2, −1, 0, 1, 2. GetX/GetY без аргументов читают
# координаты персонажа.
# x/y — лишь рассчитанная клетка в квадрате вокруг персонажа. Этот пример не начинает движение и
# не бросает предметы.
# Случайная клетка может оказаться непроходимой или за границей карты. Перед игровым действием
# используйте подходящие проверки координат и маршрута.
SUB PickNearbyCoordinate()
VAR offsetX = UO.Random(-2, 2)
VAR offsetY = UO.Random(-2, 2)
VAR x = UO.GetX() + offsetX
VAR y = UO.GetY() + offsetY
UO.Print('Candidate tile: ' + STR(x) + ', ' + STR(y))
END SUB
Разбор параметров и выполнения:
- В обоих вызовах min=−2 и max=2: возможны −2, −1, 0, 1, 2. GetX/GetY без аргументов читают координаты персонажа.
- x/y — лишь рассчитанная клетка в квадрате вокруг персонажа. Этот пример не начинает движение и не бросает предметы.
- Случайная клетка может оказаться непроходимой или за границей карты. Перед игровым действием используйте подходящие проверки координат и маршрута.
Пример 6. Сохранённая совместимость с Random(max)
# Сохранённая совместимость с Random(max)
#
# Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max
# включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max−1. Результат
# можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
#
# Integer — одно псевдослучайное целое число. При двух аргументах min ≤ результат ≤ max; обе
# границы могут выпасть. При одном положительном аргументе 0 ≤ результат < max. Повторение ранее
# выпавшего числа допустимо: команда не выбирает числа без повторений.
# В Random(count) есть только max=10: верхняя граница исключена, возможны 0..9. Число 10 не
# выпадает.
# В Random(0, count−1) min=0 и max=9 включительно: допустимый диапазон тот же, но вызов делает
# новый независимый выбор.
# count должен быть положительным для выбора индекса. Особый совместимый случай Random(0)=0 не
# означает, что у пустой коллекции существует элемент с индексом 0.
SUB LegacyIndex()
VAR count = 10
VAR index = UO.Random(count)
VAR equivalent = UO.Random(0, count - 1)
UO.Print('Index 0..9: ' + STR(index))
UO.Print('Another independent index: ' + STR(equivalent))
END SUB
Разбор параметров и выполнения:
- В Random(count) есть только max=10: верхняя граница исключена, возможны 0..9. Число 10 не выпадает.
- В Random(0, count−1) min=0 и max=9 включительно: допустимый диапазон тот же, но вызов делает новый независимый выбор.
- count должен быть положительным для выбора индекса. Особый совместимый случай Random(0)=0 не означает, что у пустой коллекции существует элемент с индексом 0.
Пример 7. Равные границы и полный диапазон Integer
# Равные границы и полный диапазон Integer
#
# Возвращает случайное целое число. Новая форма UO.Random(min, max) выбирает число ОТ min ДО max
# включительно. Прежняя форма UO.Random(max) сохранена: она выбирает от 0 до max−1. Результат
# можно сохранить в переменную и использовать как задержку, координату, индекс или условие.
#
# Integer — одно псевдослучайное целое число. При двух аргументах min ≤ результат ≤ max; обе
# границы могут выпасть. При одном положительном аргументе 0 ≤ результат < max. Повторение ранее
# выпавшего числа допустимо: команда не выбирает числа без повторений.
# min=7 и max=7 дают единственный результат 7.
# min=−100 и max=−50 дают только отрицательные числа, включая обе границы.
# Последний вызов охватывает весь знаковый 32-битный Integer. Его результат может быть
# положительным, отрицательным или нулём.
# Границы передаются от меньшей к большей. Ошибочный вызов Random(10, 1) останавливается с
# сообщением min must not exceed max; его не нужно использовать для перевёрнутого диапазона.
SUB BoundaryExamples()
VAR fixedValue = UO.Random(7, 7)
VAR negative = UO.Random(-100, -50)
VAR signedValue = UO.Random(-2147483648, 2147483647)
UO.Print('Fixed: ' + STR(fixedValue))
UO.Print('Negative: ' + STR(negative))
UO.Print('Signed Integer: ' + STR(signedValue))
END SUB
Разбор параметров и выполнения:
- min=7 и max=7 дают единственный результат 7.
- min=−100 и max=−50 дают только отрицательные числа, включая обе границы.
- Последний вызов охватывает весь знаковый 32-битный Integer. Его результат может быть положительным, отрицательным или нулём.
- Границы передаются от меньшей к большей. Ошибочный вызов Random(10, 1) останавливается с сообщением min must not exceed max; его не нужно использовать для перевёрнутого диапазона.