Вы, вероятно, задавались вопросом, как заставить навык наносить больше урона противникам с состоянием, или лечить больше, если у игрока есть состояние, или наносить ровно половину здоровья противника. И так далее.
Все это и многое другое можно сделать с помощью специальной формулы урона.
Основы:
Тип - устанавливает, формула наносит урон или лечит.
Нет - Ничего, никакого ущерба не будет нанесено.
Повреждение 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
Социальные закладки