//=============================================================================
// RPGツクールMZ - LL_VariableWindow.js v1.0.0
//-----------------------------------------------------------------------------
// ルルの教会 (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-variablewindow/
 *
 * @help LL_VariableWindow.js
 *
 * 変数を画面にウィンドウで表示します。
 * ウィンドウは同時に4つまで表示することができます。
 *
 * プラグインコマンド:
 *    ウィンドウを表示: 変数をウィンドウで表示します。
 *    ウィンドウを消去: 表示しているウィンドウを消去します。
 *
 * 利用規約:
 *   ・著作権表記は必要ございません。
 *   ・利用するにあたり報告の必要は特にございません。
 *   ・商用・非商用問いません。
 *   ・R18作品にも使用制限はありません。
 *   ・ゲームに合わせて自由に改変していただいて問題ございません。
 *   ・プラグイン素材としての再配布（改変後含む）は禁止させていただきます。
 *
 * 作者: ルルの教会
 * 作成日: 2022/5/14
 *
 * @command showWindow
 * @text ウィンドウを表示
 * @desc 変数の値をウィンドウで表示します。
 *
 * @arg windowId
 * @text ウィンドウ番号
 * @desc どのウィンドウ番号に表示するか選択します。
 * 同時に4つまで表示することが可能です。
 * @type select
 * @default 1
 * @option 1
 * @value 1
 * @option 2
 * @value 2
 * @option 3
 * @value 3
 * @option 4
 * @value 4
 *
 * @arg variableId
 * @text 変数
 * @desc ウィンドウに表示する変数です。
 * @type variable
 *
 * @arg windowX
 * @text X座標
 * @desc ウィンドウの表示位置(X)です。(autoと入力すると中央表示)
 * @default 408
 * @type string
 *
 * @arg windowY
 * @text Y座標
 * @desc ウィンドウの表示位置(Y)です。(autoと入力すると中央表示)
 * @default 60
 * @type string
 *
 * @arg windowWidth
 * @text 横幅
 * @desc ウィンドウの横幅です。
 * @default 400
 * @type number
 *
 * @command hideWindow
 * @text ウィンドウを消去
 * @desc 表示したウィンドウを消去します。
 *
 * @arg windowId
 * @text ウィンドウ番号
 * @desc どのウィンドウ番号を消去するか選択します。
 * @type select
 * @default 1
 * @option 1
 * @value 1
 * @option 2
 * @value 2
 * @option 3
 * @value 3
 * @option 4
 * @value 4
 */

