Как разработать RPG Damage Formulas?


117

Я разрабатываю классическую 2d RPG (в духе финальной фантазии), и мне было интересно, есть ли у кого-нибудь совет о том, как сделать формулы ущерба / ссылки на ресурсы / примеры? Я объясню мою текущую настройку. Надеюсь, я не переусердствую с этим вопросом, и я прошу прощения, если мои вопросы слишком большие / широкие

Статистика моих персонажей состоит из следующих элементов:

enum Stat
{
    HP = 0,
    MP = 1,
    SP = 2,
    Strength = 3,
    Vitality = 4,
    Magic = 5,
    Spirit = 6,
    Skill = 7,
    Speed = 8, //Speed/Agility are the same thing
    Agility = 8,
    Evasion = 9,
    MgEvasion = 10,
    Accuracy = 11,
    Luck = 12,
};

Живучесть - это в основном защита от физических атак, а дух - защита от магических атак.

Все характеристики имеют фиксированные максимумы (9999 для HP, 999 для MP / SP и 255 для остальных). С помощью способностей максимальные значения могут быть увеличены (99999 для HP, 9999 для HP / SP, 999 для остальных) с типичными значениями (на уровне 100) до / после способностей + экипировка + и т. Д. Будут 8000/20000 для HP, 800 / 2000 для SP / MP, 180/350 для других характеристик

В конце игры Enemy HP, как правило, будут в нижних миллионах (с супер боссом, имеющим максимум ~ 12 миллионов).

Мне было интересно, как люди действительно разрабатывают правильные формулы ущерба, которые правильно масштабируются? Например, основываясь на этих данных, использование формул повреждений для Final Fantasy X в качестве основы выглядело очень многообещающе. Полная ссылка здесь http://www.gamefaqs.com/ps2/197344-final-fantasy-x/faqs/31381, но в качестве быстрого примера: Str = 127, команда «Атака» используется, вражеская защита = 34.

1. Physical Damage Calculation:
Step 1 ------------------------------------- [{(Stat^3 ÷ 32) + 32} x DmCon ÷16]
Step 2 ---------------------------------------- [{(127^3 ÷ 32) + 32} x 16 ÷ 16]
Step 3 -------------------------------------- [{(2048383 ÷ 32) + 32} x 16 ÷ 16]
Step 4 --------------------------------------------------- [{(64011) + 32} x 1]
Step 5 -------------------------------------------------------- [{(64043 x 1)}]
Step 6 ---------------------------------------------------- Base Damage = 64043
Step 7 ----------------------------------------- [{(Def - 280.4)^2} ÷ 110] + 16
Step 8 ------------------------------------------ [{(34 - 280.4)^2} ÷ 110] + 16
Step 9 ------------------------------------------------- [(-246)^2) ÷ 110] + 16
Step 10 ---------------------------------------------------- [60516 ÷ 110] + 16
Step 11 ------------------------------------------------------------ [550] + 16
Step 12 ---------------------------------------------------------- DefNum = 566
Step 13 ---------------------------------------------- [BaseDmg * DefNum ÷ 730]
Step 14 --------------------------------------------------- [64043 * 566 ÷ 730]
Step 15 ------------------------------------------------------ [36248338 ÷ 730]
Step 16 ------------------------------------------------- Base Damage 2 = 49655
Step 17 ------------ Base Damage 2 * {730 - (Def * 51 - Def^2 ÷ 11) ÷ 10} ÷ 730
Step 18 ---------------------- 49655 * {730 - (34 * 51 - 34^2 ÷ 11) ÷ 10} ÷ 730
Step 19 ------------------------- 49655 * {730 - (1734 - 1156 ÷ 11) ÷ 10} ÷ 730
Step 20 ------------------------------- 49655 * {730 - (1734 - 105) ÷ 10} ÷ 730
Step 21 ------------------------------------- 49655 * {730 - (1629) ÷ 10} ÷ 730
Step 22 --------------------------------------------- 49655 * {730 - 162} ÷ 730
Step 23 ----------------------------------------------------- 49655 * 568 ÷ 730
Step 24 -------------------------------------------------- Final Damage = 38635

