Как стать автором
Обновить

Комментарии 13

Не совсем понял, почему функция rollDice устроена так странно. По идее, единичный бросок должен давать результат из [1..n], а сделано из [0..n]. Например rollDice(2, 12) должен давать число не от 0 до 24, а от 2 до 24.

Просьба к минусующему, продемонстрировать бросок двух 12-гранных дайсов, чтобы на них выпало (суммарно) 1.

Да, похоже на ошибку. В первом примере автор использовал:
damage += 1+random(6)


А в функции rollDice неожиданно получил
value += random(S+1)


Скорее всего имелось в виду
value += random(S) + 1

Автор же написал, что функция возвращает от 0 до N*S, а не от N до N*S (как в реальных дайсах, нумерованных с единицы). Это для того, чтобы нагляднее продемонстрировать матожидание и дисперсию, в случае с реальными дайсами матожидание сдвигается с каждым добавленным дайсом.
Всё не мог дождаться, когда же дочитаю до обоснования выбора тех или иных распределений в игромеханике… Не дочитал =(
Спасибо за статью. Когда-то тоже ломал голову над своим генератором. Вот мой вариант, может кому пригодится:
param = 0..1000. При 500 симметричное распределение. Чем ближе к 0 тем ближе чаще значения ближе к min.
int Random::irandomminmaxparam(int min, int max, int param)
{
if (param < 0) param = 0;
if (param > 1000) param = 1000;
iseed = ((iseed >> 3)*iseed * 16805 + 789221) % 2147483647;
float k = (0.05 + 1.9*param / 1000)*0.5;
float y;
float x;
if (iseed < 1073741823) {
x = 1 — iseed / 1073741823;
y = k — k*(x*x);
}
else {
x = iseed / 1073741823 — 1;
y = k + (1 — k)*(x*x);
}
return (max — min)*y + min + 0.5;
}
> В стандартной библиотеке C есть rand() % N, но она плохо работает…
А не надо считать рандом остатком от деления. Это ж уже не один раз обсуждали — такая формула дает несимметричное распределение. Правильное использование: N * (rand() / (float)RAND_MAX)
Пытаюсь начать делать игру и столкнулся с выпадением редких/очень редких/уникальных вещей.
Решил через диапазоны, например, 10 чисел из 10 000 означают уникальные вещи, ещё 100 — очень редкие, 1000 — редкие, остальные обычные.
Какой подход на самом деле используется?
Например, в Diablo-подобных играх обычно используется следующий подход. Сначала определяется «база» (сапоги / перчатки и т.д.). Затем по методу, описанному в разделе «произвольные формы» определяется качество предмета — уникальный, редкий, магический или обычный. И затем, если выпал уникальный (и надо определить какой именно — вдруг у вас есть два вида уников, основанных на одной «базе»), тем же методом определяется, какой из них выпал.
По-моему, наибольший интерес представляет собой даже не столько распределения, сколько система расчета оптимального набора статов (характеристик) персонажей.

Допустим, у нас есть роллбой, который делается через ручные кидания кубиков.
Сразу основные проблемы боя:
а) Дисбаланс — есть шанс, что бой пойдет совершенно непредсказуемым образом, в результате чего вымрут все ключевые персонажи ->здравствуй, костыли в сюжет. Есть вариант отказа от обязательного убийства персонажей в таком бою, но все равно это проблема.

б) Чрезмерное затягивание боя. Оптимальный вариант — это бой длительностью 5-10 ходов. Однако попытки решить п.1 могут привести к затяжным боям ходов по 20-30, что лишает смысла саму идею боя.

в) Предсказуемость. Является причиной неудачных попыток решить п.1.
— предсказуемость стартовая, когда положение дел ясно на начало боя
— предсказуемость процесса, когда где-то к середине боя все становится ясно, и кидание кубика становится рутинной занудной обязанностью.

Так вот, я так и не видел нормальных гайдов именно по расчету конкретных численных статов роллбоя и рекомендаций по выбору параметров. Если кто-то приведет ссыль, буду премного благодарен.

Лично мой опыт
1) Система 50/50 с фиксированным уроном. Кидается монетка (орел -попал, решка — промазал) или кубик (например, 1d10: 1-5 промах 6-10 попал, аналогично для других кубиков — 50% успеха). Попал -1хп, промах — ничего. Примерный пресет: 2 героя 3-4хп vs 2-3 врага 1-2 хп. Недостаток — занудно долгий, нединамичный бой с кучей «ударил-промазал».
2) «Продвинутый» вариант с критом и контратакой. На примере 1d10
— 1,2,3 контратака (можно порезать 1,2 или даже 1), -1хп атакующему.
— 4,5 промах, нет урона.
— 6,7,8,9 попадание, 1хп урон.
— 10 крит (можно увеличить 9,10 или 8,9,10), 2хп урон.
— ограничение количества контратак — одна КА в раунд на 1го персонажа. 3vs1, даже если все трое критически промазали, контратакует их враг один раз.

