Як розробити формули пошкодження RPG?


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/20 000 для HP, 800 / 2000 для SP / MP, 180/350 для інших статистичних даних

Пізня гра Врага HP зазвичай буде в нижчих мільйонах (маючи максимум ~ 12 мільйонів) у супер боса.

Мені було цікаво, як люди насправді розробляють правильні формули пошкоджень, які масштабуються правильно? Наприклад, виходячи з цих даних, використання формул пошкоджень для Final Fantasy X як основи виглядало дуже перспективно. Повна посилання тут http://www.gamefaqs.com/ps2/197344-final-fantasy-x/faqs/31381, але як короткий приклад: Str = 127, використана команда "Attack", ворог Def = 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 - Danny Pflughoeft

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

Ви також залишили один важливий варіант, я думаю: якщо ви хочете, щоб у пошкодження була верхня межа, до якої ви можете наблизитися, але ніколи не дотягуватися, ви можете використовувати сигмоподібну функцію.
Мартін Сойка

1
user127817: Все, що дійсно важливо, це те, як функція зростає. Для решти просто тестуйте його, поки він не відчує себе врівноваженим. Якщо ви вважаєте, що персонаж занадто сильний, зменшіть його шкоду. Якщо ви відчуваєте, що вбивати конкретного боса чи ворога потрібно занадто багато часу, опустіть здоров'я чи броню. І так далі.
BlueRaja - Danny Pflughoeft

31

Статистика моїх персонажів складається з наступного:

У цьому ваша справжня проблема: ви визначили свою статистику, перш ніж визначити, що ці статистичні дані означають насправді . Ти ставиш візок перед конем.

Подивіться, як працює D&D (стільниця). "Сила" сама по собі нічого не означає; це означає щось лише тому, що існує правило, яке говорить: "Додайте свій бонус за силу в атаці ближнього бою". Це правило є частиною бойових правил D&D. Без бойових правил "Сила" - це взагалі безглузда кількість.

Перше питання, яке вам потрібно задати, це таке: скільки мені потрібно розмежувати між персонажами? Знову подивіться D&D. Там вони мають 6 основних статистичних даних. Ці статистичні дані визначають різні розміри гри для персонажів. Персонаж з високою спритністю матиме різні варіанти від персонажа з низькою спритністю.

Але причина навіть у цій різниці все повертається до правил. Висока спритність означає бонуси за атаку; ви можете частіше вдарятися за дальніми атаками. Так що між силою та спритністю у вас є два аспекти гри: від діапазону до ближнього бою.

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

Потрібно визначити основні правила навколо статистики, перш ніж ви зможете визначити функції прогресування росту тощо. Вам не потрібні конкретні дані; не потрібно говорити, що "кожна точка сили додається у випадковий рулон, щоб визначити, чи вдарила ближній напад". Вам потрібні мета-правила на кшталт "спритність робить кращих нападників". Ви можете зрозуміти, як саме це робить їх згодом кращими.

Існують різні способи просування персонажів. Загальним трюком для фіналу в старому школі було просто використовувати рівень персонажа як частину їхніх обчислень. Це може бути просто множення рівня на відповідний stat, або це може означати застосування функції до рівня символу. Скажімо, квадратична прогресія, щоб швидкість ураження персонажа зростала за рівень.

Хоча ви хочете, щоб ваші бойові функції працювали, вони повинні враховувати прогрес. Ваші функції потребують гачків для прогресування.

У науково-дослідної роботи є кумедний спосіб прогресування. Це основна частина класу; кожного разу, коли ви піднімаєтесь на рівні, ви отримуєте нові функції класу та рівний бонус за свій удар, виходячи з класу персонажів. Однак деякі особливості класу покращилися самі по собі. Заклинання в науково-дослідних розробках вбудували б в них прогрес. Заклинання може завдати шкоди 1d4 на 2 рівня орфографа вище першого. Отже, кожен інший рівень майстра робить це заклинання кращим.

D&D також активно використовував прогресію на основі предметів. До четвертого видання прогрес на основі предметів був головним чином для боротьби з персонажами, але навіть у старих виданнях у правописів були пункти, які давали їм статистичні події або інші коригування (або вирівнювання давали їм заклинання).

Тож предмети - це ще одна річ, яку повинні враховувати ваші бойові функції. Чи предмети просто підкреслюють одну чи кілька статистичних даних, коли вони оснащені, чи роблять інші речі? Науково-дослідні роботи були трохи дивними, оскільки статистика рідко змінювалася; зброя просто завдала шкоди XdY, можливо, з бонусом на основі однієї з ваших статистичних даних. І це було те. Тож ваш єдиний спосіб зробити більше шкоди в бою - знайти кращу зброю. У багатьох відеоіграх RPG вони крім зброї враховують рівень.