(function () {
	"use strict";
	var pluginName = "LL_VariableWindow";
	var parameters = PluginManager.parameters(pluginName);

	// 変数名の横幅割合
	const variableWindowLabelWidth = 0.6;

	// ウィンドウを表示
	PluginManager.registerCommand(pluginName, "showWindow", (args) => {
		const windowId = Number(args.windowId || 1);
		const variableId = Number(args.variableId || 0);
		const x = String(args.windowX || 0);
		const y = String(args.windowY || 0);
		const width = Number(args.windowWidth || 400);

		// 旧セーブデータ対策
		if (!$gameSystem._LL_VariableWindow) {
			$gameSystem._LL_VariableWindow = {};
			$gameSystem._LL_VariableWindow[1] = { variableId: null, x: 0, y: 0, width: 0 };
			$gameSystem._LL_VariableWindow[2] = { variableId: null, x: 0, y: 0, width: 0 };
			$gameSystem._LL_VariableWindow[3] = { variableId: null, x: 0, y: 0, width: 0 };
			$gameSystem._LL_VariableWindow[4] = { variableId: null, x: 0, y: 0, width: 0 };
		}

		$gameSystem._LL_VariableWindow[windowId] = { variableId: variableId, x: x, y: y, width: width };
	});

	// ウィンドウを消去
	PluginManager.registerCommand(pluginName, "hideWindow", (args) => {
		const windowId = Number(args.windowId || 1);

		// 旧セーブデータ対策
		if (!$gameSystem._LL_VariableWindow) {
			$gameSystem._LL_VariableWindow = {};
			$gameSystem._LL_VariableWindow[1] = { variableId: null, x: 0, y: 0, width: 0 };
			$gameSystem._LL_VariableWindow[2] = { variableId: null, x: 0, y: 0, width: 0 };
			$gameSystem._LL_VariableWindow[3] = { variableId: null, x: 0, y: 0, width: 0 };
			$gameSystem._LL_VariableWindow[4] = { variableId: null, x: 0, y: 0, width: 0 };
		}

		$gameSystem._LL_VariableWindow[windowId] = { variableId: null, x: 0, y: 0, width: 0 };
	});

	//-----------------------------------------------------------------------------
	// Game_System
	//
	// 変数ウィンドウ制御用の独自配列を追加定義します。

	const _Game_System_initialize = Game_System.prototype.initialize;
	Game_System.prototype.initialize = function () {
		_Game_System_initialize.apply(this, arguments);

		this._LL_VariableWindow = {};
		this._LL_VariableWindow[1] = { variableId: null, x: 0, y: 0, width: 0 };
		this._LL_VariableWindow[2] = { variableId: null, x: 0, y: 0, width: 0 };
		this._LL_VariableWindow[3] = { variableId: null, x: 0, y: 0, width: 0 };
		this._LL_VariableWindow[4] = { variableId: null, x: 0, y: 0, width: 0 };
	};

	//-----------------------------------------------------------------------------
	// Scene_Map
	//

	const _Scene_Map_stop = Scene_Map.prototype.stop;
	Scene_Map.prototype.stop = function () {
		this._exVariableWindow1.hide();
		this._exVariableWindow2.hide();
		this._exVariableWindow3.hide();
		this._exVariableWindow4.hide();
		_Scene_Map_stop.apply(this, arguments);
	};

	const _Scene_Map_terminate = Scene_Map.prototype.terminate;
	Scene_Map.prototype.terminate = function () {
		_Scene_Map_terminate.apply(this, arguments);
		if (!SceneManager.isNextScene(Scene_Battle)) {
			this._exVariableWindow1.hide();
			this._exVariableWindow2.hide();
			this._exVariableWindow3.hide();
			this._exVariableWindow4.hide();
		}
	};

	const _Scene_Map_createAllWindows = Scene_Map.prototype.createAllWindows;
	Scene_Map.prototype.createAllWindows = function () {
		_Scene_Map_createAllWindows.apply(this, arguments);
		this.createExVariableWindow();
	};

	Scene_Map.prototype.update = function () {
		Scene_Message.prototype.update.call(this);
		this.updateDestination();
		this.updateMenuButton();

		if ($gameSwitches.value(144)) {
			if (TouchInput.isTriggered() || TouchInput.isCancelled() || Input.isTriggered("ok") || Input.isTriggered("escape")) {
				if ($gameVariables.value(7) == 0) {
					$gameVariables.setValue(315, []);
				} else {
					$gameVariables.setValue(316, []);
				}
				$gameSwitches.setValue(144, false);
				return;
			}
			this.updateMainMultiply();
			return;
		}

		this.updateMapNameWindow();
		this.updateMainMultiply();
		if (this.isSceneChangeOk()) {
			this.updateScene();
		} else if (SceneManager.isNextScene(Scene_Battle)) {
			this.updateEncounterEffect();
		}
		this.updateWaitCount();

		// #競合対策
		// KMS_MapActiveMessage.jsの競合用
		this.updateActiveMessageDisplay();
	};

	Scene_Map.prototype.createExVariableWindow = function () {
		this._exVariableWindow1 = new Window_ExVariableWindow();
		this._exVariableWindow1.setWindowId(1);
		this.addWindow(this._exVariableWindow1);
		this._exVariableWindow2 = new Window_ExVariableWindow();
		this._exVariableWindow2.setWindowId(2);
		this.addWindow(this._exVariableWindow2);
		this._exVariableWindow3 = new Window_ExVariableWindow();
		this._exVariableWindow3.setWindowId(3);
		this.addWindow(this._exVariableWindow3);
		this._exVariableWindow4 = new Window_ExVariableWindow();
		this._exVariableWindow4.setWindowId(4);
		this.addWindow(this._exVariableWindow4);
	};

	const _Scene_Map_callMenu = Scene_Map.prototype.callMenu;
	Scene_Map.prototype.callMenu = function () {
		_Scene_Map_callMenu.apply(this, arguments);
		this._exVariableWindow1.hide();
		this._exVariableWindow2.hide();
		this._exVariableWindow3.hide();
		this._exVariableWindow4.hide();
	};

	//-----------------------------------------------------------------------------
	// Window_ExVariableWindow
	//
	// 変数を表示するウィンドウです。

	function Window_ExVariableWindow() {
		this.initialize(...arguments);
	}

	Window_ExVariableWindow.prototype = Object.create(Window_Base.prototype);
	Window_ExVariableWindow.prototype.constructor = Window_ExVariableWindow;

	Window_ExVariableWindow.prototype.initialize = function () {
		const rect = new Rectangle(0 - 4, 0 - 4, Graphics.width, Graphics.height);
		Window_Base.prototype.initialize.call(this, rect);

		this.width = 0;
		this.height = 0;
		this._windowId = null;
		this.backOpacity = 0;
		this.frameVisible = false;

		this.contents.fontFace = "serif";
		this.contents.fontSize = 18;

		//this._backgroundSprite = new Sprite();
		//this._backgroundSprite.visible = false;
		this._CBR_back_sira = ImageManager.loadSystem("result_back_sira");
		this._CBR_back_yozu = ImageManager.loadSystem("result_back_yozu");

		//this.addChild(this._backgroundSprite);
	};

	Window_ExVariableWindow.prototype.setWindowId = function (id) {
		this._windowId = id;
	};

	Window_ExVariableWindow.prototype.update = function () {
		Window_Base.prototype.update.call(this);

		this.refresh();
	};

	Window_ExVariableWindow.prototype.updatePadding = function () {
		this.padding = 0;
	};
	Window_ExVariableWindow.prototype.itemPadding = function () {
		return 0;
	};
	Window_ExVariableWindow.prototype.colSpacing = function () {
		return 0;
	};
	Window_ExVariableWindow.prototype.rowSpacing = function () {
		return 0;
	};
	Window_ExVariableWindow.prototype.windowWidth = function () {
		return 1280; //900;
	};

	Window_ExVariableWindow.prototype.labelWidth = function () {
		return Math.floor(this.windowWidth() * variableWindowLabelWidth);
	};

	Window_ExVariableWindow.prototype.windowHeight = function () {
		return 720; //640;
	};

	Window_ExVariableWindow.prototype.getVariableId = function () {
		if ($gameSystem._LL_VariableWindow) {
			return $gameSystem._LL_VariableWindow[this._windowId].variableId;
		}
		return null;
	};

	Window_ExVariableWindow.prototype.refresh = function () {
		if (this.getVariableId()) {
			if (!this.CBR_drawn) {
				this.CBR_drawn = true;

				var keikenLi = [
					{ name: "人間", unit: "人", var_sira: 259, var_yozu: 339 },
					{ name: "魔物", unit: "匹", var_sira: 260, var_yozu: 340 },
					{ name: "魔獣", unit: "匹", var_sira: 261, var_yozu: 341 },

					{ name: "セックス", unit: "回", var_sira: 262, var_yozu: 342 },
					{ name: "アナルセックス", unit: "回", var_sira: 263, var_yozu: 343 },
					{ name: "フェラチオ", unit: "回", var_sira: 264, var_yozu: 344 },
					{ name: "パイズリ", unit: "回", var_sira: 265, var_yozu: 345 },
					{ name: "手コキ", unit: "回", var_sira: 266, var_yozu: 346 },
					{ name: "クンニ", unit: "回", var_sira: 267, var_yozu: 347 },
					{ name: "キス", unit: "回", var_sira: 268, var_yozu: 348 },
					{ name: "乳揉み", unit: "回", var_sira: 269, var_yozu: 349 },
					{ name: "尻揉み", unit: "回", var_sira: 270, var_yozu: 350 },
					{ name: "手マン", unit: "回", var_sira: 271, var_yozu: 351 },
					{ name: "アナル弄り", unit: "回", var_sira: 272, var_yozu: 352 },
					{ name: "オナニー", unit: "回", var_sira: 273, var_yozu: 353 },
					{ name: "アナニー", unit: "回", var_sira: 274, var_yozu: 354 },
					{ name: "トイレ", unit: "回", var_sira: 275, var_yozu: 355 },
					{ name: "露出プレイ", unit: "回", var_sira: 276, var_yozu: 356 },
					//{ name: "調教", unit: "回", var_sira: 277 , var_yozu:357},
					{ name: "筆おろし", unit: "回", var_sira: 278, var_yozu: 358 },
					{ name: "レズエッチ", unit: "回", var_sira: 279, var_yozu: 359 },
					{ name: "近親相姦", unit: "回", var_sira: 280, var_yozu: 360 },

					{ name: "絶頂", unit: "回", var_sira: 281, var_yozu: 361 },
					{ name: "潮吹き", unit: "回", var_sira: 282, var_yozu: 362 },
					{ name: "ぶっかけ", unit: "cc", var_sira: 283, var_yozu: 363 },
					{ name: "膣内射精", unit: "cc", var_sira: 284, var_yozu: 364 },
					{ name: "アナル内射精", unit: "cc", var_sira: 285, var_yozu: 365 },
					{ name: "口内射精", unit: "cc", var_sira: 286, var_yozu: 366 },
					{ name: "母乳噴出", unit: "cc", var_sira: 287, var_yozu: 367 },

					{ name: "人との性行為", unit: "回", var_sira: 288, var_yozu: 368 },
					{ name: "異種姦", unit: "回", var_sira: 289, var_yozu: 369 },
					{ name: "乱交", unit: "回", var_sira: 290, var_yozu: 370 },
					{ name: "レイプ", unit: "回", var_sira: 291, var_yozu: 371 },
					{ name: "セクハラ", unit: "回", var_sira: 292, var_yozu: 372 },
					{ name: "ご奉仕", unit: "回", var_sira: 293, var_yozu: 373 },
					{ name: "戦闘中エッチ", unit: "回", var_sira: 308, var_yozu: 388 },

					{ name: "風俗仕事", unit: "回", var_sira: 294, var_yozu: 374 },
					{ name: "風俗で稼いだ額", unit: "円", var_sira: 295, var_yozu: 375 },
					{ name: "売春", unit: "回", var_sira: 296, var_yozu: 376 },
					{ name: "売春で稼いだ額", unit: "円", var_sira: 297, var_yozu: 377 },
					{ name: "母乳販売", unit: "回", var_sira: 298, var_yozu: 378 },
					{ name: "母乳販売で稼いだ額", unit: "円", var_sira: 299, var_yozu: 379 },

					{ name: "妊娠", unit: "回", var_sira: 300, var_yozu: 380 },
					{ name: "出産", unit: "回", var_sira: 301, var_yozu: 381 },
					{ name: "堕胎", unit: "回", var_sira: 302, var_yozu: 382 },
					{ name: "流産", unit: "回", var_sira: 303, var_yozu: 383 },
					{ name: "人間出産", unit: "人", var_sira: 304, var_yozu: 384 },
					{ name: "魔物出産", unit: "匹", var_sira: 305, var_yozu: 385 },
					{ name: "魔獣出産", unit: "匹", var_sira: 306, var_yozu: 386 },
					{ name: "産卵", unit: "回", var_sira: 307, var_yozu: 387 }
				];

				this.width = this.windowWidth();
				this.height = this.windowHeight();

				this.x = (Graphics.width - this.windowWidth()) / 2;
				this.y = (Graphics.height - this.windowHeight()) / 2;

				this.contents.clear();
				this.changeTextColor(this.systemColor());

				var ac_name = this._windowId === 1 ? "sira" : "yozu";
				if (this[`_CBR_back_${ac_name}`]) {
					this.contents.blt(this[`_CBR_back_${ac_name}`], 0, 0, 1280, 720, 0, 0, 1280, 720);
				}

				this.resetTextColor();

				var var_bf = $gameVariables.value(ac_name === "sira" ? 315 : 316) || [];
				var var_start = 242;

				var draw_item = function (e, a, b, c, x, y) {
					e.drawTextS(a, x + 40, y, e.labelWidth());
					if (b) {
						e.changeTextColor("#FF4444");
						e.drawTextM(`＋${b}`, x + 180, y, 100, "right");
						e.changeTextColor("#FFFFFF");
					} else {
						e.drawTextS(`＋${b}`, x + 180, y, 100, "right");
					}

					e.drawTextS(c, x + 290, y, e.labelWidth());
				};

				this.contents.fontSize = 22;
				this.changeTextColor("#000000");
				this.drawTextM("エッチ経験", 15, 122, 300, "center");

				this.drawTextM("経験相手", 330, 122, 300, "center");
				this.drawTextM("絶頂・射精", 330, 122 + 27 * 4 + 2, 300, "center");
				this.drawTextM("エロシチュ", 330, 122 + 27 * 12 + 2 * 2, 300, "center");

				this.drawTextM("エロ商売", 645, 122, 300, "center");
				this.drawTextM("出産", 645, 122 + 27 * 7 + 2, 300, "center");
				this.changeTextColor("#FFFFFF");
				this.contents.fontSize = 18;

				//テキスト と 現在の数値
				for (var i = 3; i < 21; i++) {
					var col = 23;
					var row = Math.floor(i / col);
					var h = 40;
					var lh = 27;

					var var_num = keikenLi[i][`var_${ac_name}`] || 0;

					draw_item(
						this,
						keikenLi[i].name,
						//$gameVariables.value(keikenLi[i][`var_${ac_name}`]) || 0,
						$gameVariables.value(var_num) - (var_bf[var_num - var_start] || 0),
						keikenLi[i].unit,
						this.itemPadding() + row * (this.windowWidth() / 2 - 160),
						h + (i % col) * lh + 26
					);
				}
				for (var i = 0; i < 3; i++) {
					var col = 23;
					var row = Math.floor(i / col);
					var h = 40;
					var lh = 27;
					var top = lh * 3;
					var left = 314;

					var var_num = keikenLi[i][`var_${ac_name}`] || 0;

					draw_item(
						this,
						keikenLi[i].name,
						$gameVariables.value(var_num) - (var_bf[var_num - var_start] || 0),
						keikenLi[i].unit,
						left + this.itemPadding() + row * (this.windowWidth() / 2 - 160),
						top + h + i * lh + 26
					);
				}

				for (var i = 21; i < 28; i++) {
					var col = 23;
					var row = i;
					var h = 40;
					var lh = 27;
					var top = lh * 6 + 2;
					var left = 314;

					var idx = i - 20;

					var var_num = keikenLi[i][`var_${ac_name}`] || 0;

					draw_item(
						this,
						keikenLi[i].name,
						//$gameVariables.value(keikenLi[i][`var_${ac_name}`]) || 0,
						$gameVariables.value(var_num) - (var_bf[var_num - var_start] || 0),
						keikenLi[i].unit,
						left + this.itemPadding(),
						top + h + idx * lh + 26
					);
				}

				for (var i = 28; i < 35; i++) {
					var col = 23;
					var row = i;
					var h = 40;
					var lh = 27;
					var top = lh * 15 + 2 * 2;
					var left = 314;

					var idx = i - 28;

					var var_num = keikenLi[i][`var_${ac_name}`] || 0;

					draw_item(
						this,
						keikenLi[i].name,
						//$gameVariables.value(keikenLi[i][`var_${ac_name}`]) || 0,
						$gameVariables.value(var_num) - (var_bf[var_num - var_start] || 0),
						keikenLi[i].unit,
						left + this.itemPadding(),
						top + h + idx * lh + 26
					);
				}

				for (var i = 35; i < 41; i++) {
					var col = 23;
					var row = i;
					var h = 40;
					var lh = 27;
					var top = lh * 3;
					var left = 314 * 2;

					var idx = i - 35;

					var var_num = keikenLi[i][`var_${ac_name}`] || 0;

					draw_item(
						this,
						keikenLi[i].name,
						//$gameVariables.value(keikenLi[i][`var_${ac_name}`]) || 0,
						$gameVariables.value(var_num) - (var_bf[var_num - var_start] || 0),
						keikenLi[i].unit,
						left + this.itemPadding(),
						top + h + idx * lh + 26
					);
				}

				for (var i = 41; i < 49; i++) {
					var col = 23;
					var row = i;
					var h = 40;
					var lh = 27;
					var top = lh * 10 + 2;
					var left = 314 * 2;

					var idx = i - 41;

					var var_num = keikenLi[i][`var_${ac_name}`] || 0;

					draw_item(
						this,
						keikenLi[i].name,
						//$gameVariables.value(keikenLi[i][`var_${ac_name}`]) || 0,
						$gameVariables.value(var_num) - (var_bf[var_num - var_start] || 0),
						keikenLi[i].unit,
						left + this.itemPadding(),
						top + h + idx * lh + 26
					);
				}
			}
		} else {
			this.width = 0;
			this.height = 0;
			this.t = 0;
			this.CBR_drawn = false;
		}
	};
})();
