YEP_AutoPassiveStates добавляет определённое состояние (<Passive State: x>, где x — это ID) при определённых условиях. То есть мы можем менять цену в здоровье (hpCost) в зависимости от состояния независимо от того, было это состояние добавлено с помощью YEP_AutoPassiveStates или как-то ещё.
Я написал код, чтобы состояния меняли цена умений в HP. Сохраните его в какой-то файл в папке plugins в файле с расширением js (например, "Sefirot_HpCostMultiplier.js") и подключите как плагин
после YEP_SkillsCore:
//Код ниже в общественном достоянии согласно Creative Commons Zero. Автор разрешает
//делать с ним что угодно, в том числе заявлять, что вы сами его написали.
//Функция, которая проверяет примечание у одного состояния и устанавливает
//sefirotHpCostMultiplier в зависимости от <HP Cost Multiplier: n%>
function sefirotSetHpConstMultiplier(state) {
//По умолчанию цена в HP умножается на 1 (т.е. не меняется)
state.sefirotHpCostMultiplier = 1;
//разбиваем примечание на строки
var notetagLines = state.note.split(/[\r\n]+/);
for (var i = 0; i < notetagLines.length; i++) {
var line = notetagLines[i];
var matchedPercent = line.match(/<(?:HP Cost Multiplier):\s+(\d+(?:\.\d+)?)%>/i);
if (matchedPercent) {
//Если в конце есть знак %, то делим коэффициент на 100
state.sefirotHpCostMultiplier = parseFloat(matchedPercent[1]) / 100.0;
}
var matchedExact = line.match(/<(?:HP Cost Multiplier):\s+(\d+(?:\.\d+)?)>/i);
if (matchedExact) {
//Если в конце нет знака %, то присваиваем значение дословно
state.sefirotHpCostMultiplier = parseFloat(matchedExact[1]);
}
}
}
//Переопределяем isDatabaseLoaded, чтобы он читал примечание <HP Cost Multiplier: n%>
var Sefirot_DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
var notetagsProcessed = false;
DataManager.isDatabaseLoaded = function() {
if (!Sefirot_DataManager_isDatabaseLoaded.call(this)) {
return false;
}
if (!notetagsProcessed) {
//проходимся по всем состояниям и присваиваем им sefirotHpCostMultiplier
//в зависимости от строчки в примечании <HP Cost Multiplier: n%>
for (var i = 1; i < $dataStates.length; i++) {
sefirotSetHpConstMultiplier($dataStates[i]);
}
notetagsProcessed = true;
}
return true;
}
// Перепишем функцию skillHpCost, чтобы она меняла hpCost
// согласно параметру из примечания
// Мы переписываем функцию из YEP_SkillsCore, так что этот
// код должен выполняться ПОСЛЕ YEP_SkillsCore
var Sefirot_Game_BattlerBase_skillHpCost = Game_BattlerBase.prototype.skillHpCost
Game_BattlerBase.prototype.skillHpCost = function (skill) {
var hpCost = Sefirot_Game_BattlerBase_skillHpCost.call(this, skill);
//Проходимся по активным состояниям и умножаем hpCost на sefirotHpCostMultiplier
this.states().forEach(function (state) {
hpCost *= state.sefirotHpCostMultiplier;
});
//Если получилось дробное число, округлим его вверх
return Math.ceil(hpCost);
}
Чтобы с этим кодом увеличить стоимость умений в здоровье вдвое, добавьте в примечание (notetag) к состоянию такую строчку:
<HP Cost Multiplier: 200%>
А чтобы уменьшить наполовину, такую:
<HP Cost Multiplier: 50%>
Я проверял этот код, и у меня он работает. Но если что-то не работает, пишите сюда, будем разбираться.