6
" Є ваша реальна проблема: ви визначили свою статистику перед тим, як визначити, що саме означають ці статистичні дані. Ви ставите кошик перед конем. " Я категорично не згоден; числа самі по собі є лише способом інформування гравця про його силі і т.д. це є частиною ігрового дизайну. Якщо ви рухаєтесь навпаки, ви можете закінчити боса з 147 к.с. ... хто цього хоче насправді?
Джонатан Коннелл

8
Що ж, Саревок (у воротах Балдур) мав лише 135 к.с. ...
Мартін Сойка

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

@Nicol Bolas Я повністю з вами згоден, я намагався підтримати, чому я вважаю, що вихідним моментом має бути статистика. Статистика, з якої починається гравець, є основним показанням та ігровим процесом, з яким грає гравець під час гри. Я погоджуюсь, що величезні бари HP для начальників не потрібні, це дає гравцеві кращі вказівки про те, яка найкраща установка проти боса, яка статистика зброї тощо є ефективнішими. Сума, звичайно, не має значення для способу її обчислення, тому що ви можете просто розділити або помножити свої кінцеві обчислення на постійне с і зробити це з ним.
Джонатан Коннелл

2
@ 3nixios: Але це частина моєї точки зору. Вправність у науково-дослідних розробках існує, щоб дозволити розмежувати між персонажами ближнього бою та спеціалістами, що знаходяться в діапазоні. Якби не існувало поняття ближнього бою та дальності нападу (а в багатьох іграх FF, наприклад, немає), цього розрізнення не потрібно було б існувати. Ви можете піти з 5 статистичних даних замість 6. Визначити діапазон Hp - це одне, але визначити, яка основна статистика - це інша. Статистика вимагає правил, перш ніж ви зможете зрозуміти їх, і ви повинні знати, що ви маєте намір стати, перш ніж ви зможете сказати, що мати цю статистику - це гарна ідея.
Нікол Болас

22

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

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


10
+1 для простих. Будь-хто може скласти дуже складні речі, але це не дуже добре.
aaaaaaaaaaaa

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

8
@Randolf Велика битва в RPG може означати щось на зразок 10 розрахунків пошкоджень за секунду, сучасний процесор може робити кілька мільярдів операцій в секунду. Можна сміливо припускати, що ефективність будь-якої такої "видимої" математики незначна. Просте в цьому випадку заради тих, хто розробляє та тих, хто грає в гру, а не для наших комп’ютерів.
aaaaaaaaaaaa

6
@Randolf Richardson: Я просто думаю, що ти можеш трохи пропустити ціль у цьому випадку. Для MMO важливий хороший швидкий нежирний протокол, і важкі завдання, такі як фізика, повинні бути розроблені з урахуванням продуктивності. Але розрахунок шкоди - це основний геймплей, він повинен бути розроблений з урахуванням геймплея, якщо ви ставите під сумнів ефективність у такому питанні, ви ризикуєте зірвати частину гри. Якщо говорити про продуктивність, коли це важливо, ви ризикуєте створити враження, що це важлива область для оптимізації, тим самим вкравши увагу з боку справжніх грішників.
aaaaaaaaaaaa

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

11

Пізня гра Врага HP зазвичай буде в нижчих мільйонах (маючи максимум ~ 12 мільйонів) у супер боса.

З цим у мене проблема. Ви повинні будувати своїх начальників навколо того, що, на вашу думку, повинні вміти впоратися ваші гравці. Ви будуєте своїх гравців і бойову формулу навколо того, як ви хочете, щоб ваші начальники були.

Як тільки ви отримаєте свою бойову механіку та ролі, тоді ви зможете вирішити, як ви хочете сконструювати своїх начальників, оскільки це повинен бути хороший баланс між збитками, які гравці можуть нанести / поглинути проти того, що бос може наносити / поглинати.


4
+1 Здоров'я ворога має базуватися на тому, що гравець може розумно впоратися в той момент, а не навпаки.
BlueRaja - Danny Pflughoeft

7

Ці цифри, які ви цитували, швидше за все, отримані з простого налаштування симуляції, протягом тисячі тиражів.

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

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


5

Я думаю, ви помиляєтесь, що хочете створити формулу, не маючи на увазі належного дизайну.

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

Спробуйте реалізувати "типи" ворогів, наприклад "броньована" => атака гравця, якщо вона має фізичний тип, зменшується на 50%. Не робіть бойовий потік абстрактним, подумайте про те, що актуально, а що ні.

