56 lines
2.3 KiB
JavaScript
56 lines
2.3 KiB
JavaScript
/*:
|
||
* @target MZ
|
||
* @plugindesc [MZ] ステート43〜49を付与中はアイテムを選択不可(非表示にはしない)
|
||
* @author you
|
||
* @help
|
||
* 概要:
|
||
* - アクターがステートID 43〜49のいずれかを付与中のとき、
|
||
* アイテムは一覧に表示されたままグレーアウトして選択不可になります。
|
||
* - メニュー画面、戦闘画面の両方で有効です。
|
||
*
|
||
* 備考:
|
||
* - 既存の使用可否判定(MP/TP不足、メモ欄の制限、装備不可など)も尊重し、
|
||
* それらで「不可」の場合は本プラグイン以前に不可になります。
|
||
* - 「非表示」にはしません(includes判定は変更しません)。
|
||
* - 対象は「使用者となるアクター」です(パーティ内の誰かではなく、現在の選択アクター基準)。
|
||
*/
|
||
|
||
(() => {
|
||
// 対象ステート範囲(固定仕様:43〜49)
|
||
const STATE_MIN = 43;
|
||
const STATE_MAX = 49;
|
||
|
||
// 現在の“使用者”アクターを取り出すユーティリティ
|
||
function currentUserActor() {
|
||
// メニュー中は menuActor、戦闘中は BattleManager.actor()
|
||
// どちらも無ければ null
|
||
return $gameParty.menuActor?.() || (typeof BattleManager !== "undefined" ? BattleManager.actor() : null) || null;
|
||
}
|
||
|
||
// 指定範囲のいずれかのステートを付与されているか
|
||
function isAffectedInRange(actor) {
|
||
if (!actor) return false;
|
||
for (let id = STATE_MIN; id <= STATE_MAX; id++) {
|
||
if (actor.isStateAffected(id)) return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// --- メニュー/戦闘のアイテムリストの有効判定を拡張 ---
|
||
const _Window_ItemList_isEnabled = Window_ItemList.prototype.isEnabled;
|
||
Window_ItemList.prototype.isEnabled = function(item) {
|
||
// まずは元のロジックで使用可能か
|
||
const base = _Window_ItemList_isEnabled.call(this, item);
|
||
if (!base) return false;
|
||
|
||
// 現在の使用者アクターを取得し、ステート43〜49なら不可
|
||
const actor = currentUserActor();
|
||
if (actor && isAffectedInRange(actor)) {
|
||
return false;
|
||
}
|
||
return true;
|
||
};
|
||
|
||
// 参考:非表示化はしないため includes は触りません
|
||
// Window_ItemList.prototype.includes = ... はデフォルトのまま
|
||
})();
|