Плохо! Плохо!:  0
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 18

Тема: Формулы урона и с чем их едят (RPG MAKER MV)

  1. #1

    По умолчанию Формулы урона и с чем их едят (RPG MAKER MV)

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

    Все это и многое другое можно сделать с помощью специальной формулы урона.




    Основы:

    Тип - устанавливает, формула наносит урон или лечит.
    Нет - Ничего, никакого ущерба не будет нанесено.
    Повреждение HP - Нанесение Урона НР
    Повреждение МР - Нанесение Урона MP
    Восстановление HP - Лечение\восстановление HP
    Восстановление МР - Лечение\восстановление МР
    Поглощение НР - Наносит урон вражескому HP и восстанавливает столько HP для атакующего
    Поглощение МР - наносит урон вражескому MP и восстанавливает столько MP для атакующего

    Элемент - Устанавливает, какой элемент использовать. Нормальная атака - значит будет использовать тот же элемент, что и оружие.

    Дисперсия \ Вариантность - как будет колебаться урон. Например. Если в формуле умения сказано, что он наносит 100 урона, а дисперсия \ вариантность составляет 20%, умение будет наносить от 80 до 120 урона.

    Критический - умение может наносить критический удар, нанося увеличенный урон на 300%.



    А теперь самое интересное - формулы!
    Они решают, какой урон получит противник или на сколько исцелит его союзник.

    Давайте рассмотрим одну из основных формул.
    Предположим мы делаем спецприем магия огня.

    Прописываем в окошко Формула следующее значение
    100 + a.mat * 2 - b.mdf * 2 - Что это означает? Давайте по порядку.

    Что означают буквы a и b?
    а - нападающий
    б - защищающийся
    Получается, если игрок кастует на противника орка магию огонь, то герой является нападающим "а", в то время как орк
    является защищаюмся "b"

    Значение означает, что параметр принимает двойной коэффициент игрок mat (Магическая атака), вычитает двойной параметр mdf (магическая защита) противника орка и добавляет его к 100 в начале формулы.
    Например. У игрока 100 маг.атаки, а у орка 20 мдф. Если бы мы преобразовали формулу, используя эти числа, у нас было бы - 100 + 100 * 2 - 20 * 2, после расчета мы увидим, что с этими параметрами огонь нанес бы 260 повреждений, если бы не было вариантности.


    Но! Только последний номер в формуле наносит урон. Если у вас 2 строки формулы. (точка с запятой; указывает, где заканчивается строка для программы)
    Например a.atk; a.atk * 2
    Только a.atk * 2 будет рассчитан на урон.


    Есть ли еще буквы, кроме a и b для формул?
    Да. Есть переменные. Которые используются так: v [ID]. ID - индекс переменной.
    Таким образом, вы можете иметь навык, который становится сильнее, чем выше переменная.
    Например. v [10] * 2 - b.def * 3


    Есть ли способ сделать навык еще более сложным, например, если какая-то переменная превышает 100, нанести дополнительный урон?
    Да, в этом случае мы можем использовать операторы if else.
    Как, команда выглядит:


    if (переменная)
    {
    формула1;
    }
    else
    {
    формула2;
    }


    Но как записать это в формулу урона?
    Она имеет только 1 строку!
    Просто напишите все вместе

    if (переменная) {формула1; } else {формула2; }

    if (v [10]> 100) {a.atk * 4 - b.def * 2} else {a.atk * 2 - b.def * 2}

    Формулу модно сократить, если вы используете только 1 строку формулы.

    if (переменная)
    формула 1;
    else
    Formula2;

    if (v [10]> 100) a.atk * 4 - b.def * 2; иначе a.atk * 2 - b.def * 2;

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

    Переменная ? формула1 : формула2;

    v[10] > 100 ? a.atk*4 - b.def*2 : a.atk*2 - b.def*2;


    Символы для переменной:

    > - больше чем
    <- меньше чем
    > = больше или равно
    <= меньше или равно
    === равно
    && а также
    || или же
    ! == не равно
    ! нет


    Примеры:

    v [10]> 100? 1000: 100; (Если(if) переменная 10 больше 100, она нанесет 1000 урона, иначе(else) она нанесет только 100)

    v [10] <100? 1000: 100; (Если переменная 10 меньше 100, она нанесет 1000 урона, иначе она нанесет только 100)

    v [10]> == 100? 1000: 100; (Если переменная равна 100 или более, она нанесет 1000 урона, иначе она нанесет только 100)

    v [10] <== 100? 1000: 100; (Если переменная равна 100 или меньше, она нанесет 1000 урона, иначе она нанесет только 100)

    v [10] === 100? 1000: 100; (Если переменная равна 100, она нанесет 1000 урона, иначе она нанесет только 100)

    v [10]> 50 && v [11]> == 25? 1000: 100; (Если переменная 10 больше 50, а переменная 11 25 или больше, она нанесет 1000 урона, иначе она нанесет только 100)

    v [10]> 50 || v [11]> 50? 1000: 100; (Если переменная 10 больше 50 или переменная 11 больше 50, тогда она нанесет 1000 урона, она нанесет только 100)

    v [10]! == 100? 1000: 100; (Если переменная 10 не равна 100, она нанесет 1000 урона, иначе она нанесет только 100)



    Как насчет параметров для использования для a и b?

    Вот полный список:

    Текущий: (Все плоские числа, например: 900, 999, 11)

    level - текущий уровень (герой только по умолчанию)
    hp. - текущий хп
    mp - текущий мп
    tp - текущий tp



    Параметры: (Все плоские числа, например: 1337, 7331, 156)




    mhp - максимальное хп
    mmp - максимальное мп
    atk - атака
    def - защита
    mat - магическая атака
    mdf - магическая защита
    agi - скорость
    luk - удача



    доп параметры: (Все десятичные числа, обозначающие проценты, например, 1,0, 0,5, 0,75, 2,44, будут равны 100%, 50%, 75%, 244%)





    hit - шанс попадания
    eva - шанс уклонения
    cri - шанс критических попаданий
    cev - шанс уклонения от критических попаданий
    mev - шанс уклонения от магии
    mrf - шанс отражения магии
    cnt - контратака
    hrg - регенерация хп
    mrg - регенерация мп
    trg - регенерация тп


    Спец параметры: (Все десятичные числа, обозначающие проценты, например, 1,0, 0,5, 0,75, 2,44, будут 100%, 50%, 75%, 244%)





    tgr - шанс стать целью
    grd - Эффективность защиты
    rec - эффект восстановления
    pha - Фармакология
    mcr - стоимость Мп
    tcr - скорость зарядки тп
    pdr - получение физического урона
    mdr - получение магического урона
    fdr - повреждение от поверхности
    exr - опыт



    Как насчет изменения HP / MP / TP?


    gainHp (значение) - восстанавливает HP по значению
    gainMp (значение) - восстанавливает MP по значению
    gainTp (значение) - восстанавливает TP по значению

    setHp (hp) - устанавливает значение HP
    setMp (mp) - устанавливает значение MP в значение
    setTp (tp) - устанавливает значение TP в значение
    Например. a.setHp (a.mhp)
    Например. a.setHp (a.hp + 100)

    clearTp () - устанавливает TP в 0

    Как насчет продвинутых вещей, где вы можете влиять на формулы с состояниями?

    isStateActed (stateId) - проверяет, есть ли у сражающегося состояние, нанесенное им.
    Например. b.isStateActed (10)? 10000: 1;

    isDeathStateActed () - проверяет, есть ли у сражающегося состояние смерти.
    Например. b.isDeathStateActed ()? 10000: 1;

    resetStateCounts (Id состояния) - обновляет, как долго будет длиться состояние для бойца
    if (b.isStateActed (10)) b.resetStateCounts (10); 100

    updateStateTurns () - сокращает все состояния бойца на 1 ход
    b.updateStateTurns (); 100

    addState (Id состояния) - добавляет состояние бойцу
    if (! b.isStateActed (10)) b.addState (10); 100

    isStateAddable (stateId) - проверяет, может ли состояние быть добавлено к сражающемуся
    с = 100; if (b.isStateAddable (10)) b.addState (10); иначе с = 4000; с

    removeState (stateId) - удаляет состояние бойца
    if (a.isStateActed (10)) a.removeState (10); 0



    А как насчет баффов? Можем ли мы усиливать и ослаблять бойцов?

    Можем!

    addBuff (Id параметра, кол-во ходов) - добавляет бафф для параметра
    a.addBuff (0, 3); b.def * 10

    addDebuff (Id параметра, кол-во ходов) - добавляет дебафф для параметра
    b.addDebuff (2, 10); 9999

    removeBuff (Id параметра) - удаляет бафф или дебафф из бойца
    removeAllBuffs () - удаляет все баффы и дебаффы у бойца


    ID параметров

    0 - Максимальное HP
    1 - Максимальное MP
    2 - Атакая
    3 - Защита
    4 - Магическая атака
    5 - Магическая защита
    6 - Скорость
    7 - Удача



    die() - убивает бойца
    b.die(); 0

    revive() - воскрешает бойца
    a.revive(); 1000

    paramBase(Id параметра) - получить базовы параметр
    a.paramBase(3)*10 - b.def*2

    paramPlus(Id параметра) - получить прибавку к параметру
    a.paramPlus(3)*2 - b.def*2

    paramMax(Id параметра) - получить максимальный параметр
    b.paramMax(0)

    elementRate(Id элемента) - проверяет элемент бойца (скорость - десятичные числа, в процентаже)
    b.elementRate(10) >== 0.5 ? 10000 : a.mat*4;

    isStateResist(Id состояния) - проверяет, сопротивляется ли боец состоянию
    c=0; b.isStateResist(10) ? c+=2000 : b.addState(10); c

    isSkillTypeSealed(Id типа навыка) - проверяет, запечатан ли тип навыка бойца
    isSkillSealed(Id навыка) - проверяет, запечатан ли навык бойца
    isEquipTypeSealed(Id типа экипировки) - проверяет, запечатан ли тип экипировки бойца
    isDualWield() - проверяет, может ли боец брать два оружия
    isGuard() - проверяет, защищается ли в данный момент ли боец
    recoverAll() - снимает все состояния, восстанавливает хп и мп

    hpRate() - проверяет уровень ХП бойца
    mpRate() - проверяет уровень МП бойца
    tpRate() - проверяет уровень ТП бойца
    b.hpRate() < 0.5 ? b.hp-1 : 100;

    isActor() - Проверяет кем является боец (герой или враг) -для проверки героя
    isEnemy() - роверяет кем является боец (герой или враг) -для проверки врага
    escape() - побег из битвы
    b.escape() (заставляет врага сбежать)

    consumeItem(предмет) - использовать предмет
    a.consumeItem($dataItems[15]); 100


    Только для героя(игрока):

    currentExp () - текущий опыт
    currentLevelExp () - опыт необходимый для текущего уровня
    nextLevelExp () - опыт необходимый для следующего уровня
    nextRequiredExp () - опыта осталось до следующего уровня
    maxLevel () - максимальный уровень героя
    isMaxlevel () - максимальный уровень героя (true / false)
    hasWeapon () - герой, владеющий оружием (true / false)
    hasArmor () - герой в любой броне (true / false)
    clearEquipments () - снять все, что носит герой
    isClass (gameClass) - проверяет, принадлежит ли герой к классу (gameClass - $ dataClasses [ID])
    hasNoWeapons () - проверяет, нет ли у героя оружия
    levelUp () - поднимает уровень героя
    levelDown () - уровень героя вниз
    gainExp (exp) - дает героя exp
    learnSkill (skillId) - заставляет героя выучить навык
    ForgotSkill (skillId) - заставляет героя забыть навык
    isLearnedSkill (skillId) - проверяет, изучил ли героя навык
    actorId () - идентификатор героя (ID)

    только для врагов:
    enemyId() - идентификатор врага (ID)


    Как насчет математики? Можем ли мы использовать математические методы внутри формулы?

    Да, можете.

    Math.random () - возвращает случайное число от 0 до 1 (0 <= n <1)
    Math.min (numbers) - возвращает минимальное число из предоставленных номеров.
    Например. Math.min (10, 50, 40, 200) - вернется 10.

    Math.max (число) - возвращает максимальное число из предоставленных номеров.
    Например. Math.max (10, 50, 40, 200) - вернул бы 200.

    Math.round (число) - округляет число до ближайшего целого числа.
    Math.ceil (число) - округляет число до ближайшего целого числа. (округляет в большую сторону до целого числа)
    Math.floor (число) - округляет число до ближайшего целого числа. (округляет в меньшую сторону до целого числа)

    Math.rand () возвращает число от 0 до 1, но можем ли мы получить случайное число от 1 до 100? Или 5 и 200?

    Нет проблем:

    Math.floor (Math.random () * 100) +1
    Это вернуло бы число от 1 до 100. Если бы мы не добавили 1 в конце, оно вернуло бы только число от 0 до 99.

    Слишком многА бУкАв? Можем ли мы как-нибудь упростить?

    К счастью, в rpg_core.js есть метод, который добавляет Math.randomInt (max);
    Таким образом, мы можем написать то же самое, используя:
    Math.randomInt (100) +1
    Последний раз редактировалось Elazul; 21.06.2019 в 07:46.

  2. #2
    Пользователь Аватар для Noxmils
    Информация о пользователе
    Регистрация
    08.05.2018
    Адрес
    Казахстан, Шымкент
    Сообщений
    31
    Записей в дневнике
    1
    Репутация: 7 Добавить или отнять репутацию

    По умолчанию

    Следует поправить относительно Math.ceil и Math.floor. Они округляют не до ближайшего целого числа. Math.ceil округляет в большую сторону, например,
    Math.ceil(3.14) = 4. Math.floor округляет в меньшую сторону, например Math.floor(5.99) = 5.

  3. #3

  4. #4
    Познающий Аватар для ZoWW
    Информация о пользователе
    Регистрация
    15.12.2013
    Сообщений
    487
    Репутация: 12 Добавить или отнять репутацию

    По умолчанию

    А что имеется в виду под фармакологией в этой строке: "pha - Фармакология"?

  5. #5

    По умолчанию

    Я час сидел и бился над этими формулами, пытаясь привязать урон к состоянию, пока не догадался найти оригинал статьи (https://forums.rpgmakerweb.com/index...las-101.81905/)!

    Так вот, в переводе ошибка, и вместо isStateActed (stateId) следует использовать isStateAffected(stateId)

  6. #6
    Маститый Аватар для Seibur
    Информация о пользователе
    Регистрация
    07.01.2012
    Адрес
    Изумрудный город
    Сообщений
    1,206
    Записей в дневнике
    3
    Репутация: 58 Добавить или отнять репутацию

    По умолчанию

    Что делать если монстр не хочет себя убивать? (Самоуничтожаться)

    В формулах рпг мейкера есть баг:

    Если в навыке героя написать так:

    Код:
    v[1] < v[2] ? a.die():b.die()
    если переменная 1 будет меньше переменной 2, то герой уничтожается.

    Но если в навыке монстра написать так:

    Код:
    v[2] > v[1] ? b.die():a.die()
    если переменная 2 будет меньше переменной 1, то у монстра отнимаются все хп, но спрайт монстра не исчезает.

    Чтобы это исправить нужно написать так:

    Код:
    v[2] > v[1] ? b.die():a.setHp(0);a.performCollapse()
    Тогда всё будет работать
    Последний раз редактировалось Seibur; 26.12.2020 в 15:10.

  7. #7
    Бывалый Аватар для PanzerCat
    Информация о пользователе
    Регистрация
    09.04.2017
    Адрес
    Тула
    Сообщений
    806
    Репутация: 60 Добавить или отнять репутацию

    По умолчанию

    Опа! хорошо что поднялась тема. Совсем забыл про неё!

    Итак:
    У меня есть навык таран, урон противнику + небольшой себе:
    Спойлер :




    Но при таком раскладе юнит получает -2 урона когда все начинают ходить, а потом ещё -2 после урона врагу. Получается двойной урон себе.
    поэтому чтобы соответствовало надо писать a.gainHp(-1); 6 чтобы сходилось.

    Почему так???

  8. #8

    По умолчанию

    Цитата Сообщение от PanzerCat Посмотреть сообщение
    Но при таком раскладе юнит получает -2 урона когда все начинают ходить, а потом ещё -2 после урона врагу. Получается двойной урон себе.
    поэтому чтобы соответствовало надо писать a.gainHp(-1); 6 чтобы сходилось.

    Почему так???
    Проверил на чистом проекте формулу a.gainHp(-2); 6. Всё работает, как надо: один раз отнимает у 2хп у игрока и 6 - у противника. Видимо, имеется ещё что-то (скрипт, событие, состояние), которое дублирует этот урон.

  9. #9
    Бывалый Аватар для Phileas
    Информация о пользователе
    Регистрация
    05.02.2016
    Адрес
    HD 128620, HR 5459, CP−60°5483, GCTP 3309.00A, LHS 50
    Сообщений
    617
    Записей в дневнике
    26
    Репутация: 22 Добавить или отнять репутацию

    По умолчанию

    Цитата Сообщение от Alx_Yago Посмотреть сообщение
    Проверил на чистом проекте формулу a.gainHp(-2); 6. Всё работает, как надо: один раз отнимает у 2хп у игрока и 6 - у противника. Видимо, имеется ещё что-то (скрипт, событие, состояние), которое дублирует этот урон.
    Я же правильно понимаю, что это работает только в MV/MZ? Или в VX Ace можно что-то подобное сделать только через формулы? Сейчас я для похожего навыка использую состояние, но это работает не совсем так, как хотелось бы.
    Мои игры

    Мой Telegram-канал

    Мой Boosty



    Спойлер In my humble opinion :

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

  10. #10
    Бывалый Аватар для Darchan Kaen
    Информация о пользователе
    Регистрация
    17.06.2013
    Адрес
    Одесса
    Сообщений
    851
    Записей в дневнике
    3
    Репутация: 47 Добавить или отнять репутацию

    По умолчанию

    Цитата Сообщение от Phileas Посмотреть сообщение
    Я же правильно понимаю, что это работает только в MV/MZ? Или в VX Ace можно что-то подобное сделать только через формулы? Сейчас я для похожего навыка использую состояние, но это работает не совсем так, как хотелось бы.
    В VX Ace можно в формуле урона указать(без кавычек) "a.hp -= N; return a.hp" , где N - урон который должен наносится использующему игроку.
    По идее, можно вместо числа указать формулу с учетом параметров игрока, типа "a.hp -= (a.atk * 2 - a.def); return a.hp" , но это нужно тестить отдельно (при беглой проверке вроде работает; число - точно работает).

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Формулы урона и с чем их едят (RPG MAKER MV)