Я просто изменил разделители, чтобы включить рейтинг атаки оружия и рейтинг брони брони.

Магический урон рассчитывается следующим образом: Mag = 255, используется Ultima, MDef врага = 1

Step 1 ----------------------------------- [DmCon * ([Stat^2 ÷ 6] + DmCon) ÷ 4]
Step 2 ------------------------------------------ [70 * ([255^2 ÷ 6] + 70) ÷ 4]
Step 3 ------------------------------------------ [70 * ([65025 ÷ 6] + 70) ÷ 4]
Step 4 ------------------------------------------------ [70 * (10837 + 70) ÷ 4]
Step 5 ----------------------------------------------------- [70 * (10907) ÷ 4]
Step 6 ------------------------------------ Base Damage = 190872 [cut to 99999]
Step 7 ---------------------------------------- [{(MDef - 280.4)^2} ÷ 110] + 16
Step 8 ------------------------------------------- [{(1 - 280.4)^2} ÷ 110] + 16
Step 9 ---------------------------------------------- [{(-279.4)^2} ÷ 110] + 16
Step 10 -------------------------------------------------- [(78064) ÷ 110] + 16
Step 11 ------------------------------------------------------------ [709] + 16
Step 12 --------------------------------------------------------- MDefNum = 725
Step 13 --------------------------------------------- [BaseDmg * MDefNum ÷ 730]
Step 14 --------------------------------------------------- [99999 * 725 ÷ 730]
Step 15 ------------------------------------------------- Base Damage 2 = 99314
Step 16 ---------- Base Damage 2 * {730 - (MDef * 51 - MDef^2 ÷ 11) ÷ 10} ÷ 730
Step 17 ------------------------ 99314 * {730 - (1 * 51 - 1^2 ÷ 11) ÷ 10} ÷ 730
Step 18 ------------------------------ 99314 * {730 - (51 - 1 ÷ 11) ÷ 10} ÷ 730
Step 19 --------------------------------------- 99314 * {730 - (49) ÷ 10} ÷ 730
Step 20 ----------------------------------------------------- 99314 * 725 ÷ 730
Step 21 -------------------------------------------------- Final Damage = 98633

Проблема в том, что формулы полностью распадаются, когда статистика начинает превышать 255. В частности, значения Защиты свыше 300 или около того начинают генерировать действительно странное поведение. Например, высокая прочность + защита приводят к огромным отрицательным значениям. Хотя я мог бы изменить формулы для правильной работы для моего варианта использования, вероятно, было бы проще использовать совершенно новую формулу. Как люди на самом деле разрабатывают формулы ущерба? Я подумывал об открытии Excel и попытался построить формулу таким образом (например, отображение статистики атаки или статистики защиты), но мне было интересно, есть ли более простой способ? Хотя я не могу передать всю игровую механику своей игры, может ли кто-нибудь предложить хорошее начальное место для построения формулы урона?

Спасибо


1
Я думаю, что вы правильно сделали, сначала настроив, какую статистику, HP и т. Д. Вы хотите. Это часть опыта игрока, и математика должна соответствовать этим значениям. С таким большим количеством характеристик игрок должен интуитивно знать, какие характеристики будут влиять на его магические, физические атаки и т. Д. Итак, первый большой вопрос - какие характеристики соответствуют атаке и какие характеристики защищают от этих характеристик (Ведь бывший PhDef защищает только против PhAtk).
Джонатан Коннелл

