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

294 lines
8.2 KiB
JavaScript

//============================================================================
// 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();
};
})();