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