Я подумал, что мне такой плагин тоже пригодится (правда, для статистических целей) и сделал.
DKR Actor Status Accumulator 1.0 для
MV
Код плагина нужно сохранить в файл с названием
DKR_ActorStatusAccumulator и расширением
.js (
DKR_ActorStatusAccumulator.js)
//-----------------------------------------------------------------------------
// DKR Actor Status Accumulator 1.0
//-----------------------------------------------------------------------------
// For: RPGMAKER MV
// DKR_ActorStatusAccumulator.js
//-----------------------------------------------------------------------------
// 28.11.2021 - Версия 1.0.0
//-----------------------------------------------------------------------------
// Поставляется AS-IS.
// Вся ответственность при использовании - на Пользователе!
//-----------------------------------------------------------------------------
var Imported = Imported || {};
Imported.DKR_ActorStatusAccumulator = true;
var DKR = DKR || {};
DKR.ActorStatusAccumulator = DKR.ActorStatusAccumulator || {};
//-----------------------------------------------------------------------------
/*:
* @plugindesc (v.1.0.0) Плагин позволяет считать, сколько раз на Персонажа было наложено Состояние.
*
* @target MV
* @author DarchanKaen
*
* @help
* DKR Actor Status Accumulator
* ----------------------------------------------------------------------------
*
* ---Общая информация:
* Плагин позволяет вести счет, сколько раз на Персонажа было наложено Состояние,
* получать эту инфорамацию, хранить ее и очищать.
* Информация сохраняется в Аккумуляторе, который хранится в указанной
* переменной; доступна 10 Аккумуляторов.
*
* ---Параметры плагина
* У плагина 10 параметров - номера переменных для
* сохранения соответствующего Аккумулятора;
* по-умолчанию в переменных 11-20.
*
* ---Использование плагина
* У персонажа в Примечании напишите:
* <statusAccumulator: N>,
* где N - номер Аккумулятора от 1 до 10.
*
* ---Команды(в эвенте команда "Скрипт"):
* DKR.ActorStatusAccumulator.getStatusCount(actorId, statusId)
* DKR.ActorStatusAccumulator.clearAccumulator(actorId)
* где actorId - номер Персонажа в Базе данных,
* statusId - номер Состояние в Базе данных.
*
* Команду скрипта DKR.ActorStatusAccumulator.getStatusCount
* можно использовать в Определении переменной или Условии!
* ----------------------------------------------------------------------------
* @param accumulator1VarId
* @type variable
* @desc Номер переменной для сохранения аккамулятора Актера 1
* @default 11
*
* @param accumulator2VarId
* @type variable
* @desc Номер переменной для сохранения аккамулятора Актера 2
* @default 12
*
* @param accumulator3VarId
* @type variable
* @desc Номер переменной для сохранения аккамулятора Актера 3
* @default 13
*
* @param accumulator4VarId
* @type variable
* @desc Номер переменной для сохранения аккамулятора Актера 4
* @default 14
*
* @param accumulator5VarId
* @type variable
* @desc Номер переменной для сохранения аккамулятора Актера 5
* @default 15
*
* @param accumulator6VarId
* @type variable
* @desc Номер переменной для сохранения аккамулятора Актера 6
* @default 16
*
* @param accumulator7VarId
* @type variable
* @desc Номер переменной для сохранения аккамулятора Актера 7
* @default 17
*
* @param accumulator8VarId
* @type variable
* @desc Номер переменной для сохранения аккамулятора Актера 8
* @default 18
*
* @param accumulator9VarId
* @type variable
* @desc Номер переменной для сохранения аккамулятора Актера 9
* @default 19
*
* @param accumulator10VarId
* @type variable
* @desc Номер переменной для сохранения аккамулятора Актера 10
* @default 20
*
*/
(function() {
//----DATA
DKR.ActorStatusAccumulator.parameters = PluginManager.parameters('DKR_ActorStatusAccumulator');
let accumulator1VarId = Number(DKR.ActorStatusAccumulator.parameters["accumulator1VarId"]) || 11;
let accumulator2VarId = Number(DKR.ActorStatusAccumulator.parameters["accumulator2VarId"]) || 12;
let accumulator3VarId = Number(DKR.ActorStatusAccumulator.parameters["accumulator3VarId"]) || 13;
let accumulator4VarId = Number(DKR.ActorStatusAccumulator.parameters["accumulator4VarId"]) || 14;
let accumulator5VarId = Number(DKR.ActorStatusAccumulator.parameters["accumulator5VarId"]) || 15;
let accumulator6VarId = Number(DKR.ActorStatusAccumulator.parameters["accumulator6VarId"]) || 16;
let accumulator7VarId = Number(DKR.ActorStatusAccumulator.parameters["accumulator7VarId"]) || 17;
let accumulator8VarId = Number(DKR.ActorStatusAccumulator.parameters["accumulator8VarId"]) || 18;
let accumulator9VarId = Number(DKR.ActorStatusAccumulator.parameters["accumulator9VarId"]) || 19;
let accumulator10VarId = Number(DKR.ActorStatusAccumulator.parameters["accumulator10VarId"]) || 20;
//----MODIFY
Game_Action.prototype.itemEffectAddNormalState = function(target, effect) {
var chance = effect.value1;
if (!this.isCertainHit()) {
chance *= target.stateRate(effect.dataId);
chance *= this.lukEffectRate(target);
}
if (Math.random() < chance) {
target.addState(effect.dataId);
this.makeSuccess(target);
}
//--mod
if( true === target.isActor() ){
addStatusToActorAccumulator(target, effect.dataId);
}
};
Game_Interpreter.prototype.command313 = function() {
this.iterateActorEx(this._params[0], this._params[1], function(actor) {
var alreadyDead = actor.isDead();
if (this._params[2] === 0) {
actor.addState(this._params[3]);
//--mod
addStatusToActorAccumulator(actor, this._params[3]);
} else {
actor.removeState(this._params[3]);
}
if (actor.isDead() && !alreadyDead) {
actor.performCollapse();
}
actor.clearResult();
}.bind(this));
return true;
};
//----LOGIC
let addStatusToActorAccumulator = function(gameActor, statusId){
let actorId = gameActor.actorId();
let actorStatusAccumulatorVarId = getActorStatusAccumulatorVarId(actorId);
let actorStatusAccumulator = null;
if(-1 !== actorStatusAccumulatorVarId){
actorStatusAccumulator = $gameVariables.value(actorStatusAccumulatorVarId) || [];
actorStatusAccumulator.push(statusId);
$gameVariables.setValue(actorStatusAccumulatorVarId, actorStatusAccumulator);
}
}
let getActorStatusAccumulatorVarId = function(actorId){
let actorStatusAccumulatorVarId = -1;
let actorMetadata = getActorMetadata(actorId);
let actorStatusAccumulatorID = -1;
actorStatusAccumulatorID = Number(actorMetadata.statusAccumulator);
actorStatusAccumulatorVarId = getAccumulatorVarIdByAccumId(actorStatusAccumulatorID);
//console.log('_actorStatusAccumulatorID:', actorStatusAccumulatorID);
//console.log('_actorStatusAccumulatorVarId:', actorStatusAccumulatorVarId);
return actorStatusAccumulatorVarId;
}
let getActorMetadata = function(actorId){
let actorMetadata = null;
let actor = $dataActors[actorId];
actorMetadata = actor.meta;
return actorMetadata;
}
let getAccumulatorVarIdByAccumId = function(actorStatusAccumulatorID){
let actorStatusAccumulatorVarId = null;
switch(actorStatusAccumulatorID){
case 1:
actorStatusAccumulatorVarId = accumulator1VarId;
break;
case 2:
actorStatusAccumulatorVarId = accumulator2VarId;
break;
case 3:
actorStatusAccumulatorVarId = accumulator3VarId;
break;
case 4:
actorStatusAccumulatorVarId = accumulator4VarId;
break;
case 5:
actorStatusAccumulatorVarId = accumulator5VarId;
break;
case 6:
actorStatusAccumulatorVarId = accumulator6VarId;
break;
case 7:
actorStatusAccumulatorVarId = accumulator7VarId;
break;
case 8:
actorStatusAccumulatorVarId = accumulator8VarId;
break;
case 9:
actorStatusAccumulatorVarId = accumulator9VarId;;
break;
case 10:
actorStatusAccumulatorVarId = accumulator10VarId;
break;
default:
actorStatusAccumulatorVarId = -1;
break;
}
return actorStatusAccumulatorVarId;
}
let getStatusCountInAccumulator = function(actorId, statusId){
let statusCount = 0;
let actorStatusAccumulatorVarId = getActorStatusAccumulatorVarId(actorId);
let actorStatusAccumulator = null;
if(-1 !== actorStatusAccumulatorVarId){
actorStatusAccumulator = $gameVariables.value(actorStatusAccumulatorVarId) || [];
for(let n = 0; n < actorStatusAccumulator.length; n++){
let currentStatusId = actorStatusAccumulator[n];
if(currentStatusId === statusId){
statusCount++;
}
}
}
//console.log('statusCount of ' + statusId + ' is: ' + statusCount);
return statusCount;
}
clearConcreteStatusAccumulator = function(actorId){
let actorStatusAccumulatorVarId = getActorStatusAccumulatorVarId(actorId);
if(-1 !== actorStatusAccumulatorVarId){
$gameVariables.setValue(actorStatusAccumulatorVarId, []);
}
}
//-----COMMANDS
DKR.ActorStatusAccumulator.getStatusCount = function(actorId, statusId){
return getStatusCountInAccumulator(actorId, statusId);
}
DKR.ActorStatusAccumulator.clearAccumulator = function(actorId){
clearConcreteStatusAccumulator(actorId);
}
})();
Плагин не совместим с другими плагинами, как-то влияющими на логику работы Состояний, т.к. изменяет эту логику.
Плагин поставляется
AS-IS,
вся ответственность на
Пользователе (!).
Для использование нужно в Примечании Персонажа написать
<statusAccumulator: N>, где
N - номер Аккумулятора от 1 до 10.
После чего можно в вызове скрипта (например, в Определении переменной или Условии) получать количество определенного Состояние, наложенного на персонажа, такой скриптовой командой:
DKR.ActorStatusAccumulator.getStatusCount(actorId, statusId),
где
actorId - номер Персонажа в Базе данных,
statusId - номер Состояние в Базе данных.
Более подробная информация - в описании плагина.
Применительно к конкретно твоему случаю,
ZakRew, можно в Определении переменной в отдельную переменную сохранять количество, сколько раз на персонажа было наложено Состояние, и если кол-во равно или больше необходимого - вызывать команду "Изучить навык".
P.S:
Код, вероятно, не оптимальный - но он работает.