mutation/www/js/plugins/HzExState.js
2024-08-10 09:53:59 -05:00

277 lines
12 KiB
JavaScript

/*:
* @plugindesc ステートの拡張(ステート解除時に別のステートを自動付与など)を行います。
* @author hiz
*
* @help
* ステートのメモに記述を追加することで、ステートの拡張を行います。
* 行える拡張は以下の通りです。
*  ・ステートがターン数/歩数/ダメージで自動解除された際、別のステートを付与
*  ・アイテム又はスキルによってステートが解除された際、別のステートを付与
*  ・他のステートが付与された際、別のステートに変わる
*  ・全回復・戦闘不能時に、ステートを解除しない。
*
* ステートメモ:
* <hzExState_auto:[nextStateId]> # ステートがターン数/歩数/ダメージで自動解除された際、ID[nextStateId]のステートを付与
* <hzExState_item:[nextStateId]> # アイテム又はスキルによってステートが解除された際、ID[nextStateId]のステートを付与
* <hzExState_stack:[stateId],[nextStateId]> # 他のステート[stateID]が付与された際、ステート[nextStateId]に変わる
* # ※ ステート[stateID]は解除される
* <hzExState_remain> # 全回復・戦闘不能時に、ステートを解除しない。
* # ※ 自動解除、アイテム・スキルによる解除は可能です。
*
* 例)
* <hzExState_auto:10> # ステートがターン数/歩数/ダメージで自動解除された際、ID10のステートを付与
* # 例)病気のステートを歩数で自動解除するように設定し、
* #   解除の際に重病のステートを付与するように設定すれば、
* # 歩数で悪化するステートを実現できます。
*
* <hzExState_item:12> # アイテム又はスキルによってステートが解除された際、ID12のステートを付与
* # 例)重病のステートをスキルで回復すると病気のステートが付与されるように設定すれば、
* # 複数回の回復が必要なステートを実現できます。
*
* <hzExState_stack:10, 11> # ID10のステートが付与された際、ID11のステートを付与。
* # 例)攻撃力上昇のステート(ID:10)が付与されたキャラに更に攻撃力上昇のステートを重ねると
* # 攻撃力超上昇のステート(ID:11)が付与されるなど、スタックされるステートを実現できます。
* # ※ 攻撃力超上昇のステートが付与されたキャラに攻撃力上昇のステートを重複できないようにするには、
* # 攻撃力超上昇のステートのメモにも、<hzExState_stack:10, 11>を記載して下さい。
*
* <hzExState_remain> # 全回復・戦闘不能時に、ステートを解除しない。
* # 例)呪いなど、宿屋で回復できないステートを実現できます。
* # また、有利なステートを全回復時に解除したく無い場合にも利用できます。
*/
(function () {
var hzRemoveStateType = "";
var _Game_Battler_addState = Game_Battler.prototype.addState;
var _Game_Battler_removeState = Game_Battler.prototype.removeState;
// ステート追加処理
Game_Battler.prototype.addState = function (stateId) {
var added = this.isStateAddable(stateId);
var stackStates;
if (added) {
// 関連するスタック設定を持つステートの有無をチェック
stackStates = this._states.filter(function (id) {
if ($dataStates[id].meta.hzExState_stack !== undefined) {
var stackParms = $dataStates[id].meta.hzExState_stack.split(",");
return stateId === Number(stackParms[0]);
}
return false;
});
}
_Game_Battler_addState.call(this, stateId);
if (added) {
// スタック処理(変更後のステート付与メッセージのみ表示)
if (stackStates.length !== 0) {
var self = this;
var nextStates = [];
// ステート付与のメッセージを削除
this._result.addedStates = this._result.addedStates.filter(function (
elm
) {
return elm !== stateId;
});
// 関連スタック設定を持つステートがある場合
stackStates.forEach(function (id) {
// スタック設定を持つステートを解除し、次のステートを付与
var stackParms = $dataStates[id].meta.hzExState_stack.split(",");
var nextStateId = Number(stackParms[1]);
if (id === nextStateId) return;
_Game_Battler_removeState.call(self, id);
// ステート解除のメッセージを削除
self._result.removedStates = self._result.removedStates.filter(
function (elm) {
return elm !== id;
}
);
_Game_Battler_addState.call(self, nextStateId);
if (stateId === nextStateId) {
// ステート付与のメッセージを削除
self._result.addedStates = self._result.addedStates.filter(
function (elm) {
return elm !== stateId;
}
);
}
});
// 追加したステートを解除
_Game_Battler_removeState.call(this, stateId);
// ステート解除のメッセージを削除
this._result.removedStates = this._result.removedStates.filter(
function (elm) {
return elm !== stateId;
}
);
}
}
};
// ステート解除処理
Game_Battler.prototype.removeState = function (stateId) {
var affected = this.isStateAffected(stateId);
// ステート解除実行
_Game_Battler_removeState.call(this, stateId);
if (affected) {
if (hzRemoveStateType === "item") {
// アイテム・スキルによる解除(ステート解除メッセージのみ表示)
var nextState = $dataStates[stateId].meta.hzExState_item;
if (nextState !== undefined) {
var nextStateId = Number(nextState);
// 次のステートを付与
this.addState(nextStateId);
// ステート付与のメッセージを削除
this._result.addedStates = this._result.addedStates.filter(function (
elm
) {
return elm !== nextStateId;
});
}
} else if (hzRemoveStateType === "auto") {
// ターン数/歩数/ダメージで自動解除(ステート付与メッセージのみ表示)
var nextState = $dataStates[stateId].meta.hzExState_auto;
if (nextState !== undefined) {
// ステート解除のメッセージを削除
this._result.removedStates = this._result.removedStates.filter(
function (elm) {
return elm !== stateId;
}
);
var nextStateId = Number(nextState);
// 次のステートを付与
this.addState(nextStateId);
}
}
}
};
// ステート初期化処理(Game_BattlerBase)
var _Game_BattlerBase_clearStates = Game_BattlerBase.prototype.clearStates;
Game_BattlerBase.prototype.clearStates = function () {
if (hzRemoveStateType !== "recoverAll" && hzRemoveStateType !== "die") {
_Game_BattlerBase_clearStates.call(this);
} else {
// 全回復・戦闘不能時に、<hzExState_remain>が指定されたステートを解除しない。
this._states = this._states.filter(function (id) {
return $dataStates[id].meta.hzExState_remain;
});
var tmpStateTurns = {};
for (var i = 0; i < this._states.length; i++) {
tmpStateTurns[this._states[i]] = this._stateTurns[this._states[i]];
}
this._stateTurns = tmpStateTurns;
}
};
// ステート初期化処理(Game_Actor)
var _Game_Actor_clearStates = Game_Actor.prototype.clearStates;
Game_Actor.prototype.clearStates = function () {
Game_Battler.prototype.clearStates.call(this);
if (hzRemoveStateType !== "recoverAll") {
this._stateSteps = {};
} else {
// 全回復・戦闘不能時に、<hzExState_remain>が指定されたステートを解除しない。(解除までの歩数も引き継ぐ)
var tmpStateSteps = {};
for (var i = 0; i < this._states.length; i++) {
tmpStateSteps[this._states[i]] = this._stateSteps[this._states[i]];
}
this._stateSteps = tmpStateSteps;
}
};
// アイテム・スキルによるステート解除
var _Game_Action_itemEffectRemoveState =
Game_Action.prototype.itemEffectRemoveState;
Game_Action.prototype.itemEffectRemoveState = function (target, effect) {
// ステート解除タイプ:アイテム(スキル)
hzRemoveStateType = "item";
// 処理実行
_Game_Action_itemEffectRemoveState.call(this, target, effect);
// ステート解除タイプ初期化
hzRemoveStateType = "";
};
// ターン数によるステートの自動解除
var _Game_Battler_removeStatesAuto = Game_Battler.prototype.removeStatesAuto;
Game_Battler.prototype.removeStatesAuto = function (timing) {
// ステート解除タイプ:自動解除
hzRemoveStateType = "auto";
// 処理実行
_Game_Battler_removeStatesAuto.call(this, timing);
// ステート解除タイプ初期化
hzRemoveStateType = "";
};
// ダメージによるステートの自動解除
var _Game_Battler_removeStatesByDamage =
Game_Battler.prototype.removeStatesByDamage;
Game_Battler.prototype.removeStatesByDamage = function () {
// ステート解除タイプ:自動解除
hzRemoveStateType = "auto";
// 処理実行
_Game_Battler_removeStatesByDamage.call(this);
// ステート解除タイプ初期化
hzRemoveStateType = "";
};
// 歩数によるステートの更新
var _Game_Actor_updateStateSteps = Game_Actor.prototype.updateStateSteps;
Game_Actor.prototype.updateStateSteps = function (state) {
// ステート解除タイプ:自動解除
hzRemoveStateType = "auto";
// 処理実行
_Game_Actor_updateStateSteps.call(this, state);
// ステート解除タイプ初期化
hzRemoveStateType = "";
};
// 全回復
var _Game_Interpreter_command314 = Game_Interpreter.prototype.command314;
Game_Interpreter.prototype.command314 = function () {
// ステート解除タイプ:全回復
hzRemoveStateType = "recoverAll";
// 処理実行
var result = _Game_Interpreter_command314.call(this);
// ステート解除タイプ初期化
hzRemoveStateType = "";
return result;
};
// 敵キャラの全回復
var _Game_Interpreter_command334 = Game_Interpreter.prototype.command334;
Game_Interpreter.prototype.command334 = function () {
// ステート解除タイプ:全回復
hzRemoveStateType = "recoverAll";
// 処理実行
var result = _Game_Interpreter_command334.call(this);
// ステート解除タイプ初期化
hzRemoveStateType = "";
return result;
};
// 戦闘不能
var _Game_BattlerBase_die = Game_BattlerBase.prototype.die;
Game_BattlerBase.prototype.die = function () {
// ステート解除タイプ:戦闘不能
hzRemoveStateType = "die";
// 処理実行
_Game_BattlerBase_die.call(this);
// ステート解除タイプ初期化
hzRemoveStateType = "";
};
// アイテム・スキル使用可否判定
var _Game_Action_testItemEffect = Game_Action.prototype.testItemEffect;
Game_Action.prototype.testItemEffect = function (target, effect) {
// スタックステートの場合、既にステート付与済みでもステートの追加ができるように
if (effect.code === Game_Action.EFFECT_ADD_STATE) {
if (!target.isStateAffected(effect.dataId)) return true;
if ($dataStates[effect.dataId].meta.hzExState_stack !== undefined) {
var stackParms =
$dataStates[effect.dataId].meta.hzExState_stack.split(",");
return effect.dataId === Number(stackParms[0]);
}
}
return _Game_Action_testItemEffect.call(this, target, effect);
};
})();