Огромное значение имеет баланс, вероятно, было бы неплохо создать интерактивную программу (скажем, на C # или что-то быстрое), где вы можете изменить статистику и посмотреть, какие результаты вы получите. Если вы можете изменить формулы во время выполнения, это также поможет :)
Джонатан Коннелл

4
Рассмотрите возможность использования Excel для этого. Кажется, хорошо подходит для этой задачи, и вам не придется писать строку кода.
Алекс Шеарер

2
Самый важный вопрос: какая формула дает игрокам больше всего удовольствия ? (искал на странице «веселье», и ни один из ответов не упомянул об этом: P) Если его статистика или урон увеличиваются слишком быстро, игроки становятся нечувствительными, если они идут медленно, им скучно. Игроки должны чувствовать себя счастливыми, когда они получают уровень, поэтому они должны чувствовать, что они вкладывают в него работу, а также, что это окажет заметное влияние на их игровую производительность. (это мои 2 пенса)
Аннан

3
"(Def - 280.4) ^ 2" а? Что ж, я ожидаю, что все станет странно не для Def> 255 или Def> 300, но в значительной степени точно для Def> 280.4;) После этого более высокое def будет эффективно означать более низкое def в этой точке формулы, продолжая вести себя как ожидается в других точках. Кстати, вы можете просто построить этот материал с Wolfram Alpha или около того. Исправьте достаточно переменных, чтобы оставить только две, и вы получите хороший поверхностный график.
Кристиан

Ответы:


140

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

Как только вы освоите их, просто спросите себя (замените «ценность» на «урон», «здоровье», «скорость» или что-то еще) :

Затем просто настройте его (добавьте / умножьте материал, измените базовое значение и т. Д.), Пока не почувствуете себя правильно. Графический калькулятор поможет вам визуализировать, как изменения параметров повлияют на функцию.


Кстати, проблемы, с которыми вы сталкиваетесь, связаны с целочисленными переполнениями .

Используйте типы переменных, которые достаточно велики, чтобы содержать числа, с которыми вы работаете. Размеры различаются в зависимости от платформы в C ++, но с использованием 32-разрядного компилятора Visual Studio unsigned intон 32-разрядный, а для unsigned __int64 MS - 64-разрядный. Также рассмотрите возможность использования double.

Кроме того, попытайтесь реорганизовать свои операции так, чтобы вы не сталкивались с такими большими цифрами в первую очередь (например, вместо того MDef * MDef / 110, чтобы делать (int)((float)MDef / 110 * MDef)) .


3
Если вы сталкиваетесь с целочисленными переполнениями, преобразование в число с плавающей точкой - которое надежно поддерживает только 24-битную целочисленную часть - будет иметь другой набор проблем с точностью.

@Joe: я откатил вашу правку; Я специально выбрал __int64вариант, uint64_tпотому что stdint.hон недоступен в Visual Studio 2008 и ниже, и я не хотел запутывать бедного мальчика больше, чем он уже есть.
BlueRaja - Дэнни Пфлугхофт

1
@BlueRaja: Я не вижу никаких доказательств того, что спрашивающий использует Visual Studio, и он присутствует в любом другом стандартном наборе инструментов (включая Visual Studio 2010).

Я думаю, что вы также упустили один важный вариант: если вы хотите, чтобы у повреждения была верхняя граница, к которой вы можете приблизиться, но не достигли ее, вы можете использовать сигмовидную функцию.
Мартин Сойка

1
user127817: Все, что действительно важно, это то, как эта функция растет. В остальном, просто проверьте его, пока он не почувствует себя сбалансированным. Если вы чувствуете, что персонаж слишком силен, уменьшите его урон. Если вы чувствуете, что убить определенного босса или врага слишком долго, понизьте здоровье или броню этого врага. И так далее.
BlueRaja - Дэнни Пфлюгофт

31

Статистика моих персонажей состоит из следующих элементов:

Вот ваша настоящая проблема: вы определили свою статистику, прежде чем определить, что на самом деле означает эта статистика . Вы кладете телегу перед лошадью.

Посмотрите, как работает D & D (настольная). «Сила» ничего не значит сама по себе; это только что-то значит, потому что есть правило, которое гласит: «Добавь бонус своей силы к своей рукопашной атаке». Это правило является частью правил боя D & D. Без боевых правил «Сила» - вообще бессмысленная величина.

