//============================================================================ // Mano_StateWindowOnBattle.js // --------------------------------------------------------------------------- // Copyright (c) Sigureya // This software is released under the MIT License. // http://opensource.org/licenses/mit-license.php // --------------------------------------------------------------------------- // [Twitter]: https://twitter.com/Sigureya/ //============================================================================ /*: * @plugindesc 戦闘中にステート一覧を画面へ表示します。 * * * @author しぐれん(https://github.com/Sigureya/RPGmakerMV) * * @param width * @desc ウィンドウの幅です。 * @type number * @default 240 * * @param rows * @desc 縦方向の要素数です。 * @type number * @default 8 * * @param commandName * @desc 戦闘時のコマンド名です * @type string * @default ステート詳細 * * @param showTurn * @desc 残りターン数の表示です。 * アイコンの右下に表示されます。 * @type boolean * @default true * * @help * 表示の切り替えはパーティコマンドから行います。 * 任意タイミングで表示もできるんですが、制御が少し面倒なので分かる人が自力でやってください。 * (直前にフォーカスされていたウィンドウがわからないため) * Scene_Battle._windowBattleState_MAにwindowが入っているので、begin()で初期化してあげてください。 * 必要であれば、activate()もしてください。 */ (function () { "use strict"; const setting = (function () { const param = PluginManager.parameters("Mano_StateWindowOnBattle"); const result = { commandName: String(param.commandName), width: Number(param.width) || 300, rows: Number(param.rows) || 10, showTurn: param.showTurn === "true", positionMode: "right", /** * @type {Numebr} 0(open/close) * 1(show/hide) * 2(activate/deactivate) * */ activateMode: 2, }; return result; })(); class Window_BattleState extends Window_Selectable { static positionXatRight() { return Graphics.boxWidth - setting.width; } begin() { if (this._helpWindow) { this._helpWindow.show(); } this.activate(); switch (setting.activateMode) { case 0: this.open(); break; case 1: this.show(); break; case 2: this.select(0); break; } } end() { this.deactivate(); this.deselect(); if (this._helpWindow) { this._helpWindow.hide(); } switch (setting.activateMode) { case 0: this.close(); break; case 1: this.hide(); break; case 2: this.deselect(); break; } } static positionX() { if (setting.positionMode === "right") { return Window_BattleState.positionXatRight(); } return 0; } /** * * @param {Number} x * @param {Number} y */ constructor(x, y, w, h) { super(x, y, w, h); this.setBattler(null); } initialize(x, y, w, h) { this._list = []; // const heigth =this.fittingHeight(setting.rows) ; // const width = setting.width; super.initialize(x, y, w, h); this.end(); } updateBattler() { this.makeItemList(); this.refresh(); } /** * @param {Game_Battler} battler */ setBattler(battler) { this._battler = battler; if (battler) { this._unit = battler.friendsUnit(); } else { this._unit = null; } this.updateBattler(); } isVisibleState(state) { return true; } makeItemList() { const list = this._battler ? this._battler.states() : []; this._list = list.filter(function (state) { return this.isVisibleState(state); }, this); } /** * @return {RPG.State} * @param {Number} index */ state(index) { return this._list[index]; } maxItems() { return this._list.length; } drawItem(index) { const state = this.state(index); if (state) { const turnWidth = this.turnWidth(); const rect = this.itemRectForText(index); const nameWidth = rect.width - turnWidth; this.drawItemName(state, rect.x, rect.y, nameWidth); if (setting.showTurn) { this.drawStateTurn(state, rect.x + nameWidth + 4, rect.y, turnWidth); } } } /** * @return {String} * @param {Number} index */ itemDescription(index) { const state = this.state(index); if (state) { const desc = state.meta["説明"]; if (desc) { return desc; } } return ""; } updateHelp() { this._helpWindow.setText(this.itemDescription(this._index)); } turnWidth() { return 10; } /** * @param {RPG.State} state * @param {Number} x * @param {Number} y * @param {Number} width */ drawStateTurn(state, x, y, width) { const turn = this._battler._stateTurns[state.id]; if (turn) { this.drawText(turn, x, y, width, "right"); } } } Window_PartyCommand.prototype.addStateCommand = function () { this.addCommand(setting.commandName, "stateMA"); }; const Window_PartyCommand_makeCommandList = Window_PartyCommand.prototype.makeCommandList; Window_PartyCommand.prototype.makeCommandList = function () { Window_PartyCommand_makeCommandList.call(this); this.addStateCommand(); }; const Scene_Battle_createPartyCommandWindow = Scene_Battle.prototype.createPartyCommandWindow; Scene_Battle.prototype.createPartyCommandWindow = function () { Scene_Battle_createPartyCommandWindow.call(this); this._partyCommandWindow.setHandler( "stateMA", this.activateStateWindow.bind(this) ); }; Scene_Battle.prototype.activateStateWindow = function () { this._windowBattleState_MA.begin(); }; Scene_Battle.prototype.onBattleStateCancel = function () { this._windowBattleState_MA.end(); }; const Scene_Battle_createHelpWindow = Scene_Battle.prototype.createHelpWindow; Scene_Battle.prototype.createHelpWindow = function () { Scene_Battle_createHelpWindow.call(this); this.createStateWindow(); }; const Scene_Battle_isAnyInputWindowActive = Scene_Battle.prototype.isAnyInputWindowActive; Scene_Battle.prototype.isAnyInputWindowActive = function () { if (this._windowBattleState_MA.active) { return true; } return Scene_Battle_isAnyInputWindowActive.call(this); }; Scene_Battle.prototype.onStateWindowCancel = function () { this._windowBattleState_MA.end(); this._partyCommandWindow.activate(); }; Scene_Battle.prototype.createStateWindow = function () { var wy = this._helpWindow.y + this._helpWindow.height; var wh = this._statusWindow.y - wy; const width = setting.width; const x = Window_BattleState.positionX(); const window = new Window_BattleState(x, wy, width, wh); window.setBattler($gameParty.members()[0]); window.setHelpWindow(this._helpWindow); window.setHandler("cancel", this.onStateWindowCancel.bind(this)); this._windowBattleState_MA = window; this.addWindow(window); }; // const Scene_Battle_selectNextCommand =Scene_Battle.prototype.selectNextCommand; // Scene_Battle.prototype.selectNextCommand = function(){ // Scene_Battle_selectNextCommand.call(this); // this._windowBattleState_MA.hide(); // }; const Scene_Battle_refreshStatus = Scene_Battle.prototype.refreshStatus; Scene_Battle.prototype.refreshStatus = function () { Scene_Battle_refreshStatus.call(this); this._windowBattleState_MA.updateBattler(); }; })();