ultimate-angel-zerachiel/www/js/plugins/LL_GalgeChoiceWindowMV.js
2024-01-17 11:38:37 -06:00

573 lines
19 KiB
JavaScript

//=============================================================================
// RPGツクールMV - LL_GalgeChoiceWindowMV.js v2.0.2
//-----------------------------------------------------------------------------
// ルルの教会 (Lulu's Church)
// https://nine-yusha.com/
//
// URL below for license details.
// https://nine-yusha.com/plugin/
//=============================================================================
/*:
* @target MV
* @plugindesc ノベルゲーム風選択肢ウィンドウプラグイン
* @author ルルの教会
* @url https://nine-yusha.com/plugin-galgechoicewindow/
*
* @help LL_GalgeChoiceWindowMV.js
*
* ノベルゲーム風の選択肢ウィンドウを表示します。
* 独自のウィンドウ画像、ボタン画像を設定することもできます。
* (画像はimg/systemフォルダに配置してください)
*
* プラグインコマンド(必須):
* ↓選択肢をセットします。(カンマで区切り半角スペースを入れずに続けて入力)
* LL_GalgeChoiceWindowMV setChoices [選択肢1,選択肢2...]
* ↓選択肢を表示します。(キャンセル許可: 0=>禁止、1=>許可)
* LL_GalgeChoiceWindowMV showChoice [結果変数ID] [キャンセル許可] [初期位置]
* (初期位置を「0」にすると、選択なしになります)
*
* プラグインコマンド(オプション ※showChoiceより前に選択肢毎に毎回設置):
* ↓質問メッセージをセットします。
* LL_GalgeChoiceWindowMV setMessageText [質問メッセージ]
* ↓選択肢を列数を変更します。 (初期値: 1)
* LL_GalgeChoiceWindowMV setMaxCols 1
* ↓ウィンドウの幅を変更します。 (初期値: 480)
* LL_GalgeChoiceWindowMV setWindowWidth 480
* ↓独自のウィンドウ画像をセットします。
* LL_GalgeChoiceWindowMV setBackgroundImage [画像名]
* ↓独自のボタン画像をセットします。 (X座標・Y座標初期値: 0)
* LL_GalgeChoiceWindowMV setBtnImage [画像名] [選択時の画像名] [X座標] [Y座標]
* ↓選択肢高さを変更します。画像が重なる場合は調整してください (初期値: 0)
* LL_GalgeChoiceWindowMV setItemHeight 0
* ↓デフォルトに戻す場合は下記のように引数なしで実行します
* LL_GalgeChoiceWindowMV setBackgroundImage
*
* 【プラグインコマンドの入力例】
* LL_GalgeChoiceWindowMV setMessageText この先へ進みますか?
* LL_GalgeChoiceWindowMV setChoices はい,いいえ
* LL_GalgeChoiceWindowMV showChoice 1 1 1
*
* 利用規約:
* ・著作権表記は必要ございません。
* ・利用するにあたり報告の必要は特にございません。
* ・商用・非商用問いません。
* ・R18作品にも使用制限はありません。
* ・ゲームに合わせて自由に改変していただいて問題ございません。
* ・プラグイン素材としての再配布(改変後含む)は禁止させていただきます。
*
* 作者: ルルの教会
* 作成日: 2022/12/20
*
* @param imageDeleteGuardList
* @text 使用画像リスト
* @desc 選択肢で使用するウィンドウ・ボタン画像を登録します。
* ここに登録しておくことで未使用素材削除から除外されます。
* @default []
* @type struct<imageDeleteGuardList>[]
*/
/*~struct~imageDeleteGuardList:
*
* @param imageName
* @text 画像ファイル名
* @desc 未使用素材から除外する画像ファイルを選択します。
* @dir img/system
* @type file
* @require 1
*/
(function () {
"use strict";
var pluginName = "LL_GalgeChoiceWindowMV";
var parameters = PluginManager.parameters(pluginName);
// Padding
var gcwWindowPadding = 32;
// キャンセル許可時のタッチUI戻るボタンの表示
var gcwCancelButtonEnabled = false;
// フェードイン効果フレーム
var gcwFadeInFrame = 32;
// 設定保存用変数定義
var messageTextLists = [];
var choiceLists = [];
var maxCols = 1;
var variableNumber = 0;
var cancelType = true;
var iniPosition = 1;
var gcwWindowWidth = 480;
var backgroundImage = "";
var gcwButtonImage = "";
var gcwButtonFocusImage = "";
var gcwButtonAdjustX = 0;
var gcwButtonAdjustY = 0;
var gcwItemHeightAdjust = 0;
//-----------------------------------------------------------------------------
// PluginCommand (for MV)
//
var _Game_Interpreter_pluginCommand =
Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function (command, args) {
_Game_Interpreter_pluginCommand.call(this, command, args);
if (command === pluginName) {
switch (args[0]) {
case "setChoices": // 選択肢の定義
var choices = args[1].split(",");
choiceLists = [];
if (choices) {
choices.forEach(function (elm) {
choiceLists.push(String(elm));
});
}
return;
case "setMessageText": // 質問メッセージの定義
var messageText = String(args[1] || "");
messageTextLists = [];
if (messageText) {
messageTextLists.push(String(args[1] || ""));
}
return;
case "setMaxCols": // 列数の定義
maxCols = Number(args[1] || 1);
return;
case "setWindowWidth": // ウィンドウ幅の定義
gcwWindowWidth = Number(args[1] || 480);
return;
case "setBackgroundImage": // ウィンドウ画像の定義
backgroundImage = String(args[1] || "");
return;
case "setBtnImage": // ボタン画像の定義
gcwButtonImage = String(args[1] || "");
gcwButtonFocusImage = String(args[2] || "");
gcwButtonAdjustX = Number(args[3] || 0);
gcwButtonAdjustY = Number(args[4] || 0);
return;
case "setItemHeight": // 選択肢高さの定義
gcwItemHeightAdjust = Number(args[1] || 480);
return;
case "showChoice": // 選択肢の表示
variableNumber = Number(args[1] || 0);
cancelType = Number(args[2] || 1) === 1 ? true : false;
iniPosition = Number(args[3] || 1);
// 選択肢が空の場合、終了
if (choiceLists.length == 0) {
console.log(
pluginName +
": 有効な選択肢が存在しなかったため、コマンドがスキップされました"
);
return;
}
if (!$gameMessage.isBusy()) {
$gameMessage.setGalgeChoices(choiceLists);
this.setWaitMode("message");
}
return;
}
}
};
//-----------------------------------------------------------------------------
// Game_Message
//
var _Game_Message_clear = Game_Message.prototype.clear;
Game_Message.prototype.clear = function () {
_Game_Message_clear.apply(this, arguments);
this._galgeChoices = [];
};
Game_Message.prototype.galgeChoices = function () {
return this._galgeChoices;
};
Game_Message.prototype.isGalgeChoice = function () {
return this._galgeChoices.length > 0;
};
Game_Message.prototype.setGalgeChoices = function (choices) {
this._galgeChoices = choices;
};
var _Game_Message_isBusy = Game_Message.prototype.isBusy;
Game_Message.prototype.isBusy = function () {
return _Game_Message_isBusy.apply(this, arguments) || this.isGalgeChoice();
};
//-----------------------------------------------------------------------------
// Window_Message
//
var _Window_Message_createSubWindows =
Window_Message.prototype.createSubWindows;
Window_Message.prototype.createSubWindows = function () {
_Window_Message_createSubWindows.apply(this, arguments);
this._galgeChoiceWindow = new Window_GalgeChoiceList(this);
};
var _Window_Message_startInput = Window_Message.prototype.startInput;
Window_Message.prototype.startInput = function () {
if ($gameMessage.isGalgeChoice()) {
this._galgeChoiceWindow.start();
return true;
}
return _Window_Message_startInput.apply(this, arguments);
};
var _Window_Message_isAnySubWindowActive =
Window_Message.prototype.isAnySubWindowActive;
Window_Message.prototype.isAnySubWindowActive = function () {
if (this._galgeChoiceWindow) {
return (
_Window_Message_isAnySubWindowActive.apply(this, arguments) ||
this._galgeChoiceWindow.active
);
}
return _Window_Message_isAnySubWindowActive.apply(this, arguments);
};
// for MV
var _Window_Message_subWindows = Window_Message.prototype.subWindows;
Window_Message.prototype.subWindows = function () {
var subWindows = _Window_Message_subWindows.apply(this, arguments);
return subWindows.concat(this._galgeChoiceWindow);
};
//-----------------------------------------------------------------------------
// Window_GalgeChoiceList
//
// ギャルゲ風選択肢ウィンドウを定義します。
function Window_GalgeChoiceList() {
this.initialize.apply(this, arguments);
}
Window_GalgeChoiceList.prototype = Object.create(Window_Command.prototype);
Window_GalgeChoiceList.prototype.constructor = Window_GalgeChoiceList;
Window_GalgeChoiceList.prototype.initialize = function (messageWindow) {
this._messageWindow = messageWindow;
Window_Command.prototype.initialize.call(this, 0, 0);
this.openness = 0;
this.deactivate();
// フォーカスアニメーション判定
this._originalCursorSpriteFade = true;
};
Window_GalgeChoiceList.prototype.start = function () {
this.updatePlacement();
this.createContents();
this.refresh();
this.setQuestionText();
this.setSymbol();
this.createOriginalBackground();
this.open();
this.activate();
};
var _Window_GalgeChoiceList_refresh =
Window_GalgeChoiceList.prototype.refresh;
Window_GalgeChoiceList.prototype.refresh = function () {
this.removeChild(this._bgSprite);
this._bgSprite = null;
this.removeChild(this._bgDummy);
this._bgDummy = null;
this.removeChild(this._originalCursorSprite);
this._originalCursorSprite = null;
this.removeChild(this._originalButtonSprite);
this._originalButtonSprite = null;
// ウィンドウ枠、カーソルを初期化
this.setCursorRect(0, 0, 0, 0);
this.opacity = 255;
_Window_GalgeChoiceList_refresh.apply(this, arguments);
};
Window_GalgeChoiceList.prototype.updatePlacement = function () {
var wh = this.calcWindowHeight();
var ww = gcwWindowWidth;
var wx = (Graphics.boxWidth - ww) / 2;
var wy = (Graphics.boxHeight - wh) / 2;
this.width = ww;
this.height = wh;
this.x = wx;
this.y = wy;
};
Window_GalgeChoiceList.prototype.calcWindowHeight = function () {
// ウィンドウの高さを計算
var itemCols = Math.ceil(choiceLists.length / maxCols);
var height = this.lineHeight() * messageTextLists.length;
if (messageTextLists.length > 0) height += gcwWindowPadding;
height += this.itemHeight() * itemCols;
height += gcwWindowPadding * 2; // padding
return height;
};
Window_GalgeChoiceList.prototype.createOriginalBackground = function () {
if (backgroundImage != "") {
this._bgSprite = new Sprite();
this._bgSprite.bitmap = ImageManager.loadSystem(backgroundImage);
this._bgSprite.bitmap.addLoadListener(
function () {
this._bgSprite.x = this.width / 2 - this._bgSprite.width / 2;
this._bgSprite.y = this.height / 2 - this._bgSprite.height / 2;
}.bind(this)
);
this._bgSprite.opacity = 0;
this.addChildToBack(this._bgSprite);
// ウィンドウ枠を消去
this.opacity = 0;
}
};
Window_GalgeChoiceList.prototype.drawAllItems = function () {
this.createOriginalCursor();
this.createOriginalButton();
var topIndex = this.topIndex();
for (var i = 0; i < this.maxPageItems(); i++) {
var index = topIndex + i;
if (index < this.maxItems()) {
this.drawItemBackground(index);
this.drawItem(index);
}
}
};
Window_GalgeChoiceList.prototype.drawItemBackground = function (index) {
var rect = this.itemRect(index);
this.drawBackgroundRect(rect);
};
Window_GalgeChoiceList.prototype.createOriginalCursor = function () {
if (gcwButtonFocusImage != "") {
this._originalCursorSprite = null;
this._originalCursorSprite = new Sprite();
this._originalCursorSprite.bitmap =
ImageManager.loadSystem(gcwButtonFocusImage);
this._originalCursorSprite.opacity = 128;
this._originalCursorSprite.visible = true;
this.addChildToBack(this._originalCursorSprite);
}
};
Window_GalgeChoiceList.prototype.createOriginalButton = function () {
if (gcwButtonImage != "") {
this._originalButtonSprite = null;
this._originalButtonSprite = new Sprite();
this._originalButtonSprite.visible = false;
this.addChildToBack(this._originalButtonSprite);
}
};
Window_GalgeChoiceList.prototype.drawBackgroundRect = function (rect) {
var x = rect.x;
var y = rect.y;
var w = rect.width;
var h = rect.height;
if (gcwButtonImage != "") {
var originalButtonSprite = new Sprite();
originalButtonSprite.bitmap = ImageManager.loadSystem(gcwButtonImage);
originalButtonSprite.x = x + gcwButtonAdjustX + gcwWindowPadding;
originalButtonSprite.y = y + gcwButtonAdjustY + gcwWindowPadding;
this._originalButtonSprite.addChild(originalButtonSprite);
}
};
Window_GalgeChoiceList.prototype.refreshCursor = function () {
if (this._cursorAll) {
this.refreshCursorForAll();
} else if (this.index() >= 0) {
var rect = this.itemRect(this.index());
if (gcwButtonFocusImage != "") {
if (this._originalCursorSprite) {
this._originalCursorSprite.x =
rect.x + gcwButtonAdjustX + gcwWindowPadding;
this._originalCursorSprite.y =
rect.y + gcwButtonAdjustY + gcwWindowPadding;
}
} else {
this.setCursorRect(rect.x, rect.y, rect.width, rect.height);
}
} else {
this.setCursorRect(0, 0, 0, 0);
}
};
// for MV
Window_GalgeChoiceList.prototype.updateCursor = function () {
if (this._cursorAll) {
var allRowsHeight = this.maxRows() * this.itemHeight();
this.setCursorRect(0, 0, this.contents.width, allRowsHeight);
this.setTopRow(0);
} else if (this.isCursorVisible()) {
var rect = this.itemRect(this.index());
if (gcwButtonFocusImage != "") {
if (this._originalCursorSprite) {
this._originalCursorSprite.x =
rect.x + gcwButtonAdjustX + gcwWindowPadding;
this._originalCursorSprite.y =
rect.y + gcwButtonAdjustY + gcwWindowPadding;
}
} else {
this.setCursorRect(rect.x, rect.y, rect.width, rect.height);
}
} else {
this.setCursorRect(0, 0, 0, 0);
}
};
Window_GalgeChoiceList.prototype.update = function () {
Window_Command.prototype.update.call(this);
this.updateOriginalButton();
this.updateOriginalCursorButton();
if (this._bgSprite) this._bgSprite.opacity = this.openness;
};
Window_GalgeChoiceList.prototype.updateOriginalButton = function () {
if (this._originalButtonSprite) {
if (this.isOpen()) {
this._originalButtonSprite.visible = true;
} else {
this._originalButtonSprite.visible = false;
}
}
};
Window_GalgeChoiceList.prototype.updateOriginalCursorButton = function () {
if (this._originalCursorSprite) {
if (this.isOpen() && this._index > -1) {
this._originalCursorSprite.visible = true;
if (this._originalCursorSprite.opacity >= 255)
this._originalCursorSpriteFade = false;
if (this._originalCursorSprite.opacity <= 128)
this._originalCursorSpriteFade = true;
this._originalCursorSprite.opacity += this._originalCursorSpriteFade
? 6
: -6;
} else {
this._originalCursorSprite.visible = false;
}
}
};
Window_GalgeChoiceList.prototype.updateOpen = function () {
if (this._opening) {
this.openness += gcwFadeInFrame;
if (this.isOpen()) {
this._opening = false;
}
}
};
Window_GalgeChoiceList.prototype.maxCols = function () {
return maxCols;
};
Window_GalgeChoiceList.prototype.setQuestionText = function () {
messageTextLists.forEach(function (text, index) {
this.drawText(
this.convertEscapeCharacters(text),
0,
this.lineHeight() * index,
this.width - this.padding * 2,
"center"
);
}, this);
};
Window_GalgeChoiceList.prototype.makeCommandList = function () {
choiceLists.forEach(function (elm, index) {
this.addCommand(String(elm), index + 1);
}, this);
};
Window_GalgeChoiceList.prototype.updatePadding = function () {
this.padding = gcwWindowPadding;
};
Window_GalgeChoiceList.prototype.itemRect = function (index) {
var margin = this.lineHeight() * messageTextLists.length;
if (messageTextLists.length > 0) margin += gcwWindowPadding;
var rect = new Rectangle();
var maxCols = this.maxCols();
rect.width = this.itemWidth();
rect.height = this.itemHeight();
rect.x = (index % maxCols) * (rect.width + this.spacing()) - this._scrollX;
rect.y = Math.floor(index / maxCols) * rect.height - this._scrollY + margin;
return rect;
};
Window_GalgeChoiceList.prototype.setSymbol = function () {
if (iniPosition > 0) {
this.selectSymbol(iniPosition);
} else {
this.deselect();
}
};
Window_GalgeChoiceList.prototype.itemHeight = function () {
return (
Window_Selectable.prototype.itemHeight.call(this) + gcwItemHeightAdjust
);
};
Window_GalgeChoiceList.prototype.drawItem = function (index) {
var rect = this.itemRectForText(index);
var align = this.itemTextAlign();
this.resetTextColor();
this.changePaintOpacity(this.isCommandEnabled(index));
this.drawText(
this.convertEscapeCharacters(this.commandName(index)),
rect.x,
rect.y + gcwItemHeightAdjust / 2,
rect.width,
align
);
};
Window_GalgeChoiceList.prototype.isCancelEnabled = function () {
return cancelType;
};
Window_GalgeChoiceList.prototype.isOkTriggered = function () {
return Input.isTriggered("ok");
};
Window_GalgeChoiceList.prototype.callOkHandler = function () {
$gameVariables.setValue(variableNumber, this.currentSymbol());
this._messageWindow.terminateMessage();
this.close();
};
Window_GalgeChoiceList.prototype.callCancelHandler = function () {
$gameVariables.setValue(variableNumber, -1);
this._messageWindow.terminateMessage();
this.close();
};
// for MV
Window_GalgeChoiceList.prototype.windowWidth = function () {
return gcwWindowWidth;
};
Window_GalgeChoiceList.prototype.windowHeight = function () {
return this.calcWindowHeight();
};
Window_GalgeChoiceList.prototype.itemTextAlign = function () {
return "center";
};
})();