Якщо ваша конструкція говорить, що "броньовані вороги" слабкі проти магії, але сильні проти фізичного ураження, представляйте це в коді. Але пам’ятайте, що ви зробили багато тестувань, тому що значення не будуть працювати магічно при першому написанні коду. Спробуйте створити дизайн, ввести логіку в код, завжди перевіряйте, чи це технічне представлення того, що ви мали на увазі, і чи не змінюється воно до тих пір, поки воно не є.


Я вже охоплював таку річ - рейтинг броні зменшує фізичну шкоду, якщо атака не позначена як
пробивна

5

Хоча моя конструкція не залишила фазу електронних таблиць, я прийшов до одного висновку щодо проектування математики для RPG:

Зберігайте їх максимально просто. У дизайні, над яким я працюю, я використовував дуже спрощені формули, адекватні системі без напівкласу. Тобто Заклинання Fireball має пошкодження 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.

І на закриваючих кінцях. Я не прийшов до цього висновку повністю самостійно. Я фактично витрачаю досить багато часу, читаючи різні посібники з RPG (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 ATK, бойовий сокир з бонусом 5000 ATK, але низьким мультиплікатором 145% - прекрасний вибір. Загальний збиток є (10+5000)*1.45 = 7264, але Есток з бонусом 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 для остаточних формул фантазії, вони там. У мене є копії фактичної механіки бою, включаючи AI для фінальних фантазій 4, 6, 7 і 9. Люди тріскали їх від оригінальних ігор, коли вони створювали роми для емуляторів. Там не так важко знайти, якщо ти виглядаєш досить важко.

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


2

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

Перші 2 речі:

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

Коли ви це знаєте, у вас є достатньо інформації, щоб використовувати математичні формули, про які BlueRaja згадував у своїй відповіді . Пам'ятайте лише, що немає такої речі, як "правильна" формула пошкоджень - лише така, яка відповідає вашому дизайну за типом досвіду, який ви хочете мати у своїх гравців.


Це надзвичайно корисний коментар. Це підсумовує "я не знаю", і через це це марний час кожного. Позначення для видалення.
Критичний

1

По черзі, якщо ви шукаєте дуже просту формулу, виконайте наступне:

(Зауважте, що це моя ідея формули,)

По-перше, для простої формули атаки вам знадобиться лише кілька статистичних даних. Атака гравця стати (це може бути сила чи магія, залежно від типу ходу.)

Потім створіть змінну, яку називають MovePower. Це буде залежати від ходу, а кращі рухи матимуть кращий MovePower. Для моєї формули загальні команди "Attack" мають MovePower 5.

Тоді зробіть захист на основі відсотків (і, звичайно, зробіть неможливим досягнення 100% захисту від збитку)

Тоді, під час фази атаки, просто помножте напад атаки на силу переміщення та видаліть пошкодження, грунтуючись на захисті ворогів! просто!

Ви також можете вибрати інших модифікаторів, наприклад, якщо хід вдарить (Точність), якщо рух має ще один додатковий ефект (Біо, нанесення отрути,) та вибрати для цього удари, (Точність знову), матимуть модернізацію / зменшення шкоди. рухи, які змінюють статистику, ect. Повеселіться!


Інший варіант, який дозволяє уникнути броні як відсоткового питання (таким чином дозволяючи своїм значенням виглядати однаково), - це обчислити збиток проти броні як порівняння, яке стає множником. Щось на зразок Ln (atk / def) як бази. Це дозволяє статистиці оборонної броні змінювати масштаб, оскільки час проходить однаково. З’ясуйте, як отримати базовий бажаний діапазон пошкоджень, коли статистика пошкоджень та броні однакова, і екстраполювати звідти. Це робить, щоб напади "уникнення броні" вимагали створення трюку, але це частина творчості.
Авіосе

1

По суті, потрібно з'ясувати дві речі.

  1. Як правильно виконати обчислення з великою кількістю.
  2. Як ви хочете і очікуєте, що збиток від атаки повинен вести себе проти слабших і сильних супротивників.

1

Ви можете користувач doubleабо бібліотеку великих номерів. Робота з великою кількістю обчислень (наприклад, при натисканні / простої гри часто покладається на такі великі бібліотеки). У вашому випадку цифри порівняно невеликі, тому використання 64-бітової плаваючої точки дозволить забезпечити необхідну гнучкість.

2

Як ви хочете, щоб гра поводилася? кілька прикладів:

  • Один із підходів полягає у використанні, ATKщоб вирішити, вдарили ви чи ні, і перекиньте штамп із відомим ступенем пошкодження залежно від зброї: наприклад, довгий меч 1d8, дворучний меч 1d10, кинджал 1d4. Це не матиме дивовижних масштабів, якщо к.с. можуть рости і далі. Якщо ви 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.