Я розробляю класичний 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 і намагався побудувати формулу таким чином (наприклад, зіставлення статистики атаки проти статистики оборони), але мені було цікаво, чи є простіший спосіб? Хоча я не можу передати повну механіку гри моєї гри тут, може хтось зможе запропонувати гарне вихідне місце для побудови формули пошкоджень?
Дякую