Атрибуты для расчета попадания в пошаговой игре или Roguelikes

22

Я пытаюсь найти хорошую формулу для определения удара, когда игрок атакует врага в Roguelike. Я хотел бы придумать что-то более простое, но все же верное тому, как это делается в D & D или популярных Roguelikes, таких как AngBand или NetHack.

Пока что у меня есть добавление различий между атрибутами игрока и врага, а также случайное целое число:

if ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + random_integer_below_6()) >= 10) {
    hit(enemy);
}

Это делает игру неестественной: игрок никогда не пропускает слабых врагов и наоборот сильных. Кто-нибудь знает руководство по атрибутному бою, используемое в пошаговых играх и т. Д.? Должен ли я (и могу ли я) дословно скопировать правила D & D?

jdeseno
источник

Ответы:

18

Я бы выяснил, что вы хотите, чтобы шансы «гарантированного попадания» и «гарантированного промаха» были равны (то есть шансы, что котенок ударит дракона, а дракон пропустит котенка). Сохраните свой случайный результат, и перед применением различий в мощности отметьте удар, если он находится в этих пределах. Это предотвратит проблему 100% вероятности попадания / промаха ... хотя есть еще один вариант всегда предоставлять шанс попадания, подробно описано ниже.

D & D - это «плоская» система, где вероятность равномерно распределена по возможным результатам броска. Другие системы используют более искривленное распределение, обычно достигаемое путем бросания нескольких кубиков и добавления их. Довольно просто создать такую ​​кривую (на ум приходит rand () + rand ()) / 2).

Другая возможность - это «взрывающаяся кость». В таких системах, как Shadowrun и Savage Worlds, бросание максимально возможного результата броска позволяет вам перебросить этот бросок и добавить новый результат. В вашей игре вы должны проверить, был ли ваш случайный результат выше определенного порогового значения, и если это так, снова выполнить бросок. Если вы позволите кости взорваться на неопределенный срок, то даже у самого низкого гоблина есть шанс ударить бога, и вам не нужна явная механика «гарантированного удара».

Таким образом, один из возможных подходов с изогнутым броском, гарантированным шансом пропадания и взрывом игральных костей будет выглядеть примерно так:

function getRoll():Number
{
  var result:Number = (rand() + rand()) * 3; //Curved result from 0 to 6
  if(result > 5.75) result += getRoll(); //Explode over a certain threshold, recursively
  return result;
}

function attackHits():Boolean
{
  var roll:Number = getRoll();
  if(roll < 0.25) return false; //Guaranteed chance of miss
  else return ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + roll) >= 10; //Your original test.
}

Конечно, это не проверено и не сбалансировано; Вы хотели бы настроить все эти магические числа, пока они не почувствовали себя хорошо.

Что касается дословного копирования правил, то здесь есть юридические и этические проблемы. Вы прекрасно черпаете вдохновение из D & D и других настольных игр; Вот как все они были разработаны в первую очередь. Вам также не нужно показывать игроку, как именно работают правила, и вы можете обнаружить, что использование плавной кривой кости с плавающей запятой дает лучшее ощущение, чем ограничение себя целочисленными ограничениями физических кубиков.

Грегори Эйвери-Вейр
источник
3
что это за язык с забавным типом decls? Или это просто псевдокод?
Tenpn
2
Я думаю, что это может быть Actionscript или Javascript, но не удерживайте меня на этом.
Коммунистическая утка
Это Actionscript 3. Я разработчик Flash.
Грегори Эйвери-Вейр
6

Я предполагаю, что это вопрос баланса игры, а не вопрос кодирования, и есть много способов справиться с этим. Из вашего существующего алгоритма, я подозреваю, что вы делаете его более сложным, чем должно быть (три атрибута И случайное число создают чрезвычайно грязную систему с точки зрения игрока). Мой первый инстинкт - это упрощение!

Любимые атрибуты, которые делают несколько вещей, а не результаты, которые определяются несколькими атрибутами. DEX прекрасно работает как основной фактор вероятности попадания; добавление всего остального лишь усложняет баланс. Подумайте об этом следующим образом: ожидаемый урон игрока при каждом попадании - это его процент попадания, умноженный на его средний урон при попадании. Как вы планируете рассчитать «ожидаемый» или «типичный» процент попадания с таким количеством переменных?

Я вижу еще одну проблему, которая заключается в том, что ваша формула не масштабируется, и это, вероятно, то, что вы испытываете. Если предположить, что DEX, LUCK и SPEED имеют тенденцию к увеличению в течение игры, различия между игроком и монстром в этих показателях также будут увеличиваться. Например, если DEX ранней игры игрока находится в диапазоне от 4 до 6, и монстры тоже, это модификатор попадания на 10-20%. Если на более поздних стадиях игры диапазон больше похож на 10-20, то это модификатор до 100%.

Один из способов исправить это - сохранить статистику. Диапазоны игроков и монстров одинаковы на протяжении всей игры, и получить что-то вроде +1 DEX - огромное дело, крайне редкое явление, и к нему относятся так (если оно вообще существует). Тогда ваша формула будет отлично работать на протяжении всей игры, и вы увидите, что игрок с примерно одинаковым шансом попадания в течение всей игры.

Другой способ состоит в том, чтобы изменить это жестко закодированное «10» для масштабирования с уровнем, так что, возможно, это «10 + уровень монстра» или «10 + уровень подземелья» или что-то, что вызывает небольшое увеличение сложности по мере прохождения игры, если игрок не повысит уровень их статистика соответственно.

Третий способ, как уже говорили другие, состоит в том, чтобы установить жесткие ограничения на самый высокий и самый низкий допустимый процент попаданий и просто сказать «если вычисленное значение меньше X, используйте вместо него X».

Для полноты картины я укажу, что не существует абсолютного закона, согласно которому вы ДОЛЖНЫ включать бросок на попадание в первую очередь. Действие в игре, которая неэффективна, не особенно увлекательно и не добавляет опыта, за исключением редких случаев. Альтернатива состоит в том, чтобы позволить игрокам ВСЕГДА наносить удары и просто возиться с диапазоном урона, чтобы иногда они наносили гораздо меньше урона, чем другие. Помните, что сложные системы более интересны для дизайнера, чем для игрока.

Ян Шрайбер
источник
Это отличный ответ.
seanicus
3

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

coderanger
источник
0

Во многих играх используется пятипроцентное изменение попадания независимо от всех факторов в дополнение к обычной формуле попадания.

EddieC
источник