alter-egoism/js/plugins/FesStyleConfirm.js
2025-11-01 14:17:42 -05:00

1023 lines
28 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

// FesStyleConfirm.js Ver.1.1.1
// MIT License (C) 2023 あわやまたな
// http://opensource.org/licenses/mit-license.php
/*:
* @target MZ
* @orderAfter RemoveSaveFile
* @plugindesc Generates a Maker Fes-style confirmation dialog.
* @author あわやまたな (Awaya_Matana)
* @url https://awaya3ji.seesaa.net/article/499410179.html
* @help Ver.1.1.1
*
* @command showConfirm
* @text Show Confirm
* @desc Display a confirmation dialog.
*
* @arg text
* @text Text
* @type note
* @default
*
* @arg ok
* @desc Decision text.
* @text OK
* @type string
* @default Yes
*
* @arg cancel
* @desc Cancellation text.
* @text Cancel
* @type string
* @default No
*
* @arg switchId
* @text Switch ID
* @desc Assigned when the dialog ends.
* ON at decision, OFF at cancellation.
* @type switch
* @default 1
*
* @command showAlert
* @text Show Alert
* @desc Show alert.
*
* @arg text
* @text Text
* @type note
* @default
*
* @arg ok
* @desc Decision text.
* @text OK
* @type string
* @default OK
*
* @param mzStyle
* @text Make it MZ/MV style
* @desc Make the design MZ/MV.
* @type boolean
* @default false
*
* @param windowSkin
* @text Window Skin
* @desc
* @default
* @type file
* @dir img/system
*
* @param windowOpacity
* @text Window Opacity
* @desc -1 is system default.
* @default -1
* @type number
* @min -1
*
* @param windowWidth
* @text Window Width
* @desc
* @type number
* @default 528
*
* @param numLines
* @text Number of Rows
* @desc The window height is calculated from the number of rows.
* @type number
* @default 8
*
* @param maxItemWidth
* @text Max Item Width
* @desc Limit the width of the selection.
* @type number
* @default 180
*
* @param itemOffsetX
* @text Item Offset X
* @desc Adjust the X coordinate of the selection.
* @type number
* @default 32
*
* @param itemOffsetY
* @text Item Offset Y
* @desc Adjust the Y coordinate of the selection.
* @type number
* @default 32
*
* @param terms
* @text Terms
* @type struct<terms>
* @default {"saveConfirm":"\"Save data.\\nAre you sure?\"","overwriteConfirm":"\"Overwrite data.\\nAre you sure?\"","loadConfirm":"\"Load data.\\nAre you sure?\"","removeConfirm":"\"Remove data.\\nAre you sure?\"","gameEndConfirm":"\"Back to the title?\"","ok":"Yes","cancel":"No"}
*
*/
/*:ja
* @target MZ
* @orderAfter RemoveSaveFile
* @plugindesc ツクールフェス風の確認ダイアログを生成します。
* @author あわやまたな (Awaya_Matana)
* @url https://awaya3ji.seesaa.net/article/499410179.html
* @help
*
* [更新履歴]
* 2023/05/20Ver.1.0.0 公開。
* 2023/07/26Ver.1.1.0 制御文字や中央揃えが正しく機能しない不具合を修正。
* 2024/01/16Ver.1.1.1 MZ風にした時のアウトライン幅を修正。
*
* @command showConfirm
* @text 確認ダイアログの表示
* @desc 確認ダイアログを表示します。
*
* @arg text
* @text テキスト
* @type note
* @default
*
* @arg ok
* @desc 決定した時のテキストです。
* @text 決定
* @type string
* @default はい
*
* @arg cancel
* @desc キャンセルした時のテキストです。
* @text キャンセル
* @type string
* @default いいえ
*
* @arg switchId
* @text スイッチID
* @desc ダイアログ終了時に代入されます。
* 決定の時ON、キャンセルの時OFF。
* @type switch
* @default 1
*
* @command showAlert
* @text アラートの表示
* @desc アラートを表示します。
*
* @arg text
* @text テキスト
* @type note
* @default
*
* @arg ok
* @desc 決定のテキストです。
* @text 決定
* @type string
* @default はい
*
* @param mzStyle
* @text MZ/MV風にする
* @desc デザインをMZ/MVの物にします。
* @type boolean
* @default false
*
* @param windowSkin
* @text ウィンドウスキン
* @desc ファイル名を指定します。
* @default
* @type file
* @dir img/system
*
* @param windowOpacity
* @text ウィンドウ不透明度
* @desc ウィンドウの不透明度を指定します。
* -1でシステムの初期値。
* @default -1
* @type number
* @min -1
*
* @param windowWidth
* @text ウィンドウ幅
* @desc
* @type number
* @default 528
*
* @param numLines
* @text 行数
* @desc 行数からウィンドウ高さが算出されます。
* @type number
* @default 8
*
* @param maxItemWidth
* @text 要素最大幅
* @desc 選択肢の横幅を制限します。
* @type number
* @default 180
*
* @param itemOffsetX
* @text 要素オフセットX
* @desc 選択肢のX座標を調整します。
* @type number
* @default 32
*
* @param itemOffsetY
* @text 要素オフセットY
* @desc 選択肢のY座標を調整します。
* @type number
* @default 32
*
* @param terms
* @text 用語
* @type struct<terms>
* @default {"saveConfirm":"\"データをセーブします。\\nよろしいですか\"","overwriteConfirm":"\"データを上書きします。\\nよろしいですか\"","loadConfirm":"\"データをロードします。\\nよろしいですか\"","removeConfirm":"\"データを削除します。\\nよろしいですか\"","gameEndConfirm":"\"タイトルに戻りますか?\"","ok":"はい","cancel":"いいえ"}
*
*/
/*~struct~terms:
*
* @param saveConfirm
* @text Save Confirm
* @desc
* @type note
* @default "Save data.\nAre you sure?"
*
* @param overwriteConfirm
* @text Overwrite Confirm
* @desc
* @type note
* @default "Overwrite data.\nAre you sure?"
*
* @param loadConfirm
* @text Load Confirm
* @desc
* @type note
* @default "Load data.\nAre you sure?"
*
* @param removeConfirm
* @text Remove Confirm
* @desc
* @type note
* @default "Remove data.\nAre you sure?"
*
* @param gameEndConfirm
* @text Game End Confirm
* @desc
* @type note
* @default "Back to the title?"
*
* @param ok
* @desc Decision text.
* @text OK
* @type string
* @default Yes
*
* @param cancel
* @desc Cancellation text.
* @text Cancel
* @type string
* @default No
*
*/
/*~struct~terms:ja
*
* @param saveConfirm
* @text セーブ確認
* @desc
* @type note
* @default "データをセーブします。\nよろしいですか"
*
* @param overwriteConfirm
* @text 上書き確認
* @desc
* @type note
* @default "データを上書きします。\nよろしいですか"
*
* @param loadConfirm
* @text ロード確認
* @desc
* @type note
* @default "データをロードします。\nよろしいですか"
*
* @param removeConfirm
* @text 削除確認
* @desc
* @type note
* @default "データを削除します。\nよろしいですか"
*
* @param gameEndConfirm
* @text ゲーム終了確認
* @desc
* @type note
* @default "タイトルに戻りますか?"
*
* @param ok
* @desc 決定のテキストです。
* @text 決定
* @type string
* @default はい
*
* @param cancel
* @desc キャンセルのテキストです。
* @text キャンセル
* @type string
* @default いいえ
*
*/
"use strict";
{
//プラグイン名取得。
const script = document.currentScript;
const pluginName = document.currentScript.src.match(/^.*\/(.*).js$/)[1];
const parameters = PluginManager.parameters(pluginName);
const mzStyle = parameters["mzStyle"] === "true";
const windowSkin = parameters["windowSkin"];
const windowOpacity = Number(parameters["windowOpacity"]);
const windowWidth = +parameters["windowWidth"];
const maxItemWidth = +parameters["maxItemWidth"];
const itemOffsetX = +parameters["itemOffsetX"];
const itemOffsetY = +parameters["itemOffsetY"];
const numLines = +parameters["numLines"];
const terms = JSON.parse(parameters["terms"] || "{}");
for (const prop in terms) {
if (prop !== "ok" && prop !== "cancel") {
terms[prop] = JSON.parse(terms[prop]);
}
}
//-----------------------------------------------------------------------------
// PluginManager
PluginManager.registerCommand(pluginName, "showConfirm", function (args) {
const text = JSON.parse(args.text);
const choices = [args.cancel, args.ok];
const switchId = args.switchId;
SceneManager._scene.createConfirmWindow();
$gameMessage.setComfirm(text, choices);
SceneManager._scene._confirmWindow.startConfirm("event", switchId);
this.setWaitMode("message");
});
PluginManager.registerCommand(pluginName, "showAlert", function (args) {
const text = JSON.parse(args.text);
const choices = [args.ok];
SceneManager._scene.createConfirmWindow();
$gameMessage.setComfirm(text, choices);
SceneManager._scene._confirmWindow.startAlert("event");
this.setWaitMode("message");
});
//-----------------------------------------------------------------------------
// Game_Message
const _Game_Message_clear = Game_Message.prototype.clear;
Game_Message.prototype.clear = function () {
_Game_Message_clear.call(this);
this._confirmChoices = [];
this._confirmText = "";
};
Game_Message.prototype.isConfirm = function () {
return this._confirmChoices.length > 0;
};
Game_Message.prototype.confirmChoices = function () {
return this._confirmChoices;
};
Game_Message.prototype.confirmText = function () {
return this._confirmText;
};
Game_Message.prototype.setComfirm = function (text, choices) {
this._confirmText = text;
this._confirmChoices = choices;
};
const _Game_Message_isBusy = Game_Message.prototype.isBusy;
Game_Message.prototype.isBusy = function () {
return this.isConfirm() || _Game_Message_isBusy.call(this);
};
//-----------------------------------------------------------------------------
// Scene_Base
Scene_Base.prototype.createConfirmWindow = function (index) {
if (this._confirmWindow) {
this.addWindow(this._confirmWindow);
return;
}
const rect = this.confirmWindowRect();
this._confirmWindow = new Window_Confirm(rect);
if (index) {
this._confirmWindow.fileIndex = index;
}
this.addWindow(this._confirmWindow);
};
Scene_Base.prototype.confirmWindowRect = function () {
const ww = Graphics.boxWidth;
const wh = 180;
const wx = (Graphics.boxWidth - ww) / 2;
const wy = (Graphics.boxHeight - wh) / 2;
return new Rectangle(wx, wy, ww, wh);
};
//-----------------------------------------------------------------------------
// Scene_File
Scene_File.prototype.openConfirmWindow = function () {
this.createConfirmWindow(this.savefileId());
this._confirmWindow.fileIndex = this.savefileId();
this._confirmWindow.setHandler("ok", this.onConfirmOk.bind(this));
this._confirmWindow.setHandler("cancel", this.onConfirmCancel.bind(this));
const savefileId = this.savefileId();
const isOverwrite = !!DataManager.savefileInfo(savefileId);
this._confirmWindow.setOverwrite(isOverwrite);
this._confirmWindow.startConfirm(this.mode());
if (this._cataWindow) {
this._cataWindow.deactivate();
}
};
//-----------------------------------------------------------------------------
// Scene_Save
const _Scene_Save_onSavefileOk = Scene_Save.prototype.onSavefileOk;
Scene_Save.prototype.onSavefileOk = function () {
const savefileId = this.savefileId();
if (this.isSavefileEnabled(savefileId)) {
Window_HorzCommand.prototype.playOkSound.call(this);
this.openConfirmWindow();
} else {
_Scene_Save_onSavefileOk.call(this);
}
};
Scene_Save.prototype.onConfirmOk = function () {
_Scene_Save_onSavefileOk.call(this);
this._confirmWindow.close();
this._confirmWindow.deactivate();
this._cataWindow.activate();
};
Scene_Save.prototype.onConfirmCancel = function () {
this._confirmWindow.close();
this._confirmWindow.deactivate();
this.activateListWindow();
this._cataWindow.activate();
};
const _Scene_Save_onSaveFailure = Scene_Save.prototype.onSaveFailure;
Scene_Save.prototype.onSaveFailure = function () {
if (this._confirmWindow) {
this._confirmWindow.close();
this._confirmWindow.deactivate();
this._cataWindow.activate();
}
_Scene_Save_onSaveFailure.call(this);
};
//-----------------------------------------------------------------------------
// Scene_Load
const _Scene_Load_onSavefileOk = Scene_Load.prototype.onSavefileOk;
Scene_Load.prototype.onSavefileOk = function () {
const savefileId = this.savefileId();
if (this.isSavefileEnabled(savefileId)) {
Window_HorzCommand.prototype.playOkSound.call(this);
this.openConfirmWindow();
} else {
_Scene_Load_onSavefileOk.call(this);
}
};
Scene_Load.prototype.onConfirmOk = function () {
_Scene_Load_onSavefileOk.call(this);
this._confirmWindow.close();
this._confirmWindow.deactivate();
if (this._cataWindow) {
this._cataWindow.activate();
}
};
Scene_Load.prototype.onConfirmCancel = function () {
this._confirmWindow.close();
this._confirmWindow.deactivate();
this.activateListWindow();
if (this._cataWindow) {
this._cataWindow.activate();
}
};
const _Scene_Load_onLoadFailure = Scene_Load.prototype.onLoadFailure;
Scene_Load.prototype.onLoadFailure = function () {
if (this._confirmWindow) {
this._confirmWindow.close();
this._confirmWindow.deactivate();
if (this._cataWindow) {
this._cataWindow.activate();
}
}
_Scene_Load_onLoadFailure.call(this);
};
//-----------------------------------------------------------------------------
// Scene_Remove
if (window.Scene_Remove) {
const _Scene_Remove_onSavefileOk = Scene_Remove.prototype.onSavefileOk;
Scene_Remove.prototype.onSavefileOk = function () {
const savefileId = this.savefileId();
if (this.isSavefileEnabled(savefileId)) {
Window_HorzCommand.prototype.playOkSound.call(this);
this.openConfirmWindow();
} else {
_Scene_Remove_onSavefileOk.call(this);
}
};
Scene_Remove.prototype.onConfirmOk = function () {
_Scene_Remove_onSavefileOk.call(this);
this._confirmWindow.close();
this._confirmWindow.deactivate();
};
Scene_Remove.prototype.onConfirmCancel = function () {
this._confirmWindow.close();
this._confirmWindow.deactivate();
this.activateListWindow();
};
const _Scene_Remove_onRemoveFailure = Scene_Remove.prototype.onRemoveFailure;
Scene_Remove.prototype.onRemoveFailure = function () {
if (this._confirmWindow) {
this._confirmWindow.close();
this._confirmWindow.deactivate();
}
_Scene_Remove_onRemoveFailure.call(this);
};
}
//-----------------------------------------------------------------------------
// Scene_GameEnd
Scene_GameEnd.prototype.createCommandWindow = function () {
this.createConfirmWindow();
this._commandWindow = this._confirmWindow;
this._confirmWindow.setHandler("ok", this.commandToTitle.bind(this));
this._confirmWindow.setHandler("cancel", this.popScene.bind(this));
this._confirmWindow.startConfirm("gameEnd");
};
//-----------------------------------------------------------------------------
// Window_Confirm
function Window_Confirm() {
this.initialize(...arguments);
}
window.Window_Confirm = Window_Confirm;
Window_Confirm.prototype = Object.create(Window_HorzCommand.prototype);
Window_Confirm.prototype.constructor = Window_Confirm;
Window_Confirm.prototype.initialize = function (rect) {
Window_HorzCommand.prototype.initialize.call(this, rect);
this._isWindow = false;
this._mode = "";
this._alert = false;
this._switchId = 0;
this.openness = 0;
this.deactivate();
this._background = 0;
this._canRepeat = false;
this._overwrite = false;
};
Window_Confirm.prototype.pushTextWidth = function (textState) {
textState.textWidths.push(textState.x - textState.startX);
};
Window_Confirm.prototype.setAlignCenter = function (textState) {
const textWidth = textState.textWidths.shift() || 0;
textState.x = (this.contentsWidth() - textWidth) / 2;
};
Window_Confirm.prototype.processAllText = function (textState) {
if (textState.drawingCenter) {
this.setAlignCenter(textState);
}
Window_HorzCommand.prototype.processAllText.apply(this, arguments);
if (textState.calcTextWidths) {
this.pushTextWidth(textState);
}
};
Window_Confirm.prototype.processNewLine = function (textState) {
if (textState.calcTextWidths) {
this.pushTextWidth(textState);
}
Window_HorzCommand.prototype.processNewLine.call(this, textState);
if (textState.drawingCenter) {
this.setAlignCenter(textState);
}
};
Window_Confirm.prototype.calcTextWidths = function (text) {
this.resetFontSettings();
const textState = this.createTextState(text, 0, 0, 0);
textState.drawing = false;
textState.calcTextWidths = true;
textState.textWidths = [];
this.processAllText(textState);
return textState.textWidths;
};
Window_Confirm.prototype.drawTextExCenter = function (text, x, y, textWidths) {
this.resetFontSettings();
const textState = this.createTextState(text, x, y, 0);
textState.drawingCenter = true;
textState.textWidths = textWidths;
this.processAllText(textState);
};
Window_Confirm.prototype.processCancel = function () {
if (this.index() > 0) {
this.select(0);
this.playCursorSound();
this.updateInputData();
return;
}
SoundManager.playCancel();
this.updateInputData();
this.deactivate();
this.callCancelHandler();
};
if (windowSkin) {
Window_Confirm.prototype.loadWindowskin = function () {
this.windowskin = ImageManager.loadSystem(windowSkin);
this.menu_cursor_skin = ImageManager.loadSystem("menu_save_dialog_cursor");
};
}
Window_Confirm.prototype._refreshBack = function () {
const sprite = this._backSprite;
sprite.bitmap = ImageManager.loadSystem("menu_save_dialog_back");
};
Window_Confirm.prototype.updateBackOpacity = function () {
this.backOpacity = 255;
};
if (windowOpacity > -1) {
Window_Confirm.prototype.updateBackOpacity = function () {
this.backOpacity = windowOpacity;
};
}
Window_Confirm.prototype._updateCursor = function () {
Window_HorzCommand.prototype._updateCursor.call(this);
if (!mzStyle) {
this._cursorSprite.visible = false;
}
};
Window_Confirm.prototype._refreshCursor = function () {
const drect = this._cursorRect.clone();
const srect = { x: 0, y: 0, width: 199, height: 52 };
const m = 0;
for (const child of this._cursorSprite.children) {
child.bitmap = ImageManager.loadSystem("menu_save_dialog_cursor");
}
this._setRectPartsGeometry(this._cursorSprite, srect, drect, m);
};
//カーソルを微調整、あとカーソルを常に不透明に
Window_Confirm.prototype._updateCursor = function () {
this._cursorSprite.alpha = 255;
this._cursorSprite.visible = this.isOpen() && this.cursorVisible;
this._cursorSprite.x = this._cursorRect.x;
this._cursorSprite.y = this._cursorRect.y - 4;
};
if (mzStyle) {
Window_Confirm.prototype._backCursorCanInvisible = function () {
return this.fesGradCursorEnabled();
};
}
Window_Confirm.prototype.maxCols = function () {
return this._alert ? 1 : 2;
};
Window_Confirm.prototype.setOverwrite = function (bool) {
this._overwrite = bool;
};
Window_Confirm.prototype.itemTextAlign = function () {
return "center";
};
Window_Confirm.prototype.startConfirm = function (mode, switchId) {
this._mode = mode;
this._alert = false;
this._switchId = switchId || 0;
this.updatePlacement();
this.createContents();
this.refresh();
this.scrollTo(0, 0);
this.selectDefault();
this.open();
this.activate();
};
Window_Confirm.prototype.startAlert = function (mode) {
this._mode = mode;
this._alert = true;
this._switchId = 0;
this.updatePlacement();
this.createContents();
this.refresh();
this.scrollTo(0, 0);
this.selectDefault();
this.open();
this.activate();
};
Window_Confirm.prototype.selectDefault = function () {
this.select(0);
};
Window_Confirm.prototype.updatePlacement = function () {
const ww = Graphics.boxWidth;
const wh = 180;
this.width = ww + (ww % 2);
this.height = wh + (wh % 2);
this.x = (Graphics.boxWidth - this.width) / 2;
this.y = (Graphics.boxHeight - this.height) / 2;
};
Window_Confirm.prototype.makeCommandList = function () {
if (this._mode === "event") {
const choices = $gameMessage.confirmChoices();
for (const choice of choices) {
this.addCommand(choice, "choice");
}
} else {
var text_ok = "";
var text_cancel = "";
if (this._mode == "save") {
text_ok = "セーブする";
text_cancel = "キャンセル";
} else if (this._mode == "load") {
text_ok = "ロードする";
text_cancel = "キャンセル";
} else if (this._mode == "gameEnd") {
text_ok = "戻る";
text_cancel = "キャンセル";
}
if (!this._alert) {
this.addCommand(text_cancel, "cancel");
}
this.addCommand(text_ok, "ok");
}
};
// Window_Confirm.prototype.drawAllItems = function () {
// Window_HorzCommand.prototype.drawAllItems.call(this);
// const rect = this.itemRect(0);
// const allText = this.getMessage();
// const allSize = this.textSizeEx(allText);
// let startY = (rect.y - allSize.height) / 2;
// const texts = allText.split("\n");
// while (texts.length) {
// const text = texts.shift();
// const size = this.textSizeEx(text);
// const startX = (this.innerWidth - size.width) / 2;
// this.drawTextEx(text, startX, startY, size.width);
// startY += size.height;
// }
// };
Window_Confirm.prototype.drawAllItems = function () {
Window_HorzCommand.prototype.drawAllItems.call(this);
const bottomY = this.itemRect(0).y;
const allText = this.getMessage();
const allTextHeight = this.textSizeEx(allText).height;
const textWidths = this.calcTextWidths(allText);
const y = (bottomY - allTextHeight) / 2;
const textWidths2 = this.calcTextWidths(`ファイル ${this.fileIndex}`);
if (this._mode == "gameEnd") {
this.drawTextEx(allText, 300 + textWidths2[0] + 11, 20, textWidths);
} else {
this.drawTextEx(allText, 480 + textWidths2[0] + 11, 20, textWidths);
}
if (this.fileIndex) {
this.drawText(`ファイル ${this.fileIndex}`, 480, 20, 140);
}
};
//CBR_title.jsの競合対策
Window_Confirm.prototype.getMessage = function () {
let text = "";
switch (this._mode) {
case "event":
text = $gameMessage.confirmText();
break;
case "save":
text = this._overwrite ? terms.overwriteConfirm : terms.saveConfirm;
break;
case "load":
text = terms.loadConfirm;
break;
case "remove":
text = terms.removeConfirm;
break;
case "gameEnd":
text = terms.gameEndConfirm;
break;
case "gameClose":
text = "ゲームを終了します。\nよろしいですか";
break;
}
return text || "";
};
Window_Confirm.prototype.resetTextColor = function () {
Window_HorzCommand.prototype.resetTextColor.call(this);
if (drawItem) {
this.changeTextColor("black");
this.changeOutlineColor("white");
}
};
let drawItem = false;
Window_Confirm.prototype.drawItem = function (index) {
drawItem = !mzStyle;
const outlineWidth = this.contents.outlineWidth;
if (!mzStyle) {
this.contents.outlineWidth = 2;
}
const rect = this.itemLineRect(index);
const align = this.itemTextAlign();
this.resetTextColor();
if (index == this._index) {
this.changeTextColor("#000000");
}
this.changePaintOpacity(this.isCommandEnabled(index));
this.drawTextS(this.commandName(index), rect.x + 4, rect.y - 3, rect.width, align);
this.contents.outlineWidth = outlineWidth;
drawItem = false;
};
Window_Confirm.prototype.drawItemBackground = function (index) {
// Window_HorzCommand.prototype.drawItemBackground.call(this, index);
// if (mzStyle) return;
// const rect = this.itemRect(index);
// this.drawConfirmBack(rect, index === this.index());
};
Window_Confirm.prototype.drawBackgroundRect = function (rect) {
if (mzStyle) {
Window_HorzCommand.prototype.drawBackgroundRect.call(this, rect);
}
};
Window_Confirm.prototype.drawConfirmBack = function (rect, selected) {
const col1 = this.drawFesStyleConfirmColor1(selected);
const col2 = this.drawFesStyleConfirmColor2(selected);
const x = rect.x;
const y = rect.y;
const w = rect.width;
const h = rect.height;
this.contentsBack.drawFesStyleConfirmBack(x, y, w, h, col1);
this.contentsBack.drawFesStyleConfirmBack(x + 2, y + 2, w - 4, h - 4, col2);
};
Window_Confirm.prototype.itemHeight = function () {
return Window_HorzCommand.prototype.itemHeight.call(this) + 16;
};
Window_Confirm.prototype.itemWidth = function () {
const offsetW = getItemRect ? itemOffsetX * 2 : 0;
return Math.floor((this.innerWidth - offsetW) / this.maxCols());
};
Window_Confirm.prototype.clearConfirmBack = function (rect) {
this.contentsBack.clearRect(rect.x, rect.y, rect.width, rect.height);
};
Window_Confirm.prototype.drawFesStyleConfirmColor1 = function (selected) {
return selected ? "rgb(188, 157, 68)" : "rgb(192, 192, 192)";
};
Window_Confirm.prototype.drawFesStyleConfirmColor2 = function (selected) {
return selected ? "rgb(253, 212, 92)" : "rgb(255, 255, 255)";
};
Window_Confirm.prototype.select = function (index) {
const lastIndex = this._index;
Window_HorzCommand.prototype.select.call(this, index);
if (!mzStyle && lastIndex !== index) {
const rect1 = this.itemRect(lastIndex);
const rect2 = this.itemRect(index);
this.clearConfirmBack(rect1);
this.clearConfirmBack(rect2);
if (lastIndex < this.maxItems()) {
this.drawConfirmBack(rect1, false);
}
this.drawConfirmBack(rect2, true);
}
this.refresh();
};
Window_Confirm.prototype.colSpacing = function () {
return 8;
};
let getItemRect = false;
Window_Confirm.prototype.itemRect = function (index) {
getItemRect = true;
const rect = Window_HorzCommand.prototype.itemRect.call(this, index);
rect.y = this.innerHeight - rect.height - rect.y - itemOffsetY;
if (maxItemWidth) {
const rectWidth = rect.width;
rect.width = Math.min(rectWidth, maxItemWidth) + 18;
rect.x += (rectWidth - rect.width) / 2;
}
rect.x += itemOffsetX;
rect.y += 34;
rect.height -= 4;
if (index == 0) {
rect.x += 170;
} else {
rect.x -= 170;
}
getItemRect = false;
return rect;
};
Window_Confirm.prototype.isCancelEnabled = function () {
return this.maxCols() >= 2;
};
Window_Confirm.prototype.callOkHandler = function () {
if (this._mode === "event") {
this.onEventOk();
} else {
Window_HorzCommand.prototype.callOkHandler.call(this);
}
};
Window_Confirm.prototype.callCancelHandler = function () {
if (this._mode === "event") {
this.onEventCancel();
} else {
Window_HorzCommand.prototype.callCancelHandler.call(this);
}
};
Window_Confirm.prototype.onEventOk = function () {
const swicthId = this._switchId;
if (swicthId) {
$gameSwitches.setValue(swicthId, this.index() === 1);
}
$gameMessage.clear();
this._mode = "";
this._switchId = 0;
this.close();
};
Window_Confirm.prototype.playOkSound = function () {
if (this.currentSymbol() === "ok" && ["save", "load", "remove"].includes(this._mode)) {
return;
}
Window_HorzCommand.prototype.playOkSound.call(this);
};
Window_Confirm.prototype.onEventCancel = function () {
this.callOkHandler();
};
//-----------------------------------------------------------------------------
// Bitmap
Bitmap.prototype.drawFesStyleConfirmBack = function (x, y, width, height, color) {
const context = this.context;
context.save();
context.fillStyle = color;
const radius = height / 2;
context.beginPath();
context.moveTo(x + radius, y);
context.arcTo(x + width, y, x + width, y + radius, radius);
context.arcTo(x + width, y + height, x + radius, y + height, radius);
context.arcTo(x, y + height, x, y + radius, radius);
context.arcTo(x, y, x + radius, y, radius);
context.closePath(x + radius, y);
context.fill();
context.restore();
this._baseTexture.update();
};
}