Первый вопрос, который вам нужно задать себе: как много различий я хочу между персонажами? Опять же, посмотрите на D & D. Там у них есть 6 основных характеристик. Эти характеристики определяют разные размеры игры для персонажей. Персонаж с высокой Ловкостью будет иметь различные варианты от персонажа с низкой Ловкостью.

Но причина даже этой разницы все возвращается к правилам. Высокая Ловкость означает бонусы к дальним атакам; Вы можете чаще наносить удары дальними атаками. Так что между Силой и Ловкостью у вас есть два аспекта игры: дальний бой или ближний бой.

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

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

Существуют разные способы развития персонажей. Обычный трюк Final Fantasy старой школы состоял в том, чтобы просто использовать уровень персонажа как часть его вычислений урона. Это может быть просто умножение уровня на соответствующий показатель, или это может означать применение функции к уровню персонажа. Скажем, квадратичная прогрессия, чтобы уровень урона персонажа увеличивался с каждым уровнем.

Однако вы хотите, чтобы ваши боевые функции работали, они должны учитывать прогресс. Ваши функции нуждаются в хуках для развития.

У D & D есть забавный способ прогрессирования. Это основано на части класса; каждый раз, когда вы повышаете уровень, вы получаете новые функции класса и плоский бонус к вашему удару, в зависимости от класса вашего персонажа. Тем не менее, некоторые функции класса стали лучше сами по себе. Заклинания в D & D будут иметь встроенную прогрессию. Заклинание может нанести 1d4 урона на 2 уровня заклинателя выше первого. Так что любой другой уровень волшебника делает это заклинание лучше.

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

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


6
« Вот ваша настоящая проблема: вы определили свою статистику, прежде чем определить, что на самом деле означает эта статистика. Вы ставите телегу перед лошадью ». Я категорически не согласен; числа сами по себе являются лишь способом информирования игрока о его силе и т.д. это является частью игрового дизайна. Если вы продолжите в обратном направлении, вы можете получить конечного босса с 147 лошадиными силами ... кто этого действительно хочет?
Джонатан Коннелл

8
Ну, у Саревка (в Воротах Балдура) было всего 135 л.с. ...
Мартин Сойка

12
@ 3nixios: какое это имеет значение, если у конечного босса 147Hp? Важно то, является ли последний босс сложным, интересным и, прежде всего, полезным для победы. Босс с большим количеством HP не интересен; это пустая трата времени. Босс, который может связываться с вашей группой, который требует особой тактики, которая меняется от момента к моменту, который требует, чтобы вы использовали каждую имеющуюся у вас способность с максимальным потенциалом, что и делает великого финального босса. Я возьму интересного босса 147Hp над скучным блоком Hp в любой день.
Никол Болас

@Nolol Bolas Я полностью согласен с вами, я пытался поддержать, почему я считаю, что отправной точкой должна быть статистика. Статистика, с которой игрок начинает игру, является основным показателем и игровым процессом, с которым игрок играет во время игры. Я согласен, что огромные бары HP для боссов не нужны, они дают игроку лучшее представление о том, какая установка лучше против босса, какие характеристики оружия и т. Д. Более эффективны. Сумма, конечно, не имеет отношения к тому, как вы ее вычисляете, потому что вы можете просто разделить или умножить свои окончательные вычисления на константу c и покончить с этим.
Джонатан Коннелл

2
@ 3nixios: Но это часть моей точки зрения. Ловкость в D & D существует для того, чтобы отличать персонажей ближнего боя от специалистов дальнего боя. Если бы не было концепции атак ближнего и дальнего боя (а во многих FF-играх, например, нет), то это различие не должно существовать. Вы могли бы обойтись без 5 характеристик вместо 6. Определение диапазона Hp - это одно, а определение основных характеристик - другое. Статистика требует правил, прежде чем вы сможете понять их, и вы должны знать, что вы намерены делать стат, прежде чем вы можете сказать, что иметь этот стат это хорошая идея.
Никол Болас

22

