295 lines
8.1 KiB
JavaScript
295 lines
8.1 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();
|
|
};
|
|
|
|
|
|
})();
|
|
|
|
|