sakura-gozen/js/plugins/System_menu/AltMenuScreenKANI.js
2025-02-19 10:16:07 -06:00

805 lines
24 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 Maker MZ - Alternative Menu Screen
//=============================================================================
/*:
* @target MZ
* @plugindesc Alternative menu screen layout.
* @author kaniheadcrab
*
* @help AltMenuScreenKANI.js
*
* This plugin changes the layout of the menu screen.
*/
/*:ja
* @target MZ
* @plugindesc メニュー画面のレイアウトを変更します。
* @author kaniheadcrab
*
* @help AltMenuScreenKANI.js
*
* このプラグインは、AltMenuScreen.jsをベースに
* メニュー画面のレイアウトを変更したプラグインです。
* ステータスの表示・装備、スキルの表示をファストビューで表示されるよう改善します。
*
* プラグインコマンドはありません。
*/
(() => {
let _Scene_Menu_prototype_start = Scene_Menu.prototype.start;
Scene_Menu.prototype.start = function () {
_Scene_Menu_prototype_start.call(this);
//this._statusWindow.refresh(); //↑で実行されている
let actorIndex = 0;
this._mainPurposeWindow.refresh();
this._basicStatusWindow.refresh(actorIndex);
this._detailStatusWindow.refresh(actorIndex);
this._detailEquipWindow.refresh(actorIndex);
this._adultStatusWindow.refresh();
{
let sprite = new Sprite();
//sprite.scale.x = -1;
//sprite.anchor.x = 1;
//sprite.alpha = 0.5;
sprite.bitmap = ImageManager.loadPicture("SystemPic/UI_MENU1");
this.addChildAt(sprite, 1);
}
// {
// let sprite = new Sprite();
// sprite.scale.x = 1;
// sprite.anchor.x = 1;
// sprite.alpha = 0.5;
// sprite.bitmap = ImageManager.loadPicture("SystemPic/UI_MENU1");
// this.addChildAt(sprite, 1);
// }
//FontManager.load("rmmz-mainfont", "f910-shin-comic-2.04");
};
//ステータス関連のウインドウ作成
var _Scene_Menu_prototype_createStatusWindow =
Scene_Menu.prototype.createStatusWindow;
Scene_Menu.prototype.createStatusWindow = function (rect) {
//_Scene_Menu_prototype_createStatusWindow.call(this);
const sw = Graphics.boxWidth - this.mainCommandWidth();
const sh = this.mainAreaHeight();
const sx = this.isRightInputMode() ? 0 : Graphics.boxWidth - sw;
const sy = this.mainAreaTop();
const layoutTbl = {
// 'menuStatus': {'x': sx, 'y': sy, 'w': sw/2, 'h': sh}, //立ち絵ウインドウ
// 'mainPurpose': {'x': sx + sw/2, 'y': sy, 'w': sw/2, 'h': sh/4*1}, //現在目的ウインドウ
// 'basicStatus': {'x': sx + sw/2, 'y': sy + sh/4*1, 'w': sw/2, 'h': sh/4*1}, //基本情報ウインドウ
// 'detailStatus': {'x': sx + sw/2, 'y': sy + sh/4*2, 'w': sw/2, 'h': sh/4*2} //詳細情報ウインドウ
//'detailStatus': {'x': sx, 'y': sy + sh/5*2.09, 'w': sw/2, 'h': sh/5*2.4}, //ステータスウインドウ
menuStatus: { x: sx, y: sy, w: sw / 2, h: sh }, //立ち絵ウインドウ
mainPurpose: { x: sx + sw / 2, y: sy - 45, w: sw / 2, h: sh / 5 }, //現在目的ウインドウ
basicStatus: { x: sx + sw / 2, y: sy + sh / 5, w: sw / 2, h: sh / 5 }, //基本情報ウインドウ
detailStatus: {
x: sx + sw / 2,
y: sy + (sh / 5) * 2.1,
w: sw / 2,
h: sh / 5,
}, //ステータスウインドウ
detailEquip: {
x: sx + sw / 2,
y: sy + (sh / 5) * 3,
w: sw / 2,
h: (sh / 5) * 1.45,
}, //装備ウインドウ
adultStatus: {
x: sx + sw / 2,
y: sy + (sh / 5) * 4.45,
w: sw / 2,
h: (sh / 10) * 1.1,
}, //Adult
};
//立ち絵用ウインドウ(旧ステータスウインドウ)
{
let layout = layoutTbl["menuStatus"];
let rect = new Rectangle(layout.x, layout.y, layout.w, layout.h);
this._statusWindow = new Window_MenuStatus(rect);
//this.addWindow(this._statusWindow);
}
//現在目的ウインドウ
{
let layout = layoutTbl["mainPurpose"];
let rect = new Rectangle(layout.x, layout.y, layout.w, layout.h);
this._mainPurposeWindow = new Window_Menu_MainPurpose(rect);
this.addWindow(this._mainPurposeWindow);
}
//基本情報ウインドウ
{
let layout = layoutTbl["basicStatus"];
let rect = new Rectangle(layout.x, layout.y, layout.w, layout.h);
this._basicStatusWindow = new Window_Menu_BasicStatus(rect);
this.addWindow(this._basicStatusWindow);
}
//詳細情報(ステータス)ウインドウ
{
let layout = layoutTbl["detailEquip"];
let rect = new Rectangle(layout.x, layout.y, layout.w, layout.h);
this._detailEquipWindow = new Window_Menu_DetailEquip(rect);
this.addWindow(this._detailEquipWindow);
}
//詳細情報(装備)ウインドウ
{
let layout = layoutTbl["detailStatus"];
let rect = new Rectangle(layout.x, layout.y, layout.w, layout.h);
this._detailStatusWindow = new Window_Menu_DetailStatus(rect);
this.addWindow(this._detailStatusWindow);
}
//Hst情報ウインドウ
{
let layout = layoutTbl["adultStatus"];
let rect = new Rectangle(layout.x, layout.y, layout.w, layout.h);
this._adultStatusWindow = new Window_Menu_AdultStatus(rect);
this.addWindow(this._adultStatusWindow);
}
};
///-------------------------------------------------
// Window_MenuStatus立ち絵のみ表示に改修
Window_MenuStatus.prototype.maxCols = function () {
return 1;
};
Window_MenuStatus.prototype.numVisibleRows = function () {
return 1;
};
let _Window_MenuStatus_prototype_drawItemImage =
Window_MenuStatus.prototype.drawItemImage;
Window_MenuStatus.prototype.drawItemImage = function (index) {
//立ち絵しか表示しないので何もしない
//_Window_MenuStatus_prototype_drawItemImage.call(this, index);
};
//Window_MenuStatus継承クラスは既存挙動
Window_MenuActor.prototype.drawItemImage = function (index) {
_Window_MenuStatus_prototype_drawItemImage.call(this, index);
};
let _Window_MenuStatus_prototype_drawItemStatus =
Window_MenuStatus.prototype.drawItemStatus;
Window_MenuStatus.prototype.drawItemStatus = function (index) {
//立ち絵しか表示しないので何もしない
//_Window_MenuStatus_prototype_drawItemStatus.call(this, index);
};
//Window_MenuStatus継承クラスは既存挙動
Window_MenuActor.prototype.drawItemStatus = function (index) {
_Window_MenuStatus_prototype_drawItemStatus.call(this, index);
};
//----------------------------------------------------------------------------------------------------
//
// 以下はオリジナルのウインドウ群
//
//----------------------------------------------------------------------------------------------------
// ↓で新規に定義するウインドウの基底クラスactor情報取得メソッド定義したかっただけ
class Window_Menu_SimpleStatus extends Window_StatusBase {
constructor(rect) {
super(rect);
this._isWindow = false;
this._windowskin = null;
this._refreshAllParts();
}
actor(index) {
return $gameParty.members()[index];
}
update() {
super.update();
this._frameSprite.visible = false;
this._contentsBackSprite.visible = false;
}
drawIcon2(iconIndex, x, y, w, h) {
const bitmap = ImageManager.loadSystem("IconSet");
const pw = ImageManager.iconWidth;
const ph = ImageManager.iconHeight;
const sx = (iconIndex % 16) * pw;
const sy = Math.floor(iconIndex / 16) * ph;
this.contents.blt(bitmap, sx, sy, pw, ph, x, y, w, h);
}
resetFontSettings() {
super.resetFontSettings();
this.contents.fontFace = "menufont, " + $gameSystem.mainFontFace();
}
}
///-------------------------------------------------
// 現在の目的
class Window_Menu_MainPurpose extends Window_Menu_SimpleStatus {
constructor(rect) {
super(rect);
}
refresh() {
let varId = 15; //目標テキスト取得に用いる変数番号
if (!$dataPurpose) {
return;
}
const varVal = $gameVariables.value(varId);
let purposeText = "---";
let len = $dataPurpose.length;
for (let i = 0; i < len; i++) {
let data = $dataPurpose[i];
if (!data) {
continue;
}
if (data.val <= varVal) {
purposeText = data.purposeText;
} else {
break;
}
}
const winWidth = this.contentsWidth();
const lineHeight = this.lineHeight();
this.drawTextEx($dataSystemTexts.Altmenu_purpose, 10, 0, winWidth);
this.drawTextEx("\\}" + purposeText, 10, 0 + lineHeight, winWidth);
this.drawMainQuest(10, 0 + lineHeight * 2, winWidth);
}
drawMainQuest = function (x, y, width) {
let scenario = $gameVariables.value(15);
//chapter 1
if (scenario >= 1010 && scenario < 1100) {
let mainQ = [202, 203, 204, 205, 206, 207];
let count = 0;
for (let i = 0; i < mainQ.length; i++) {
if (
$gameVariables.value(mainQ[i]) >= 0 &&
$gameVariables.value(mainQ[i]) < 4
) {
count += 1;
}
}
this.drawTextEx(
$dataSystemTexts.Altmenu_mainQuestCount + count,
x,
y,
width
);
}
//chapter 2
if (scenario >= 2100 && scenario < 2200) {
let mainQ = [221, 222, 223, 225, 226];
let count = 0;
for (let i = 0; i < mainQ.length; i++) {
if (
$gameVariables.value(mainQ[i]) >= 0 &&
$gameVariables.value(mainQ[i]) < 4
) {
count += 1;
}
}
this.drawTextEx(
$dataSystemTexts.Altmenu_mainQuestCount + count,
x,
y,
width
);
}
};
}
///-------------------------------------------------
// 基本情報(キャラチップ・キャラ名・体・気・魂)
class Window_Menu_BasicStatus extends Window_Menu_SimpleStatus {
constructor(rect) {
super(rect);
}
refresh(index) {
const actor = this.actor(index);
const winWidth = this.contentsWidth();
const lineHeight = this.lineHeight();
//アクター画像
var charaPw = 0,
charaPh = 0;
{
//todo: キャラチップあたりの幅高さを取得しているが、仕様上画像サイズ固定ならこの処理不要
//読み込みも入りそうだし固定値に差し替え検討
let characterName = actor.characterName();
const bitmap = ImageManager.loadCharacter(characterName);
const big = ImageManager.isBigCharacter(characterName);
charaPw = bitmap.width / (big ? 3 : 12);
charaPh = bitmap.height / (big ? 4 : 8);
}
this.drawActorCharacter(actor, charaPw / 2, charaPh);
//アクター名・レベル
var bw = (winWidth - charaPw) / 3; //アクター画像を覗いたウインドウ幅/3をブロック幅とする
var sx = charaPw;
this.drawActorName(actor, sx, 0, bw);
this.drawActorLevel(actor, sx, lineHeight, bw);
if (actor.isMaxLevel()) {
this.drawTextEx(
$dataSystemTexts.Altmenu_nextEXP + "---",
sx,
lineHeight * 2,
bw - 4
);
} else {
this.drawTextEx(
$dataSystemTexts.Altmenu_nextEXP +
$gameParty.members()[0].nextRequiredExp(),
sx,
lineHeight * 2,
bw - 4
);
}
this.drawActorClass(actor, sx + bw, 0, bw);
this.placeBasicGauges(actor, sx + bw, lineHeight, bw);
}
}
///-------------------------------------------------
// 詳細情報(現在装備情報)
class Window_Menu_DetailEquip extends Window_Menu_SimpleStatus {
constructor(rect) {
super(rect);
}
refresh(index) {
const actor = this.actor(index);
const winWidth = this.contentsWidth();
const lineHeight = this.lineHeight();
this.drawBackgroundRect(new Rectangle(0, 0, this.width, this.height));
var sx = 10,
sy = 10;
var ssy = -5;
// 装備タイプ・装備名
if ($gameParty._actors == 6) {
//愚譜
[10, 16, 17].forEach((equipType, index) => {
let lineNo = index;
this.drawBackgroundRect(
new Rectangle(sx + (winWidth / 4) * lineNo, sy + 36, 118, 26)
);
this.drawEquipType(equipType, sx + (winWidth / 4) * lineNo, sy + 6);
if (index < 1) {
this.drawEquipParam(
actor,
index,
sx + 34 + (winWidth / 4) * lineNo,
sy,
2
);
} else {
this.drawEquipParam(
actor,
index,
sx + 34 + (winWidth / 4) * lineNo,
sy,
3
);
}
this.drawEquipName(
actor,
index,
sx + (winWidth / 4) * lineNo,
sy + ssy + lineHeight
);
}, this);
return;
}
if ($gameParty._actors == 2) {
//鈴音
[14, 16].forEach((equipType, index) => {
let lineNo = index;
this.drawBackgroundRect(
new Rectangle(sx + (winWidth / 4) * lineNo, sy + 36, 118, 26)
);
this.drawEquipType(equipType, sx + (winWidth / 4) * lineNo, sy + 6);
if (index < 1) {
this.drawEquipParam(
actor,
index,
sx + 34 + (winWidth / 4) * lineNo,
sy,
2
);
} else {
this.drawEquipParam(
actor,
index,
sx + 34 + (winWidth / 4) * lineNo,
sy,
3
);
}
this.drawEquipName(
actor,
index,
sx + (winWidth / 4) * lineNo,
sy + ssy + lineHeight
);
}, this);
return;
} else {
[11, 12, 13, 14, 15, 16, 17, 18].forEach((equipType, index) => {
let lineNo = index;
let lineNo2 = index - 4;
if (index < 4) {
this.drawBackgroundRect(
new Rectangle(sx + (winWidth / 4) * lineNo, sy + 36, 118, 26)
);
this.drawEquipType(equipType, sx + (winWidth / 4) * lineNo, sy + 6);
this.drawEquipParam(
actor,
index,
sx + 34 + (winWidth / 4) * lineNo,
sy,
2
);
this.drawEquipName(
actor,
index,
sx + (winWidth / 4) * lineNo,
sy + ssy + lineHeight
);
} else {
this.drawBackgroundRect(
new Rectangle(sx + (winWidth / 4) * lineNo2, sy + 116, 118, 26)
);
this.drawEquipType(
equipType,
sx + (winWidth / 4) * lineNo2,
sy + 86
);
if (equipType < 16) {
this.drawEquipParam(
actor,
index,
sx + 34 + (winWidth / 4) * lineNo2,
sy + 80,
2
);
} else if (equipType == 16) {
this.drawEquipParam(
actor,
index,
sx + 34 + (winWidth / 4) * lineNo2,
sy + 80,
3
);
}
this.drawEquipName(
actor,
index,
sx + (winWidth / 4) * lineNo2,
sy + ssy + 80 + lineHeight
);
}
}, this);
}
}
//指定したtypeIdxの装備種別名を表示
drawEquipType = function (typeIdx, x, y) {
this.changeTextColor(ColorManager.systemColor());
switch (typeIdx) {
case 10:
this.drawIcon2(100, x, y, 24, 24);
break;
case 11:
this.drawIcon2(96, x, y, 24, 24);
break;
case 12:
this.drawIcon2(97, x, y, 24, 24);
break;
case 13:
this.drawIcon2(98, x, y, 24, 24);
break;
case 14:
this.drawIcon2(99, x, y, 24, 24);
break;
case 15:
this.drawIcon2(100, x, y, 24, 24);
break;
case 16:
this.drawIcon2(128, x, y, 24, 24);
break;
case 17:
this.drawIcon2(129, x, y, 24, 24);
break;
case 18:
this.drawIcon2(129, x, y, 24, 24);
break;
default:
break;
}
//装備部位の項目は非表示に
this.resetTextColor();
};
//指定したactorのindex番目の装備名を表示
drawEquipName = function (actor, index, x, y) {
let equips = actor ? actor.equips() : null;
if (!equips || !equips[index]) {
this.drawText($dataSystemTexts.Altmenu_EquipNON, x, y, 50);
return;
}
const equip = equips[index];
const equipName = equip.name;
this.drawTextExStatus("\\}\\}" + equipName + "\\{\\{", x + 2, y, 80);
};
//指定したactorのindex番目の装備能力値(paramIdx)を表示
drawEquipParam = function (actor, index, x, y, paramIdx) {
let equips = actor ? actor.equips() : null;
//桜以外の特殊処理
if (actor._actorId >= 2) {
if (!equips || !equips[index]) {
this.drawText($dataSystemTexts.Altmenu_EquipNON, x, y, 50);
return;
}
const equip = equips[index];
if (index <= 0) {
this.drawText(
$dataSystemTexts.Altmenu_EquipATK + equip.params[paramIdx],
x,
y,
60
);
} else
this.drawText(
$dataSystemTexts.Altmenu_EquipDEF + equip.params[paramIdx],
x,
y,
60
);
return;
}
//桜のステータス描画
if (!equips || !equips[index]) {
this.drawText($dataSystemTexts.Altmenu_EquipNON, x, y, 50);
return;
}
const equip = equips[index];
if (index != 5) {
this.drawText(
$dataSystemTexts.Altmenu_EquipATK + equip.params[paramIdx],
x,
y,
60
);
} else
this.drawText(
$dataSystemTexts.Altmenu_EquipDEF + equip.params[paramIdx],
x,
y,
60
);
};
}
class Window_Menu_DetailStatus extends Window_Menu_SimpleStatus {
constructor(rect) {
super(rect);
}
refresh(index) {
const actor = this.actor(index);
const winWidth = this.contentsWidth();
const lineHeight = this.lineHeight();
var sx = 10,
sy = 0;
// 基本攻撃・防御・闘志(魔法力)・敏捷性
//let hoge = true || false ? true : false;
let UPatk =
actor.actor().id == 1
? Math.round(
(actor.paramBase(2) +
$gameVariables.value(188) +
$gameVariables.value(134)) *
actor.paramRate(2)
)
: actor.paramBase(2);
this.drawTextEx($dataSystemTexts.Altmenu_TitleStatus, sx - 8, sy, 110);
[2, 3, 4, 6].forEach((paramTypeIdx, index) => {
let lineNo = index;
this.drawBackgroundRect(
new Rectangle(sx + (winWidth / 4) * lineNo, sy + 38, 110, 34)
);
this.drawActorParamName(
actor,
paramTypeIdx,
sx + (winWidth / 4) * lineNo,
sy + lineHeight
);
if (paramTypeIdx == 2) {
this.drawTextEx(
" " + `${UPatk}`,
sx + (winWidth / 2) * lineNo + 55,
sy + lineHeight,
110
);
this.drawTextEx(
$dataSystemTexts.Altmenu_AtkHosoku,
sx + (winWidth / 4) * lineNo,
sy + lineHeight * 2,
110
);
} else {
this.drawActorParam(
actor,
paramTypeIdx,
sx + (winWidth / 4) * lineNo + 68,
sy + lineHeight
);
}
}, this);
}
//指定したアクターの能力値名を表示
drawActorParamName = function (actor, paramId, x, y) {
const name = TextManager.param(paramId); //status name
this.changeTextColor(ColorManager.systemColor());
this.drawTextEx("\\}\\c[4] " + name + ": \\{", x, y, 160);
this.resetTextColor();
};
//指定したアクターの能力値を表示
drawActorParam = function (actor, paramId, x, y) {
const val =
paramId == 2 ? actor.paramBase(paramId) : actor.param(paramId);
this.drawText(val, x, y, 50);
};
}
const _Window_Menu_makeFontBigger = Window_Base.prototype.makeFontBigger;
Window_Base.prototype.makeFontBigger = function () {
if (this.contents.fontSize <= 96) {
this.contents.fontSize += 4;
} else {
_Window_Menu_makeFontBigger.apply(this, arguments);
}
};
const _Window_Menu_makeFontSmaller = Window_Base.prototype.makeFontSmaller;
Window_Base.prototype.makeFontSmaller = function () {
if (this.contents.fontSize >= 20) {
this.contents.fontSize -= 4;
} else {
_Window_Menu_makeFontSmaller.apply(this, arguments);
}
};
///-------------------------------------------------
// アダルトステータス
class Window_Menu_AdultStatus extends Window_Menu_SimpleStatus {
constructor(rect) {
super(rect);
}
colSpacing() {
return 0;
}
getVal(id) {
return $gameVariables.value(id);
}
refresh() {
let lx = 0;
let ly = 8;
let iconWidth = 32;
if ($gameParty._actors == 2) {
//鈴音
let hlv = $gameVariables.value(25);
switch (hlv) {
case 12:
this.drawText(
$dataSystemTexts.Altmenu_Hst_S_lv12,
lx + 70,
ly,
500
);
break;
case 11:
this.drawText(
$dataSystemTexts.Altmenu_Hst_S_lv11,
lx + 70,
ly,
500
);
break;
case 10:
this.drawText(
$dataSystemTexts.Altmenu_Hst_S_lv10,
lx + 70,
ly,
500
);
break;
case 9:
this.drawText($dataSystemTexts.Altmenu_Hst_S_lv9, lx + 70, ly, 500);
break;
case 8:
this.drawText($dataSystemTexts.Altmenu_Hst_S_lv8, lx + 70, ly, 500);
break;
case 7:
this.drawText($dataSystemTexts.Altmenu_Hst_S_lv7, lx + 70, ly, 500);
break;
case 6:
this.drawText($dataSystemTexts.Altmenu_Hst_S_lv6, lx + 70, ly, 500);
break;
case 5:
this.drawText($dataSystemTexts.Altmenu_Hst_S_lv5, lx + 70, ly, 500);
break;
default:
this.drawText($dataSystemTexts.Altmenu_Hst_S_lv4, lx + 70, ly, 500);
break;
}
return;
}
if ($gameParty._actors == 6) {
//愚譜
this.drawText($dataSystemTexts.Altmenu_Hst_G, lx + 70, ly, 500);
return;
}
const paramTbl = [
{ iconId: 238, valueId: 25 },
{ iconId: 220, valueId: 56 },
{ iconId: 221, valueId: 57 },
{ iconId: 222, valueId: 58 },
{ iconId: 223, valueId: 59 },
];
var textWidth = iconWidth + 65;
paramTbl.forEach((elm, index) => {
let lx = 20 + index * textWidth;
this.drawIcon(elm.iconId, lx, ly);
lx += iconWidth + 5;
this.drawText(`Lv${this.getVal(elm.valueId)}`, lx, ly, 60);
if (index != 0) {
this.drawTextEx(
"\\FS[18]" + `${this.getVal(elm.valueId - 35)}` + "\\FS[24]",
lx - 35,
ly + 15,
60
);
}
}, this);
}
}
const _Window_MenuCommand_maxCols = Window_MenuCommand.prototype.maxCols;
Window_MenuCommand.prototype.maxCols = function () {
return 1;
};
const _Window_MenuCommand_prototype_resetFontSettings =
Window_MenuCommand.prototype.resetFontSettings;
Window_MenuCommand.prototype.resetFontSettings = function () {
_Window_MenuCommand_prototype_resetFontSettings.call(this);
this.contents.fontFace = "uifont, " + $gameSystem.mainFontFace();
};
})();