//============================================================================= // SealActorCommand.js // ---------------------------------------------------------------------------- // (C)2017 Triacontane // This software is released under the MIT License. // http://opensource.org/licenses/mit-license.php // ---------------------------------------------------------------------------- // Version // 2.2.0 2022/01/17 特定のスキルタイプのみ非表示にできる機能を追加 // 2.1.0 2021/06/29 特定のスキルタイプのみ使用禁止にできる機能を追加 // 2.0.0 2021/04/14 MZで動作するよう修正し、メモ欄の記法を変更 // 1.4.0 2018/12/22 禁止コマンドの上に文字を被せられる機能を追加 // 1.3.0 2018/12/17 封印したコマンドを非表示ではなく使用禁止にできる機能を追加 // 1.2.0 2017/03/08 アイテム使用をスキルのひとつとして作成できる機能を追加 // 1.1.0 2017/02/23 封印対象にスキルを追加 // 1.0.0 2017/02/22 初版 // ---------------------------------------------------------------------------- // [Blog] : https://triacontane.blogspot.jp/ // [Twitter]: https://twitter.com/triacontane/ // [GitHub] : https://github.com/triacontane/ //============================================================================= /*: * @plugindesc アクターコマンド封印プラグイン * @target MZ * @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/SealActorCommand.js * @base PluginCommonBase * @orderAfter PluginCommonBase * @author トリアコンタン * * @param commandDisable * @text コマンド使用禁止 * @desc 封印したコマンドを非表示ではなく使用禁止にします。 * @default false * @type boolean * * @param disableSign * @text 使用禁止サイン * @desc 使用禁止にしたコマンドのうえに被せる文字列です。(コマンド使用禁止が有効な場合のみ機能します) * @default \c[2]\i[1]禁止\i[1] * * @help アクターコマンド「攻撃」「防御」「アイテム」「スキル」を封印できます。 * 封印されたコマンドはウィンドウから消失します。 * 特定のコマンドが使用できないアクター、職業、装備品、ステートが作成できます。 * さらに、スイッチやJavaScript計算式により、細かい条件が指定できます。 * * 特徴を有するデータベースのメモ欄に以下の通り記入してください。 * * <攻撃封印スイッチ:4> # ID[4]のスイッチがONのとき攻撃を封印 * # 同上 * <防御封印スイッチ:5> # ID[5]のスイッチがONのとき防御を封印 * # 同上 * <道具封印スイッチ:6> # ID[6]のスイッチがONのときアイテムを封印 * # 同上 * <スキル封印スイッチ:7> # ID[7]のスイッチがONのときスキルを封印 * # 同上 * <攻撃封印計算式:f> # 計算式[f]の結果がtrueのとき攻撃を封印 * # 同上 * <防御封印計算式:f> # 計算式[f]の結果がtrueのとき防御を封印 * # 同上 * <道具封印計算式:f> # 計算式[f]の結果がtrueのときアイテムを封印 * # 同上 * <スキル封印計算式:f> # 計算式[f]の結果がtrueのときスキルを封印 * # 同上 * * 特定のスキルタイプのみを封印する場合、以下のタグを指定してください。 * <スキルタイプ1封印スイッチ:8> # スイッチ[8]がONならスキルタイプ[1]を封印 * # 同上 * * スイッチを指定しなかった場合、常に封印されます。 * <攻撃封印スイッチ> * * 文章、スクリプト中で不等号を使いたい場合、以下のように記述してください。 * < → < * > → > * * 例 * # 変数[1]が5以下の場合攻撃封印 * # 常に防御封印 * * 注意! * 全てのコマンドを封印するとゲームが続行不可になります。 * * アイテム使用をスキル化したい場合は、スキルのメモ欄に以下の通り * 入力してください。対象スキルを選択後、アイテムウィンドウが開きます。 * <アイテムスキル> # アイテム使用スキル化 * # 同上 * * このプラグインにはプラグインコマンドはありません。 * * 利用規約: * 作者に無断で改変、再配布が可能で、利用形態(商用、18禁利用等) * についても制限はありません。 * このプラグインはもうあなたのものです。 */ (function() { 'use strict'; const script = document.currentScript; const param = PluginManagerEx.createParameter(script); //============================================================================= // Game_Actor // コマンド封印が有効かどうかを判定します。 //============================================================================= Game_Actor.prototype.getSealMetaInfo = function(names) { let metaValue = null; this.traitObjects().some(function(traitObject) { metaValue = PluginManagerEx.findMetaValue(traitObject, names); return metaValue; }); return metaValue; }; Game_Actor.prototype.isSealCommand = function(commandNames) { const switchId = this.getSealMetaInfo([commandNames[0] + 'SealSwitch', commandNames[1] + '封印スイッチ']); if (switchId && (switchId === true || $gameSwitches.value(switchId))) { return true; } const formula = this.getSealMetaInfo([commandNames[0] + 'SealFormula', commandNames[1] + '封印計算式']); return formula && eval(formula); }; Game_Actor.prototype.isSealCommandAttack = function() { return this.isSealCommand(['Attack', '攻撃']); }; Game_Actor.prototype.isSealCommandGuard = function() { return this.isSealCommand(['Guard', '防御']); }; Game_Actor.prototype.isSealCommandItem = function() { return this.isSealCommand(['Item', '道具']); }; Game_Actor.prototype.isSealCommandSkill = function() { return this.isSealCommand(['Skill', 'スキル']); }; Game_Actor.prototype.isSealCommandSkillType = function(type) { return this.isSealCommand([`SkillType${type}`, `スキルタイプ${type}`]); }; Game_Actor.prototype.findSealSkillTypes = function() { return this.skillTypes().filter(type => this.isSealCommandSkillType(type)); }; //============================================================================= // Window_ActorCommand // コマンドが封印されていた場合、処理を終了します。 //============================================================================= const _Window_ActorCommand_addAttackCommand = Window_ActorCommand.prototype.addAttackCommand; Window_ActorCommand.prototype.addAttackCommand = function() { if (this._actor.isSealCommandAttack()) { if (param.commandDisable) { _Window_ActorCommand_addAttackCommand.apply(this, arguments); this.disableCommand('attack'); } return; } _Window_ActorCommand_addAttackCommand.apply(this, arguments); }; const _Window_ActorCommand_addGuardCommand = Window_ActorCommand.prototype.addGuardCommand; Window_ActorCommand.prototype.addGuardCommand = function() { if (this._actor.isSealCommandGuard()) { if (param.commandDisable) { _Window_ActorCommand_addGuardCommand.apply(this, arguments); this.disableCommand('guard'); } return; } _Window_ActorCommand_addGuardCommand.apply(this, arguments); }; const _Window_ActorCommand_addItemCommand = Window_ActorCommand.prototype.addItemCommand; Window_ActorCommand.prototype.addItemCommand = function() { if (this._actor.isSealCommandItem()) { if (param.commandDisable) { _Window_ActorCommand_addItemCommand.apply(this, arguments); this.disableCommand('item'); } return; } _Window_ActorCommand_addItemCommand.apply(this, arguments); }; const _Window_ActorCommand_addSkillCommands = Window_ActorCommand.prototype.addSkillCommands; Window_ActorCommand.prototype.addSkillCommands = function() { if (this._actor.isSealCommandSkill()) { if (param.commandDisable) { _Window_ActorCommand_addSkillCommands.apply(this, arguments); this.disableCommand('skill'); } return; } _Window_ActorCommand_addSkillCommands.apply(this, arguments); this._actor.findSealSkillTypes().forEach(type => { if (param.commandDisable) { this.disableCommand('skill', type); } else { this.eraseCommand('skill', type); } }); }; Window_ActorCommand.prototype.disableCommand = function(symbol, ext = null) { this._list.forEach(function(command) { if (command.symbol === symbol && (ext === null || ext === command.ext)) { command.enabled = false; } }); }; Window_ActorCommand.prototype.eraseCommand = function(symbol, ext) { const index = this._list.findIndex(command => command.symbol === symbol && ext === command.ext); if (index >= 0) { this._list.splice(index, 1); } }; const _Window_ActorCommand_drawItem = Window_ActorCommand.prototype.drawItem; Window_ActorCommand.prototype.drawItem = function(index) { _Window_ActorCommand_drawItem.apply(this, arguments); const sign = param.disableSign; if (!this.isCommandEnabled(index) && sign) { const rect = this.itemRectWithPadding(index); const width = this.drawTextEx(sign, this.width, 0); const height = this.calcTextHeight({text:sign}, false); this.resetFontSettings(); this.resetTextColor(); this.changePaintOpacity(true); this.drawTextEx(sign, rect.x + rect.width / 2 - width / 2, rect.y + rect.height / 2 - height / 2); this.resetFontSettings(); this.resetTextColor(); this.changePaintOpacity(false); } }; //============================================================================= // Scene_Battle // アイテムスキルを作成します。 //============================================================================= const _Scene_Battle_onItemCancel = Scene_Battle.prototype.onItemCancel; Scene_Battle.prototype.onItemCancel = function() { if (this._selectItemSkill) { this._itemWindow.hide(); this._skillWindow.show(); this._skillWindow.activate(); this._selectItemSkill = false; } else { _Scene_Battle_onItemCancel.apply(this, arguments); } }; const _Scene_Battle_onSkillOk =Scene_Battle.prototype.onSkillOk; Scene_Battle.prototype.onSkillOk = function() { const skill = this._skillWindow.item(); if (PluginManagerEx.findMetaValue(skill, ['アイテムスキル', 'ItemSkill'])) { const action = BattleManager.inputtingAction(); action.setSkill(skill.id); BattleManager.actor().setLastBattleSkill(skill); this._skillWindow.hide(); this.commandItem(); this._selectItemSkill = true; } else { _Scene_Battle_onSkillOk.apply(this, arguments); } }; const _Scene_Battle_onActorCancel = Scene_Battle.prototype.onActorCancel; Scene_Battle.prototype.onActorCancel = function() { if (this._selectItemSkill) { this._actorWindow.hide(); this._itemWindow.show(); this._itemWindow.activate(); } else { _Scene_Battle_onActorCancel.apply(this, arguments); } }; const _Scene_Battle_onEnemyCancel = Scene_Battle.prototype.onEnemyCancel; Scene_Battle.prototype.onEnemyCancel = function() { if (this._selectItemSkill) { this._enemyWindow.hide(); this._itemWindow.show(); this._itemWindow.activate(); } else { _Scene_Battle_onEnemyCancel.apply(this, arguments); } }; const _Scene_Battle_selectNextCommand = Scene_Battle.prototype.selectNextCommand; Scene_Battle.prototype.selectNextCommand = function() { _Scene_Battle_selectNextCommand.apply(this, arguments); this._selectItemSkill = false; }; })();