Примерный пресет:2 героя 4-6хп vs 2-3 врага 1-2 хп.!!! Модифицировать цифирки нужно ОЧЕНЬ осторожно (здоровье героям можно поднять). Возможен вариант крит 9-10 или даже 8-10, контратаку можно порезать где-то до 1-2.
!!! Ни в коем случае не ставьте контратаку 1-5 (т.е. без промахов) и очень осторожно убирайте ограничение на количество контратак. Иначе будет бой с вероятностью победы около 50% при любом разумном соотношении хипов и количества персонажей. Неразумные варианты (100 хп vs 1хп) не годятся.

3) Вариант с рандомным уроном. Это вариант №1 (без критов и прочего), когда кидается кубик еще и на дамаг. Примерный пресет: дамаг 1d4, 2 героя 10-12хп, 2-3 врага 4-6 хп.

4) Скрещивать варианты 2 и 3 не рекомендую, балансирование возможно только с помощью скриптов, автоматически прогоняющих много вариантов. Где-то у меня валялся скрипт и пресеты, могу выложить, если надо.

5) Особо отмечу, зачем нужен кубик 50% попадания. Я как-то попробовал сделать бой по варианту 3 с гарантированным попаданием (просто кидался кубик 1d4 за каждого). В этом случае критическое значение при малых хп является порядок действий персонажей. Тот, кто атакует первым. имеет преимущество..
Грубо говоря, пусть у нас бой 3 vs 3, первая атакующая тройка может снести 1-2 врагов первым ударом, тогда один против троих не вырулит никогда.

6) Разумеется, бой с роллом 1d4 не является единственным вариантом. Можно сделать кучу других вариантов урона типа 1d6, 1d8, 2d6, 2d4… Но сразу проблема — слишком разные распределения урона и диапазоны. Придется ставить много хипов.

Разбросы 1d2, 1d4 выглядят оптимальными, т.к. рабочий диапазон относительно узкий, можно использовать матожидание урона вместо самого урона, если хипы превосходят матожидания раза в 4-5. Когда идут все эти кривые диапазоны, то балансировка -это целый геморрой.

7) В чем проблема большого количества хипов? В том, что их не удержишь в голове. Сравните бой 3vs3 при количестве хипов 1-4 у каждого с таким же боем, когда хипы измеряются двузначными числами. Придется писать на бумаге.
Опять же, много хипов и малый дамаг — долгий бой

Я не хочу ломать ваши варианты, но я бы предложил вам посмотреть на систему d20, которая (на мой взгляд) вполне себе выглядит сбалансированной. В ней есть некоторые базовые принципы, которые помогают увеличивать сложность, равно как и разнообразие, боя, плюс неплохо держит баланс до высоких уровней. Далее просто увеличивается число врагов.

Так, например, один момент, который вы подняли — кто ходит первым может выиграть, легко решается таким понятием инициатива — кинул d20 и прибавил свой модификатор. У кого выше, то и первый. В качестве не DnD игры, можете взглянуть на Divinity: divinity.gamepedia.com/Initiative
В DnD «качать» инициативу дорого и сложно. Лишь персонажи с растущей «ловкостью» ходят раньше всех с высокой вероятностью. Бросок d20 плюс разумные 1-3, делают всех игроков равным друг перед другом и всё решает шанс. Конечно же в компьютерной игре можно постараться поменять порядок игроков так, чтобы не вышло так, что враги пошли первыми, но опять же — просто не повезло с броском. С кем не бывает.

В плане атаки/попадания/промаха — абсолютно такая же картинка: d20 + модификатор атаки. У одних она растёт каждый уровень, у других 3/4, у третьих 1/2. Если результат броска (со всякими плюсами и минусами) превышает или равен классу брони, то персонаж попал. Броню можно на первом уровне собрать так, что она даст от 15 до 20, что даёт неплохие шансы на выживание.

На повреждение также влияет бросок и модификатор. Типичные кубики — это 1d4-1d12, 2d6.
Всякие там 3d6, 4d6 — это редкость и характерна монстрам и высоким уровням игрока (бонусы/оружие/заклинания и т.д.)

Я не хочу сказать, что ваш подход плох. Вы лишь сами сказали, что баланса добиться сложно. А я предлагаю пройтись по тому, что уже существует лет эдак двадцать (хотя первым ADnD лет за 40).
Книги правил D&D вам в помощь.
Это всё, конечно, интересно (и содержательно, I do appreciate it!), но для многих вот эта частичная непредсказуемость такого боя является одним из как раз-таки привлекательных факторов — азарт и всё такое. Плюс, такие системы обычно имеют место быть в настольных ролевых играх, которые, по сути, в основном PvE (и мастер контролирует окружение), и часть обязанностей хорошего мастера — как раз сделать это всё с одной стороны увлекательным, а с другой — не позволить нескольким неудачно лёгшим дайсам погубить игру. А в долгой перспективе оно всё, на самом деле, выравнивается.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории