/*: * @target MZ * @plugindesc v1.1 スキル使用条件拡張 ‑ 変数+プレイヤーステート │ SkillVariableCondition.js * @author IvI * * @help * ■更新点 v1.1 * ① … プレイヤー側の誰かが 指定ステートを有 していると使用可 * ② … プレイヤー側の誰かが 指定ステートを有 していると使用不可 * * ※いずれもカンマ区切りで複数指定可。空白は無視されます。 * ※敵スキル向けに想定していますが、アクター側スキルにも同様に効きます。 * * ■既存機能 * … $gameVariables 等を用いた自由判定 * * 例)変数11 が 'ND' または 'NDH' 以外のときのみ * * * ■プラグインコマンド * なし * * ■利用規約 * MIT ライセンス * -------------------------------------------------------- */ (() => { "use strict"; // ---------- 定数 ---------- const META_VAR_COND = //i; const META_REQ_P_STATE = //i; const META_FORBID_P_STATE = //i; // ---------- DBロード時にメタタグ解析 ---------- const _DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded; DataManager.isDatabaseLoaded = function() { if (!_DataManager_isDatabaseLoaded.call(this)) return false; if (!this._skillVarCond_initialized) { this._skillVarCond_initialized = true; parseSkillConditions($dataSkills); } return true; }; /** @param {RPG.DataSkill[]} arr */ function parseSkillConditions(arr) { arr.forEach(skill => { if (!skill || !skill.note) return; const note = skill.note; // 1) 任意の JS 式 const varMatch = note.match(META_VAR_COND); if (varMatch) skill._varConditionFormula = varMatch[1].trim(); // 2) 必須プレイヤーステート const reqMatch = note.match(META_REQ_P_STATE); if (reqMatch) { skill._requirePlayerStates = reqMatch[1] .split(",") .map(s => Number(s.trim())) .filter(n => n); } // 3) 禁止プレイヤーステート const forbidMatch = note.match(META_FORBID_P_STATE); if (forbidMatch) { skill._forbidPlayerStates = forbidMatch[1] .split(",") .map(s => Number(s.trim())) .filter(n => n); } }); } // ---------- 追加判定 ---------- const _Game_BattlerBase_meetsSkillConditions = Game_BattlerBase.prototype.meetsSkillConditions; Game_BattlerBase.prototype.meetsSkillConditions = function(skill) { // 標準判定 if (!_Game_BattlerBase_meetsSkillConditions.call(this, skill)) { return false; } // ① 任意の JS 式 if (skill._varConditionFormula) { try { /* eslint-disable no-eval */ if (!eval(skill._varConditionFormula)) return false; /* eslint-enable no-eval */ } catch (e) { console.error( "SkillVariableCondition: 式評価エラー", `スキルID:${skill.id} 式:${skill._varConditionFormula}`, e ); return false; } } // ② プレイヤー必須ステート if (skill._requirePlayerStates?.length) { const ok = skill._requirePlayerStates.some(stateId => $gameParty.aliveMembers().some(m => m.isStateAffected(stateId)) ); if (!ok) return false; } // ③ プレイヤー禁止ステート if (skill._forbidPlayerStates?.length) { const ng = skill._forbidPlayerStates.some(stateId => $gameParty.aliveMembers().some(m => m.isStateAffected(stateId)) ); if (ng) return false; } return true; }; })();