pure-full-lily/js/plugins/LL_MenuScreenStatus.js
2025-09-16 10:12:44 -05:00

383 lines
13 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//=============================================================================
// RPGツクールMZ - LL_MenuScreenStatus.js v1.0.2
//-----------------------------------------------------------------------------
// ルルの教会 (Lulu's Church)
// https://nine-yusha.com/
//
// URL below for license details.
// https://nine-yusha.com/plugin/
//=============================================================================
/*:
* @target MZ
* @plugindesc ステータス画面に立ち絵を表示します。
* @author ルルの教会
* @url https://nine-yusha.com/plugin-menuscreen/
* @base LL_MenuScreenBase
* @orderAfter LL_MenuScreenBase
*
* @help LL_MenuScreenStatus.js
*
* ステータス画面に立ち絵を表示します。
* ※表示する立ち絵リストは「LL_MenuScreenBase」で設定してください。
*
* 立ち絵を優先して見せたい場合は、下記の通り設定してください。
* X座標基点・Y座標基点: 右側寄りに設定
* 不透明度: 255
* 経験値情報の表示: 次のレベルのみ
* 装備品リストの表示: false
* 区切り線の表示: false
*
* プラグインコマンドはありません。
*
* 利用規約:
* ・著作権表記は必要ございません。
* ・利用するにあたり報告の必要は特にございません。
* ・商用・非商用問いません。
* ・R18作品にも使用制限はありません。
* ・ゲームに合わせて自由に改変していただいて問題ございません。
* ・プラグイン素材としての再配布(改変後含む)は禁止させていただきます。
*
* 作者: ルルの教会
* 作成日: 2020/11/08
*
* @param pictureSettings
* @text 立ち絵表示の設定
* @desc ※この項目は使用しません
*
* @param statusWindowPictureX
* @text X座標始点
* @desc ステータス画面に表示する立ち絵の表示位置(X)です。
* @default 0
* @min -2000
* @max 2000
* @type number
* @parent pictureSettings
*
* @param statusWindowPictureY
* @text Y座標始点
* @desc ステータス画面に表示する立ち絵の表示位置(Y)です。
* @default 0
* @min -2000
* @max 2000
* @type number
* @parent pictureSettings
*
* @param statusWindowPictureOpacity
* @text 不透明度
* @desc 立ち絵の不透明度(0255)です。 (初期値: 160)
* @type number
* @default 160
* @min 0
* @max 255
* @parent pictureSettings
*
* @param windowSettings
* @text ウィンドウの設定
* @desc ※この項目は使用しません
*
* @param showActorFace
* @text 顔グラフィックの表示
* @desc 顔グラフィックを表示します。
* @default true
* @type boolean
* @parent windowSettings
*
* @param showExpInfos
* @text 経験値情報の表示
* @desc 経験値情報の表示方法を選択します。
* @default all
* @type select
* @option 全て表示
* @value all
* @option 次のレベルのみ
* @value nextLevel
* @option 表示しない
* @value off
* @parent windowSettings
*
* @param showEquipLists
* @text 装備品リストの表示
* @desc 装備品のリストを表示します。
* @default true
* @type boolean
* @parent windowSettings
*
* @param showLines
* @text 区切り線の表示
* @desc ウィンドウ内の区切り線を表示します。
* @default true
* @type boolean
* @parent windowSettings
*/
(() => {
"use strict";
const pluginName = "LL_MenuScreenStatus";
const parameters = PluginManager.parameters(pluginName);
const statusWindowPictureX = Number(parameters["statusWindowPictureX"] || 0);
const statusWindowPictureY = Number(parameters["statusWindowPictureY"] || 0);
const statusWindowPictureOpacity = Number(parameters["statusWindowPictureOpacity"] || 160);
const showActorFace = eval(parameters["showActorFace"] || "true");
const showExpInfos = String(parameters["showExpInfos"] || "all");
const showEquipLists = eval(parameters["showEquipLists"] || "true");
const showLines = eval(parameters["showLines"] || "true");
Scene_Status.prototype.create = function() {
Scene_MenuBase.prototype.create.call(this);
// ステータス画面に立ち絵を表示する場合、独自Windowに差し替え
this.createStatusWithPictureWindow();
};
Scene_Status.prototype.refreshActor = function() {
const actor = this.actor();
this._statusWithPictureWindow.setActor(actor);
};
Scene_Status.prototype.onActorChange = function() {
Scene_MenuBase.prototype.onActorChange.call(this);
this.refreshActor();
this._statusWithPictureWindow.activate();
};
Scene_Status.prototype.createStatusWithPictureWindow = function() {
const rect = this.statusWithPictureWindowRect();
this._statusWithPictureWindow = new Window_StatusWithPicture(rect);
this._statusWithPictureWindow.setHandler("cancel", this.popScene.bind(this));
this._statusWithPictureWindow.setHandler("pagedown", this.nextActor.bind(this));
this._statusWithPictureWindow.setHandler("pageup", this.previousActor.bind(this));
this.addWindow(this._statusWithPictureWindow);
};
Scene_Status.prototype.statusWithPictureWindowRect = function() {
const wx = 0;
const wy = this.mainAreaTop();
const ww = Graphics.boxWidth;
const wh = Graphics.boxHeight - wy;
return new Rectangle(wx, wy, ww, wh);
};
//-----------------------------------------------------------------------------
// Window_StatusWithPicture
//
// The window for displaying full status on the status screen.
function Window_StatusWithPicture() {
this.initialize(...arguments);
}
Window_StatusWithPicture.prototype = Object.create(Window_StatusBase.prototype);
Window_StatusWithPicture.prototype.constructor = Window_StatusWithPicture;
Window_StatusWithPicture.prototype.initialize = function(rect) {
Window_StatusBase.prototype.initialize.call(this, rect);
this._actor = null;
this._backStandingPicture = null;
this.refresh();
this.activate();
};
Window_StatusWithPicture.prototype.setActor = function(actor) {
if (this._actor !== actor) {
this._actor = actor;
this.refresh();
}
};
Window_StatusWithPicture.prototype.refresh = function() {
Window_StatusBase.prototype.refresh.call(this);
if (this._actor) {
const lineHeight = this.lineHeight();
this.drawPicture();
this.drawBlock1();
this.drawBlock2();
this.drawHorzLine(lineHeight * 5.25);
this.drawBlock3(lineHeight * 6);
this.drawHorzLine(lineHeight * 11.75);
this.drawBlock4(lineHeight * 12.5);
}
};
Window_StatusWithPicture.prototype.drawBlock1 = function() {
const y = this.block1Y();
this.drawActorName(this._actor, 6, y, 168);
this.drawActorClass(this._actor, 192, y, 168);
this.drawActorNickname(this._actor, 432, y, 270);
};
Window_StatusWithPicture.prototype.block1Y = function() {
return 0;
};
Window_StatusWithPicture.prototype.drawBlock2 = function() {
const y = this.block2Y();
if (showActorFace) this.drawActorFace(this._actor, 12, y);
this.drawBasicInfo(showActorFace ? 204 : 12, y);
this.drawExpInfo(456, y);
};
Window_StatusWithPicture.prototype.block2Y = function() {
const lineHeight = this.lineHeight();
const min = lineHeight;
const max = this.innerHeight - lineHeight * 4;
return Math.floor((lineHeight * 1.4).clamp(min, max));
};
Window_StatusWithPicture.prototype.drawBlock3 = function(y) {
this.drawParameters(12, y);
this.drawEquipments(312, y);
};
Window_StatusWithPicture.prototype.drawBlock4 = function(y) {
this.drawProfile(12, y);
};
Window_StatusWithPicture.prototype.drawBasicInfo = function(x, y) {
const lineHeight = this.lineHeight();
this.drawActorLevel(this._actor, x, y + lineHeight * 0);
this.drawActorIcons(this._actor, x, y + lineHeight * 1);
this.placeBasicGauges(this._actor, x, y + lineHeight * 2);
};
Window_StatusWithPicture.prototype.drawExpInfo = function(x, y) {
const lineHeight = this.lineHeight();
const expTotal = TextManager.expTotal.format(TextManager.exp);
const expNext = TextManager.expNext.format(TextManager.level);
// 設定により、表示情報を切り替え
switch (showExpInfos) {
case "off":
return;
case "nextLevel":
this.changeTextColor(ColorManager.systemColor());
this.drawText(expNext, x, y + lineHeight * 0, 270);
this.resetTextColor();
this.drawText(this.expNextValue(), x, y + lineHeight * 1, 270, "right");
break;
default:
this.changeTextColor(ColorManager.systemColor());
this.drawText(expTotal, x, y + lineHeight * 0, 270);
this.drawText(expNext, x, y + lineHeight * 2, 270);
this.resetTextColor();
this.drawText(this.expTotalValue(), x, y + lineHeight * 1, 270, "right");
this.drawText(this.expNextValue(), x, y + lineHeight * 3, 270, "right");
}
};
Window_StatusWithPicture.prototype.expTotalValue = function() {
if (this._actor.isMaxLevel()) {
return "-------";
} else {
return this._actor.currentExp();
}
};
Window_StatusWithPicture.prototype.expNextValue = function() {
if (this._actor.isMaxLevel()) {
return "-------";
} else {
return this._actor.nextRequiredExp();
}
};
Window_StatusWithPicture.prototype.drawItem = function(index) {
const rect = this.itemLineRect(index);
const paramId = index + 2;
const name = TextManager.param(paramId);
const value = this._actor.param(paramId);
this.changeTextColor(ColorManager.systemColor());
this.drawText(name, rect.x, rect.y, 160);
this.resetTextColor();
this.drawText(value, rect.x + 160, rect.y, 60, "right");
};
Window_StatusWithPicture.prototype.drawParameters = function(x, y) {
var lineHeight = this.lineHeight();
for (var i = 0; i < 6; i++) {
var paramId = i + 2;
var y2 = y + lineHeight * i;
this.changeTextColor(this.systemColor());
this.drawText(TextManager.param(paramId), x, y2, 160);
this.resetTextColor();
this.drawText(this._actor.param(paramId), x + 160, y2, 60, "right");
}
};
Window_StatusWithPicture.prototype.drawEquipments = function(x, y) {
var equips = this._actor.equips();
var count = Math.min(equips.length, this.maxEquipmentLines());
for (var i = 0; i < count; i++) {
this.changeTextColor(this.systemColor());
this.drawText(this.actorSlotName(this._actor, i), x, y + this.lineHeight() * i, 160);
this.resetTextColor();
this.drawItemName(equips[i], x + 160, y + this.lineHeight() * i);
}
};
Window_StatusWithPicture.prototype.maxEquipmentLines = function() {
return showEquipLists ? 6 : 0;
};
Window_StatusWithPicture.prototype.drawHorzLine = function(y) {
if (!showLines) return;
var lineY = y + this.lineHeight() / 2 - 1;
this.contents.paintOpacity = 48;
this.contents.fillRect(0, lineY, this.contentsWidth(), 2, this.lineColor());
this.contents.paintOpacity = 255;
};
Window_StatusWithPicture.prototype.lineColor = function() {
return ColorManager.normalColor();
};
Window_StatusWithPicture.prototype.drawProfile = function(x, y) {
this.drawTextEx(this._actor.profile(), x, y);
};
Window_StatusWithPicture.prototype.drawPicture = function() {
const actor = this._actor;
if (this._backStandingPicture) this._backStandingPicture.bitmap = null;
// 立ち絵描画
let mPicture = ExMenuScreenBase.getImageName(actor._actorId);
if (mPicture) {
const x = statusWindowPictureX + Number(mPicture.x);
const y = statusWindowPictureY + Number(mPicture.y);
const scaleX = Number(mPicture.scaleX) / 100;
const scaleY = Number(mPicture.scaleY) / 100;
// ピンチ判定
if (ExMenuScreenBase.getHpRate(actor._actorId) > Number(mPicture.pinchPercentage) || !mPicture.pinchImageName) {
// 通常
this.drawBackStandingPicture(String(mPicture.imageName), x, y, scaleX, scaleY);
} else {
// ピンチ
this.drawBackStandingPicture(String(mPicture.pinchImageName), x, y, scaleX, scaleY);
}
}
};
Window_StatusWithPicture.prototype.drawBackStandingPicture = function(
imageName, x, y, scaleX, scaleY
) {
const spacing = 8;
this._backStandingPicture = new Sprite();
this._backStandingPicture.bitmap = ImageManager.loadPicture(imageName);
this._backStandingPicture.x = x;
this._backStandingPicture.y = y;
this._backStandingPicture.scale.x = scaleX;
this._backStandingPicture.scale.y = scaleY;
// マスク処理
let mask = new PIXI.Graphics();
const paddingHelfX = (Graphics.width - Graphics.boxWidth - 8) / 2;
const paddingHelfY = (Graphics.height - Graphics.boxHeight - 8) / 2;
mask.beginFill(0xffffff, 1);
mask.drawRect(this.x + 12 + paddingHelfX, this.y + 12 + paddingHelfY, this.width - 16, this.height - 16);
mask.endFill();
this._backStandingPicture.mask = mask;
this._backStandingPicture.opacity = statusWindowPictureOpacity;
this.addChildToBack(this._backStandingPicture);
};
})();