brainwashing-school/js/plugins/TorigoyaMZ_AddStateSkill.js
2025-05-30 08:36:40 -05:00

177 lines
6.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*---------------------------------------------------------------------------*
* TorigoyaMZ_AddStateSkill.js v.1.1.3
*---------------------------------------------------------------------------*
* 2022/01/13 01:21 (JST)
*---------------------------------------------------------------------------*
* Ruたん ( @ru_shalm )
* https://torigoya-plugin.rutan.dev
*---------------------------------------------------------------------------*/
/*:
* @target MZ
* @plugindesc 使用後にステート追加スキルプラグイン (v.1.1.3)
* @author Ruたんru_shalm
* @license public domain
* @version 1.1.3
* @url https://raw.githubusercontent.com/rutan/torigoya-rpg-maker-plugin/gh-pages/TorigoyaMZ_AddStateSkill.js
* @help
* 使用後にステート追加スキルプラグイン (v.1.1.3)
* https://torigoya-plugin.rutan.dev
*
* スキル使用時に使用者にステートを追加/削除できるようにします。
* 「相手に大ダメージを与えるが、自分は毒になる」のようなスキルが作れます。
*
* ------------------------------------------------------------
* ■ 設定方法
* ------------------------------------------------------------
* スキルのメモ欄に以下のように記述してください。
*
* ■ 例1使用者に10番のステートを付与する
*
* <AddState: 10>
*
* または
*
* <ステート追加: 10>
*
* ■ 例2使用者に10番と11番のステートを付与する「,」区切りで指定)
*
* <AddState: 10, 11>
*
* または
*
* <ステート追加: 10, 11>
*
* ■ 例3使用者に10番のステートを削除する
*
* <RemoveState: 10>
*
* または
*
* <ステート削除: 10>
*
* ■ 例4使用者のパーティ全員に10番のステートを付与する
*
* <AddStateUnit: 10>
*
* または
*
* <ステート追加全体: 10>
*/
(function () {
'use strict';
const Torigoya = (window.Torigoya = window.Torigoya || {});
function getPluginName() {
const cs = document.currentScript;
return cs ? cs.src.split('/').pop().replace(/\.js$/, '') : 'TorigoyaMZ_AddStateSkill';
}
function readParameter() {
PluginManager.parameters(getPluginName());
return {
version: '1.1.3',
};
}
function readStateIdsFromMeta(str) {
if (!str) return [];
return str
.split(/\s*,\s*/)
.filter(Boolean)
.map((s) => parseInt(s, 10));
}
function applyPlugin() {
const upstream_BattleManager_initMembers = BattleManager.initMembers;
BattleManager.initMembers = function () {
upstream_BattleManager_initMembers.apply(this);
this._torigoyaAddStateSkill_lastAction = null;
};
const upstream_BattleManager_startAction = BattleManager.startAction;
BattleManager.startAction = function () {
upstream_BattleManager_startAction.apply(this);
// 行動不能などで startAction を通っていない行動に対しても
// endAction で処理してしまうのを防ぐため、
// 確実に startAction が実行されたときの行動を保存しておく
this._torigoyaAddStateSkill_lastAction = this._action;
};
const upstream_BattleManager_endAction = BattleManager.endAction;
BattleManager.endAction = function () {
this.torigoyaAddStateSkill_check();
upstream_BattleManager_endAction.apply(this);
};
BattleManager.torigoyaAddStateSkill_check = function () {
const action = this._torigoyaAddStateSkill_lastAction;
if (!action) return;
this._torigoyaAddStateSkill_lastAction = null;
const actionSubject = action.subject();
if (this._subject !== actionSubject) return;
const item = this._action.item();
if (!item) return;
const forSubject = this.torigoyaAddStateSkill_readParameterForSubject(item);
const forUnit = this.torigoyaAddStateSkill_readParameterForUnit(item);
if (!forSubject && !forUnit) return;
const friends = this._subject.isEnemy() ? $gameTroop.members() : $gameParty.battleMembers();
const targets = new Set();
if (forSubject) {
const [addStates, removeStates] = forSubject;
addStates.forEach((id) => this._subject.addState(id));
removeStates.forEach((id) => this._subject.removeState(id));
targets.add(this._subject);
}
if (forUnit) {
const [addStates, removeStates] = forUnit;
friends.forEach((battler) => {
if (battler.isDead()) return;
addStates.forEach((id) => battler.addState(id));
removeStates.forEach((id) => battler.removeState(id));
targets.add(battler);
});
}
friends.forEach((battler) => {
if (!targets.has(battler)) return;
this._logWindow.displayAffectedStatus(battler);
if (battler.isDead()) battler.performCollapse();
});
};
BattleManager.torigoyaAddStateSkill_readParameterForSubject = function (item) {
const addStates = readStateIdsFromMeta(item.meta['AddState'] || item.meta['ステート追加']);
const removeStates = readStateIdsFromMeta(item.meta['RemoveState'] || item.meta['ステート削除']);
if (addStates.length === 0 && removeStates.length === 0) return false;
return [addStates, removeStates];
};
BattleManager.torigoyaAddStateSkill_readParameterForUnit = function (item) {
const addStates = readStateIdsFromMeta(item.meta['AddStateUnit'] || item.meta['ステート追加全体']);
const removeStates = readStateIdsFromMeta(item.meta['RemoveStateUnit'] || item.meta['ステート削除全体']);
if (addStates.length === 0 && removeStates.length === 0) return false;
return [addStates, removeStates];
};
}
Torigoya.AddStateSkill = {
name: getPluginName(),
parameter: readParameter(),
};
applyPlugin();
})();