//=============================================================================
// Salted Fish Plugins - State Custom Addition
// SF_StatesCustomAddtion.js
//=============================================================================
"use strict";
var Imported = Imported || {};
Imported.SF_StatesCustomAddtion = true;
var SF_Plugins = SF_Plugins || {};
//=============================================================================
/*:
* @plugindesc 状态添加过程自定义插件
* @author Salted Fish
*
* @help
* ============================================================================
* 介绍
* ============================================================================
* 该插件可以自定义状态添加过程,可以在状态添加前进行自定义的判断。
* 添加前,提供一个回调函数,可以在添加前进行自定义操作。
* this 指向 target Game_Battler
*
* ============================================================================
* 使用
* ============================================================================
* 添加前的自定义操作,提供一个回调函数,可以在添加前进行自定义操作。
* this 指向 target Game_Battler
*
* 代码
*
*
* 提供参数:
* - target:目标 Game_Battler
* - stateId:即将添加的状态ID
* 返回值:
* {
* // 是否终止后续操作
* "result": true/false,
* // 需要添加的状态数组
* "statesAdd": [1, 2, 3],
* // 需要删除的状态数组
* "statesRemove": [1, 2, 3],
* // 需要刷新回合数的状态数组
* "statesRefresh": [1, 2, 3],
* }
* 后续操作:
* - 如果 result 为 true,则终止后续操作
* - 如果 result 为 false,则继续后续操作
* - 如果 statesRemove 不为空,则删除 statesRemove 中的状态
* - 如果 statesRefresh 不为空,则刷新 statesRefresh 中的状态回合数
* - 如果 statesAdd 不为空,则添加 statesAdd 中的状态,
* 这里不会再次触发添加前的自定义操作
*
* ============================================================================
* 举例
* ============================================================================
* 1. 添加状态 125 前,
* 如果目标已经拥有状态 124,则删除状态 124,添加状态 125
* 否则,添加状态 125、
*
*
* var result = {
* "result": false,
* "statesAdd": [],
* "statesRemove": [],
* "statesRefresh": [],
* };
* if (this.isStateAffected(124)) {
* result.statesRemove.push(124);
* result.statesAdd.push(125);
* }
* else {
* result.statesAdd.push(125);
* }
* return result;
*
*
*============================================================================
* 举例2
*============================================================================
* 2. 添加状态60前,
* 生成整随机数1~10,如果随机数小于等于5,则添加状态148
* (随机数结果不影响状态60)的添加
*
*
* var result = {
* "result": false,
* "statesAdd": [],
* "statesRemove": [],
* "statesRefresh": [],
* };
* result.statesAdd.push(60);
* var random = Math.floor(Math.random() * 10 + 1);
* if (random <= 5) {
* result.statesAdd.push(148);
* }
* return result;
*
*
*
* ============================================================================
* 已知问题
* ============================================================================
* - 与状态叠加插件和状态覆盖插件不兼容。
*
*/
//=============================================================================
SF_Plugins.SF_StatesCustomAddtion = SF_Plugins.SF_StatesCustomAddtion || {};
SF_Plugins.SF_StatesCustomAddtion.version = 1.0;
//=============================================================================
// DataManager
//=============================================================================
SF_Plugins.SF_StatesCustomAddtion.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function () {
if (!SF_Plugins.SF_StatesCustomAddtion.DataManager_isDatabaseLoaded.call(this)) return false;
if (!this.processStatesCustomAddtionNotetags($dataStates)) return false;
return true;
};
DataManager.processStatesCustomAddtionNotetags = function (group) {
var note1 = /<(?:SF_StatesCustomAddtion_Before)>/i;
var note2 = /<\/(?:SF_StatesCustomAddtion_Before)>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
var mode = "none";
obj.SF_StatesCustomAddtion_Before = "";
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(note1)) {
mode = "SF_StatesCustomAddtion_Before";
} else if (line.match(note2)) {
mode = "none";
} else if (mode === "SF_StatesCustomAddtion_Before") {
obj.SF_StatesCustomAddtion_Before += line + "\n";
}
}
if (obj.SF_StatesCustomAddtion_Before) {
obj.SF_StatesCustomAddtion_Before = new Function("target", "stateId", obj.SF_StatesCustomAddtion_Before);
}
}
return true;
};
//=============================================================================
// Game_Battler
//=============================================================================
SF_Plugins.SF_StatesCustomAddtion.Game_Battler_addState = Game_Battler.prototype.addState;
Game_Battler.prototype.addState = function (stateId) {
var state = $dataStates[stateId];
if (state.SF_StatesCustomAddtion_Before) {
var result = state.SF_StatesCustomAddtion_Before.call(this, this, stateId);
if (result.result) return;
if (result.statesRemove) {
for (var i = 0; i < result.statesRemove.length; i++) {
this.removeState(result.statesRemove[i]);
}
}
if (result.statesRefresh) {
for (var i = 0; i < result.statesRefresh.length; i++) {
this.resetStateCounts(result.statesRefresh[i]);
}
}
if (result.statesAdd) {
for (var i = 0; i < result.statesAdd.length; i++) {
SF_Plugins.SF_StatesCustomAddtion.Game_Battler_addState.call(this, result.statesAdd[i]);
}
}
return;
}
SF_Plugins.SF_StatesCustomAddtion.Game_Battler_addState.call(this, stateId);
};