Ваши формулы кажутся довольно сложными. Я не уверен, как профессиональные разработчики RPG справляются с этим, но я бы рекомендовал сосредоточиться на простоте. Попробуйте найти простейшую возможную формулу, которая по-прежнему включает диапазон характеристик, которые вы хотите использовать. Например, могли бы вы сделать так, чтобы характеристики изменяли друг друга до расчета урона, а не модифицировали урон во время расчета? После того, как вы запомните формулу, я постараюсь построить ее для широкого диапазона возможных значений, чтобы увидеть, как она будет вести себя по мере повышения уровня игроков. Очевидно, что чем меньше у вас переменных, тем более это возможно.

Кроме того, BlueRaja предоставила важное объяснение того, почему вы можете видеть неожиданные значения на более высоких уровнях статистики. Использование неподписанных типов и проверка на переполнение будут важны.


10
+1 для простого. Любой может делать очень сложные вещи, но это не очень хорошая игра.
aaaaaaaaaaaa

8
@Randolf, если вы не используете Apple 2 или что-то еще, весьма сомнительно, что устранение умножения или деления здесь и там может повлиять на производительность любым измеримым образом.
Тетрад

8
@Randolf Большая битва в RPG может означать примерно 10 вычислений урона в секунду, современный процессор может выполнять несколько миллиардов операций в секунду. Вы можете смело предположить, что влияние любой такой «видимой» математики на производительность незначительно. Простое в этом случае - ради тех, кто проектирует, и тех, кто играет в игру, а не для наших компьютеров.
аааааааааааа

6
@ Рэндольф Ричардсон: Я просто думаю, что в этом случае вы можете немного не попасть в цель. Для MMO хороший быстрый протокол без жира имеет первостепенное значение, и тяжелые задачи, такие как физика, должны разрабатываться с учетом производительности. Но расчет урона - это основной игровой процесс, он должен быть разработан с учетом игрового процесса, если вы ставите вопросы производительности на такой вопрос, вы рискуете поставить под угрозу игровую часть. Если говорить о производительности, когда это имеет значение, вы рискуете создать впечатление, что это важная область для оптимизации, что отвлекает внимание от реальных грешников производительности.
аааааааааааа

5
@Randolf: я ничего не намекаю; Я говорю, что оптимизация чего-то, что не является узким местом, является пустой тратой времени.
Никол Болас

11

В конце игры Enemy HP, как правило, будут в нижних миллионах (с супер боссом, имеющим максимум ~ 12 миллионов).

Это у меня проблема. Вы должны строить своих боссов вокруг того, что, по вашему мнению, должны уметь делать ваши игроки. Вы строите своих игроков и боевую формулу вокруг того, что вы хотите, чтобы ваши боссы были похожи.

Как только вы построите свою боевую механику и роли, вы сможете решить, как вы хотите создавать своих боссов, поскольку это должен быть хороший баланс между уроном, который игроки могут нанести / поглотить, по сравнению с тем, что босс может нанести / поглотить.


4
+1 здоровье врага должно основываться на том, что игрок может разумно обработать в этот момент, а не наоборот.
BlueRaja - Дэнни Пфлугхофт

7

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

Поэтому вы должны написать симуляцию для создания персонажа 20-го уровня и посмотреть, как он проходит через 200 битв или около того против типов врагов, с которыми он должен был сражаться в этот момент. Сделайте это снова для персонажа 30 уровня (предположительно в следующем разделе мира).

Это займет некоторое время, чтобы разобраться в этом, но написание автоматических симуляций определенно сделает это намного проще, чем просто угадывать и воспроизводить их вручную.


5

Я думаю, что вы делаете ошибку, что хотите создать формулу, не имея надлежащего дизайна.

Сначала начните с дизайна, затем начните думать о представлении дизайна в формулах. Чем понятнее ваш дизайн, тем легче будет найти простые и / или точные формулы.

Попробуйте реализовать «типы» врагов, например, «бронированный» => атака игрока, если она имеет физический тип, снижена на 50%. Не заставляйте битву течь, чтобы абстрагироваться, подумайте о том, что актуально, а что нет.

Если ваш дизайн говорит, что «бронированные враги» слабы против магии, но сильны против физического урона, представьте это в коде. Но помните, что вам пришлось много тестировать, потому что значения не будут работать волшебно при первом написании кода. Попробуйте создать дизайн, внедрить логику в код, всегда проверять, является ли это техническим представлением того, что вы имели в виду, и не изменяет ли оно значения до тех пор, пока оно не будет.


Я уже охватывал подобные вещи - рейтинг брони уменьшает физический урон атаки, если атака не помечена как пробивание брони или не используется формула урона на основе%
user127817

5

Хотя мой дизайн еще не вышел из фазы электронных таблиц, я пришел к одному выводу о разработке математики для RPG:

Держите их как можно проще. В дизайне, над которым я работаю, я использовал очень упрощенные формулы, подходящие для полуклассовой системы. То есть. Заклинание огненного шара имеет урон 30. Формальное:

BaseSpellDamage * Attribute (5 * 6)

Мы также можем добавить модификаторы как это:

Result = (BaseSpellDamage * Attribute) (5*6)
Result = Result + (Result * 50%) (30 = 30 + (30 * 50%))

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

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

DamageResult = Resistance * Damage ( 50% * 45)

Таким образом, конечный результат будет получен 22 урона (я только сократить частичный результат).

Другая формула:

DamageResult = Damage - Resistnace (45 - 22).

Таким образом, конечный результат будет 23. Если получится, что сопротивление больше полученного урона, персонаж просто не получит никакого урона. Конечно, вы должны убедиться, что в такой ситуации нет места, за исключением случаев, когда вы этого хотите.

Хотя я должен признать, что предварительное масштабирование несколько легче сбалансировать и масштабировать. Но это также зависит от ваших базовых чисел. Процентное масштабирование будет работать лучше всего, если вы начнете с 100 и выше. Если вы работаете с небольшими числами (если честно, с цифрами ниже 100), это может привести к затруднениям, так как вы начнете получать результаты с плавающей запятой, что будет трудно сбалансировать и фактически делать с ними что-нибудь интересное.

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

И на закрытии заканчивается. Я не пришел к этим выводам полностью самостоятельно. На самом деле я потратил довольно много времени на чтение различных руководств по РПГ (Hero, DnD). Особенно полезен DnD, так как он работает по схожим принципам, но вместо атрибутов он использует уровни для своих формул, иногда они могут быть более сложными. Чем то, что я представил здесь.

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


3

Как уже упоминалось, формула Final Fantasy X довольно сложна. Обычно для этой серии, чем позже игра, тем сложнее формула. Вероятно, проще основать свою формулу урона на другой игре полностью. Но в целом, я думаю, стоит обсудить с самого общего уровня, какие формулы ущерба вы можете найти в мире, и как вы можете создать игру, основанную на них. Первое, что вам нужно решить, это какой урон вы хотите получить в конце игры, и какую статистику вы хотите, чтобы игрок мог иметь? Получив это, вы можете выбрать систему формул, а затем оптимизировать формулу и значения оружия, чтобы отражать эти диапазоны во времени.

Чисто на основе статов

Это хорошая идея, если вы хотите, чтобы ваши персонажи были гибкими с точки зрения того, с какими уровнями врагов они могут сражаться. Подобная формула будет зависеть только от характеристик игрока, его экипировки и характеристик врагов. Эти формулы обычно довольно просты. Final Fantasy Legend II (см., Например, http://www.shenafu.com/ffl2/weapon.php , имеет оружие, наносящее урон по простой формуле:

(Stat+StatBonus)*WeaponStrength - Defense*4

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

Чтобы показать, насколько широко эта формула действительно может пойти, рассмотрим формулу ущерба для Inflation RPG, игры для Android и IOS (см. Http://inflation-rpg.wikia.com/wiki/Calculations ). Формула сильно зависит как от характеристик, так и от экипировки. Каждый элемент экипировки имеет две характеристики - бонус к статистике ATK и значение множителя. У некоторых единиц оборудования низкие множители, но высокие бонусы, у других низкие бонусы, но высокие множители. Для персонажа, у которого только 10 АТК, боевой топор с бонусом 5000 АТК, но низким множителем 145%, является отличным выбором. Общий урон есть (10+5000)*1.45 = 7264, но Estoc с 0 бонусами и множителем 300% - плохой выбор - урон есть (10+0)*3 = 30. Позже в игре персонаж с 5000 атакой предпочел бы переключение оружия.

На основе статистики и уровня:

Хорошим примером этого являются Final Fantasy V, VI и Final Fantasy XII (см. , Например, http://www.gamefaqs.com/ps2/459841-final-fantasy-xii/faqs/45900 ). Формула для мечей в FFXII:

DMG = [ATK x RANDOM(1~1.125) - DEF] x [1 + STR x (Lv+STR)/256]

и формула ущерба для посохов:

DMG = [ATK x RANDOM(1~1.125) - DEF] x [1 + STR x (Lv+MAG)/256]

Они очень похожи, но обратите внимание, что формула меча зависит только от силы и уровня, в то время как формула посоха зависит от силы, магии и уровня. Преимущество этой формулы заключается в том, что она дает игроку два пути роста - построение своей статистики или повышение уровня. Недостатком является то, что он также наказывает персонажей в обоих направлениях. На самом деле это позволяет игроку повышать свой уровень, чтобы увеличить выходящий урон (для FFXII это означает увеличение выходного урона на ~ 4% за уровень около 50-го уровня, когда вы учитываете прирост статов), чтобы помочь настроить сложность для его уровня. Уровень комфорта.

Исправлена ​​ошибка:

Формулы фиксированного урона не зависят от характеристик или уровня персонажа, они зависят только от формулы внутреннего урона самого оружия. Они могут варьироваться в зависимости от диапазона, но наносят одинаковый урон независимо от пользователя (за исключением любых других специальных эффектов или черт характера). Лучше всего их использовать, если оружие будет наносить фиксированный урон, а способность экипировать оружие зависит от характеристик и / или уровня. Diablo 2, например, делает это, как и многие роги, у которых есть оружие, которое зависит от бросков кубика. При этом, «фиксированный урон» не подразумевает «неслучайный» - и на самом деле, как правило, есть некоторый элемент случайности нанесенного ущерба.

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

Еще одно место, с которым вы столкнетесь, - это определенные виды оборудования или предметов в Final Fantasy. Например, 1000 игл всегда наносят 1000 урона. В Final Fantasy Legend II боевые искусства наносят урон по формуле:

Damage = WeaponStrength*(90-UsesLeft) - 4*Defense

Final Fantasy XII также имеет несколько фиксированный урон для оружия, наносящий урон по формуле:

DMG = [ATK x RANDOM(1~1.125)]^2

Хотя урон несколько случайный, он варьируется только на 26,5 процента в общем диапазоне, так что вы гарантированно нанесете определенный уровень урона в среднем с течением времени. Эти типы атак полезны для персонажей, которые имеют как низкие характеристики, так и низкие уровни в играх, которые обычно учитывают эти факторы при нанесении урона. Кроме того, они игнорируют защиту цели (хотя формула может быть легко переработана, чтобы соответствовать защите, если вы этого хотите).


2

у всех игр в финальной серии фэнтези был предел 255 из-за проблемы, с которой вы столкнулись. на уровне 100 статистика будет 255.

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

в вашем случае это будет шаг 21: применить модификаторы способностей шаг 22: применить модификаторы снаряжения шаг 23: окончательный урон.

если вы заинтересованы в Google для окончательных формул фантазии, они там. У меня есть копии реальной боевой механики, включая ИИ для финальных фантазий 4, 6, 7 и 9. Люди взламывали их из оригинальных игр, когда создавали ромы для эмуляторов. Там не так сложно найти, если вы посмотрите достаточно усердно.

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


2

Мне было интересно, как люди действительно разрабатывают правильные формулы ущерба, которые правильно масштабируются?

Первые 2 вещи:

  • решить, что вы подразумеваете под «правильно» - каково ваше представление о «правильном ущербе»?
  • решить, что вы подразумеваете под «масштабом» - какие значения будут меняться и какой эффект вы хотите, чтобы эти изменения имели?

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


Это крайне бесполезный комментарий. Это подводит итог "я не знаю", и из-за этого это пустая трата времени. Пометка для удаления.
Критик

1

В качестве альтернативы, если вы ищете очень простую формулу, выполните следующие действия:

(Обратите внимание, что это моя идея для формулы,)

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

Затем создайте переменную с именем MovePower. Это будет зависеть от хода, и лучшие ходы будут иметь лучшую MovePower. Для моей формулы общие команды «Атака» имеют MovePower 5.

Затем установите защиту на основе процента (и, конечно, сделайте невозможным достижение 100% защиты от урона).

Затем, во время фазы атаки, просто умножьте показатель атаки на силу хода и уберите урон, основанный на защите противников! просто!

Вы также можете выбрать другие модификаторы, например, если ход попадет (Точность), если у движения есть еще один дополнительный эффект (Био, наносящий яд,), и выбрать для этого удара, (Точность снова), увеличение / понижение урона. ходы, которые меняют характеристики, т. д. Веселитесь с этим!


Другой вариант, позволяющий избежать использования брони как проблемы с процентилями (что позволяет ее значениям выглядеть одинаково), состоит в том, чтобы рассчитать урон против брони как сравнение, которое становится множителем. Что-то вроде Ln (atk / def) в качестве базы. Это позволяет статистике защитной брони масштабироваться с течением времени таким же образом. Выясните, как получить базовый желаемый диапазон урона для случаев, когда урон и характеристики брони одинаковы, и экстраполируйте оттуда. Из-за этого атаки «избегания брони» требуют хитрости, но это часть творчества.
Aviose

1

По сути, вам нужно выяснить две вещи.

  1. Как правильно преформовать вычисления с большими числами.
  2. Как вы хотите и ожидаете, что урон от атаки будет вести себя против более слабых и сильных противников.

1

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

2

Как вы хотите, чтобы игра вела себя? Некоторые примеры:

  • Один из подходов заключается в том, ATKчтобы решить, ударишь ты или нет, и бросить кубик с известным уровнем урона в зависимости от оружия: например, длинный меч 1d8, двуручный меч 1d10, кинжал 1d4. Это не будет удивительно хорошо масштабироваться, если HP будет расти и дальше. Если вы используете, ATKчтобы определить, попали или нет персонажи, вы можете сделать еще один бросок после успешного удара с ATK* 80% для определения критов.
  • Если вы хотите использовать формулу урона, формула урона может быть такой же простой, как (ATK - DEF) +/- 20%и в World's End (стратегическая игра RPG). Это будет означать, что атаки против сильного противника DEFне могут нанести вообще никакого урона. Для instace ATK = 10, ENEMY DEF = 12, (ATK - DEF) = -2и это также означает , что высокая атака против немного ниже опра, могла бы сделать небольшое повреждение, потенциально делает сражение больше с увеличением HP. Например, с ATK = 1010, ENEMY DEF = 1005урон будет 5. Урон также будет значительно увеличиваться, если ATKон увеличен на небольшой процент. Например ATK = 1055, будет наносить на 900% больше урона при увеличении только на 5% ATK.
  • Чтобы избежать этого, вы можете сделать что-то подобное. ATK / DEF * WEAPON_DAMAGEЭто будет увеличиваться более постепенно, когда ATKили DEFувеличивается, и позволит слабому атакующему нанести урон существу с сильным DEF.

tl; dr Вам нужно ответственно относиться к своим цифрам и выяснять, как вы хотите, чтобы игра велась в разных ситуациях. Некоторые вопросы, чтобы задать себе:

  1. Сколько атак (ходов) нужно, чтобы победить этого босса / миньона?
  2. Как различные навыки, баффы, дебаффы должны влиять на xбитву? Должно ли это быть безнадежным, выигрыш должен быть y%менее / более вероятным?
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.