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

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

(function () {
	// ########################################################
	// ################### 開発セレクト ######################
	// ########################################################
	Window_EroStatus_kaihatu_select.prototype = Object.create(Window_Selectable.prototype);
	Window_EroStatus_kaihatu_select.prototype.constructor = Window_EroStatus_kaihatu_select;

	Window_EroStatus_kaihatu_select.prototype.initialize = function (rect) {
		Window_Selectable.prototype.initialize.call(this, rect);
		this._additionalSprites = {};
		//最初に0番目って指定、commandではデフォでやってるけど

		// デフォではアクティブに
		this.makeList();
		this.select(0);
		this.activate();

		this.disp_list = {
			kou: {
				sira: [
					"キスにはあまり興味がない。\n好きな人が相手なら、嫌ではないと\n思うが……。",
					"口を使った行為も悪くないのではと\n最近思い始めてきている……。",
					"口でする行為だが、テクニックが\n身についてきたのではないかと\n自負している。",
					"舌技にはかなり自信がある。\nディープキスでもフェラチオでも\nなんだって大歓迎だ。"
				],
				yozu: [
					"キスとか、あとお口を使ったエッチな\nこととか、してみたいって思ったこと\nないなぁ。",
					"お口を使ったプレイって、嫌いって\nわけじゃないんだけど、進んでシたい\nとは思わないかな。",
					"わたし、唇ってけっこう敏感なの\nかな？　刺激されると、身体が\n火照ってきちゃうんだよね……。",
					"わたしの舌使いって、けっこうエロい\nって言われる。相手が満足してくれる\nんだったら、それもいいかも。"
				]
			},
			tibu: {
				sira: [
					"胸を触られるのは好きではない。\nそれは相手が女性でも同じこと。",
					"胸が少し敏感になったというか、\n触れると妙な気分になってしまう。",
					"私はこんなに胸が敏感だっただろう\nか？　触れられるの好きではなかった\nはずなのだが……。",
					"乳房はものすごく感じてしまうんだ。\n少し触れられただけでも、乳首が\n勃ってしまうようになった……。"
				],
				yozu: [
					"おっぱい大きくてうらやましいって\n言われるけど、訓練とかの邪魔になる\nし、肩は凝るしいいものじゃない。",
					"おっぱいを触ると、感じるように\nなってきちゃったんだよね……。",
					"おっぱい、すごく敏感なのかも。\n触られると、気持ちよくなっちゃう。",
					"ヤバイ……おっぱい、感じ過ぎちゃう\nようになっちゃった。ちょっと触れた\nだけで乳首ビンビンになっちゃう。"
				]
			},
			man: {
				sira: [
					"アソコは、触れば多少感じることは\nあるが、あまり触れたいとは\n思えないな。",
					"以前よりも、膣がすごく敏感に\nなって濡れやすくなった気がする。",
					"オマンコでかなり感じるように\nなってしまった。触れただけでも、\nビショビショに濡れてしまう……。",
					"オマンコ、ものすごく敏感になって\nしまってて、刺激を与えられたら、\nすぐにイキそうになってしまう。"
				],
				yozu: [
					"感じなくはないんだけど、\nデリケートところだし、あまり刺激を\n与えたくないかも。",
					"触ってると気持ちいいし、イけるよう\nにもなってきた。",
					"オマンコ、すごく濡れやすくなっ\nちゃったかも。どんどん敏感になって\nいる気がする。",
					"エッチなことを想像しただけで、\nぐちょぐちょになっちゃう。ウズウズ\nしてたまんないよぉ。"
				]
			},
			ana: {
				sira: [
					"は……？　尻を使ったプレイ……？\nさすがに考えたくもないな。",
					"尻穴に触れると、なんだが変な感じが\nするようになってしまった。",
					"尻穴でかなり感じるようになって\nしまった。アブノーマルなことって\nわかってはいるのだが……。",
					"尻穴がずっとウズウズしっぱなしで\n落ち着かない。これまで、さすがに\n色々とヤりすぎてしまったか……。"
				],
				yozu: [
					"お尻でするプレイがあるのは、\n知ってるけど……さすがに無理だよ。",
					"お尻の穴、ちょっとだけだけど、\n気持ちよくなれるようになってきた\nかも……。",
					"お尻の穴、すっごく感じちゃう。\n弄られたら、それだけで気持ちよく\nなってしまうし……。",
					"最近、お尻の穴が緩くなってきた。\nやっぱ弄りすぎだよね？　ガマン\nしようとは思うんだけど無理っぽい。"
				]
			},
			hou: {
				sira: [
					"好きな相手でもできれば、してやり\nたいと思うかもしれないが……。",
					"誰かを性的に気持ちよくさせるのは\n悪くない。積極的にしたいとは\n思わないが……。",
					"性的な奉仕をしてやると、相手が\n気持ちよくなってくれて、その顔を\n見るとゾクゾクする。",
					"手や乳房などを駆使して、性的な刺激\nを与えると相手が喜んでくれる。\nそれを見ているだけで興奮する。"
				],
				yozu: [
					"好きになった人が相手なら、\nエッチなことでもシてあげたいって\n思うかも……。",
					"エッチなことをシてあげると、\n気持ちよさそうにしてくれる。それが\n嬉しいって思えるようになった。",
					"エッチなことで気持ちよくするのって\nけっこう好きかも。相手が喜んでくれ\nると、わたしも興奮しちゃう。",
					"エッチなご奉仕って、わたし、\nすごく好きなんだ。相手のエッチな\n顔見ていると満足感がすごいんだよ。"
				]
			},
			rosyu: {
				sira: [
					"いや、風呂ならともかく人前で裸に\nなるとかありえないだろう。",
					"裸を見られると、身体が熱くなると\nいうか、エロい気持ちになってしまう\nのはどういうことなのだろうか？",
					"裸でいると興奮するようになったし\nジロジロ見られるのもたまらない。\n私にこんな性癖があったとはな。",
					"私の裸を見た者が興奮してくれると\nゾクゾクしてたまらない。見られて\nいるだけで気持ちが昂ぶってしまう。"
				],
				yozu: [
					"誰かに肌を見せるのって、けっこう\n抵抗あるかも……。",
					"裸を見られると、恥ずかしいんだけど\nそれだけじゃなくて……。どう言って\nいいかわからない気持ちになる。",
					"最近、ここで裸になったら、どう\nなっちゃうんだろう？って妄想する\nようになった。露出癖あるのかな？",
					"服を脱いで裸になって、色んな人に\nジロジロ見られたいって思っちゃう。\nすごく興奮しちゃうんだよ。"
				]
			},
			sou: {
				sira: [
					"エロいことには全く興味がない。\n私には関係のないことだ。",
					"少しずつではあるが、エロいことに\n興味がわいてきた。年頃の女が抱く\n感情としてはごく普通だと思うが。",
					"私ってけっこうエロい女のかも\n知れないな。性的な行為をここまで\n好きになってしまうとは……。",
					"ふとした瞬間にエロいことを考えて\nしまう。頭の中はチンポのことで\nいっぱいだ。"
				],
				yozu: [
					"エッチなことかぁ……わたしには、\nまだまだ早いって思うんだよね。",
					"わたしも年頃の女の子だし、エッチな\nことに興味がないってわけじゃないん\nだけど……。",
					"エッチなことを知れば知るほど、\n好きになってきた。わたし、こんなに\nエッチな子だったんだ……。",
					"ちょっと気を抜くと、すぐにエッチな\nことをしたくなっちゃう。身体の奥が\n疼いてたまんないよぉ……。"
				]
			}
		};
	};

	Window_EroStatus_kaihatu_select.prototype.numVisibleRows = function () {
		return 5;
	};
	Window_EroStatus_kaihatu_select.prototype.lineHeight = function () {
		return 84;
	};

	Window_EroStatus_kaihatu_select.prototype.makeList = function () {
		this._list = [
			{
				text: "口淫開発度",
				id: "kou",
				sira: { rank: 246, exp: 253 },
				yozu: { rank: 326, exp: 333 }
			},
			{
				text: "乳房開発度",
				id: "tibu",
				sira: { rank: 247, exp: 254 },
				yozu: { rank: 327, exp: 334 }
			},
			{
				text: "オマンコ開発度",
				id: "man",
				sira: { rank: 248, exp: 255 },
				yozu: { rank: 328, exp: 335 }
			},
			{
				text: "アナル開発度",
				id: "ana",
				sira: { rank: 249, exp: 256 },
				yozu: { rank: 329, exp: 336 }
			},
			{
				text: "奉仕開発度",
				id: "hou",
				sira: { rank: 251, exp: 258 },
				yozu: { rank: 331, exp: 338 }
			},
			{
				text: "露出開発度",
				id: "rosyu",
				sira: { rank: 250, exp: 257 },
				yozu: { rank: 330, exp: 337 }
			},
			{
				text: "淫乱度",
				id: "sou",
				sira: { rank: 245, exp: 252 },
				yozu: { rank: 325, exp: 332 }
			}
		];
	};

	Window_EroStatus_kaihatu_select.prototype.maxItems = function () {
		return this._list.length || 0;
	};

	Window_EroStatus_kaihatu_select.prototype.setViewWindow = function (viewWindow) {
		this._viewWindow = viewWindow;
	};

	//右のウィンドウにデータを渡す
	Window_EroStatus_kaihatu_select.prototype.callUpdateHelp = function () {
		if (this.active && this._viewWindow) {
			this.updateHelp();
		}
	};

	// ok押すとここも実行される
	Window_EroStatus_kaihatu_select.prototype.processOk = function () {
		if (this.isCurrentItemEnabled()) {
			this.callOkHandler();
		}
	};

	Window_EroStatus_kaihatu_select.prototype.do_ok = function () {
		var actor = $gameParty.menuActor();
		var chara = actor.name() == "Shirayuki" ? "sira" : "yozu";
		// D→0 A→3
		const info = this._list[this.index()];
		var rank_num = $gameVariables.value(info[chara].rank);
		var exp_val = $gameVariables.value(info[chara].exp);
		var keiken = [100, 350, 850, Infinity];

		if (exp_val >= keiken[rank_num]) {
			$gameVariables.setValue(info[chara].rank, rank_num + 1);

			AudioManager.playSe({ name: "Chime2", volume: 90, pitch: 100, pan: 0 });
			this.refresh();
			this._viewWindow.refresh();

			if (info.id == "sou") {
				var ary = ["exp0", "exp1", "exp2", "exp3"];

				if (chara == "sira") {
					var varNum = 245;

					if ($gameVariables.value(204) == 0) {
						var key = 10;
					} else {
						if ($gameVariables.value(204) == 1) {
							if ($gameSwitches.value(267)) {
								var key = 11;
							} else {
								key = 12;
							}
						} else if ($gameVariables.value(204) == 2) {
							var key = 10;
						} else if ($gameVariables.value(204) == 3) {
							var key = 11;
						}
					}
					// 表示された後妊娠描写をする
					if ($gameVariables.value(204) == 2 || $gameVariables.value(204) == 3) {
						SceneManager._scene.nin_flag = key;
					}
					// 	var key = 10; //"shirayuki_uniform_expression";
					// 	var key = 12; //"shirayuki_holdnaked_expression";
					// 	var key = 11; //"shirayuki_naked_expression";
				} else {
					var varNum = 325;
					if ($gameVariables.value(205) == 0) {
						var key = 13;
					} else {
						if ($gameVariables.value(205) == 1) {
							if ($gameSwitches.value(313)) {
								var key = 14;
							} else {
								var key = 15;
							}
						} else if ($gameVariables.value(205) == 2) {
							var key = 13;
						} else if ($gameVariables.value(205) == 3) {
							var key = 14;
						}
					}
					// 表示された後妊娠描写をする
					if ($gameVariables.value(205) == 2 || $gameVariables.value(205) == 3) {
						SceneManager._scene.nin_flag = key;
					}
					// 	var key = 13; //"yozuru_uniform_expression";
					// 	var key = 15; //"yozuru_holdnaked_expression";
					// 	var key = 14; //"yozuru_naked_expression";
				}
				SceneManager._scene.resetLive2d(key, ary[$gameVariables.value(varNum)]);
			}

			// ここでランクが上がるのでコモンイベント868（Ｈ称号習得処理）を実行
			const commonEvent = $dataCommonEvents[868];
			if (commonEvent) {
				const interpreter = new Game_Interpreter();
				interpreter.setup(commonEvent.list);
				interpreter.update();
			}
		} else {
			SoundManager.playBuzzer();
		}
	};
	Window_EroStatus_kaihatu_select.prototype.updateHelp = function () {
		this._viewWindow.setItem(this._list[this.index()]);
	};

	Window_EroStatus_kaihatu_select.prototype.drawItem = function (index) {
		const info = this._list[index];
		const rect = this.itemRectWithPadding(index);
		this.resetTextColor();
		//this.changePaintOpacity(this.isEnabled(savefileId));
		//this.drawTitle(savefileId, rect.x, rect.y + 4);
		//数値だったら
		//if (Number.isFinite(info)) {
		this.drawContents(info, rect);
		//}
	};

	Window_EroStatus_kaihatu_select.prototype.processNewLineS = function (textState) {
		textState.x = textState.startX;
		textState.y += textState.height - 60;
		textState.height = this.calcTextHeight(textState);
	};

	Window_EroStatus_kaihatu_select.prototype.drawContents = function (info, rect) {
		const bottom = rect.y + rect.height;
		this.changeTextColor("#000000");
		this.contents.fontFace = "serif";
		this.contents.fontSize = 22;
		this.drawTextM(info.text, 15, rect.y - 27, 400, "left");

		var actor = $gameParty.menuActor();
		var chara = actor.name() == "Shirayuki" ? "sira" : "yozu";
		this.changeTextColor("#FFFFFF");
		this.contents.fontSize = 16;

		// D→0 A→3
		var rank_num = $gameVariables.value(info[chara].rank);
		this.drawTextExS(this.disp_list[info.id][chara][rank_num], 30, rect.y + 4, 400, "left");

		var exp_val = $gameVariables.value(info[chara].exp);
		var ary = ["D", "C", "B", "A"];
		var keiken = [100, 350, 850, Infinity];

		this.contents.fontSize = 52;
		this.drawTextM(ary[rank_num], 328, rect.y + 14, 100, "left");

		this.changeTextColor("#000000");
		this.contents.fontSize = 14;
		if (exp_val >= keiken[rank_num]) {
			this.contents.blt(this.menu_rank_skin, 0, 0, 208, 26, 175, rect.y + 1);
			this.drawTextM("RANK UP！", 304, rect.y - 21, 100, "left");
		}
		this.drawTextM(`EXP：${Math.min(exp_val, 9999)}`, 194, rect.y - 21, 100, "left");

		this.placeGauge(actor, `ero_${info.id}`, rect.x + 180, rect.y - 10, info[chara]);
	};

	Window_EroStatus_kaihatu_select.prototype.placeGauge = function (actor, type, x, y, info) {
		const key = "actor%1-gauge-%2".format(actor.actorId(), type);
		const sprite = this.createInnerSprite(key, Sprite_Gauge_Kaihatu);
		sprite.setup(actor, type, info);
		sprite.move(x, y);
		sprite.show();
	};

	Window_EroStatus_kaihatu_select.prototype.createInnerSprite = function (key, spriteClass) {
		const dict = this._additionalSprites;
		if (dict[key]) {
			return dict[key];
		} else {
			const sprite = new spriteClass();
			dict[key] = sprite;
			this.addInnerChild(sprite);
			return sprite;
		}
	};

	// ################# カーソルの変更 ##################
	Window_EroStatus_kaihatu_select.prototype.updatePadding = function () {
		this.padding = 0;
	};
	Window_EroStatus_kaihatu_select.prototype.colSpacing = function () {
		return 0;
	};

	Window_EroStatus_kaihatu_select.prototype.refreshCursor = function () {
		if (this._cursorAll) {
			this.refreshCursorForAll();
		} else if (this.index() >= 0) {
			const rect = this.itemRect(this.index());
			this.setCursorRect(rect.x, rect.y, 190, 92);
		} else {
			this.setCursorRect(0, 0, 0, 0);
		}
	};

	Window_EroStatus_kaihatu_select.prototype.refreshCursorForAll = function () {
		const maxItems = this.maxItems();
		if (maxItems > 0) {
			const rect = this.itemRect(0);
			rect.enlarge(this.itemRect(maxItems - 1));
			this.setCursorRect(rect.x, rect.y, 190, 92);
		} else {
			this.setCursorRect(0, 0, 0, 0);
		}
	};

	Window_EroStatus_kaihatu_select.prototype.loadWindowskin = function () {
		this.windowskin = ImageManager.loadSystem("Window");
		this.menu_cursor_skin = ImageManager.loadSystem("menu_kaihatu_selected");
		this.menu_rank_skin = ImageManager.loadSystem("erost_kaihatu_rankup");
	};

	Window_EroStatus_kaihatu_select.prototype._refreshCursor = function () {
		const drect = this._cursorRect.clone();
		const srect = { x: 0, y: 0, width: 190, height: 92 };
		const m = 0;
		for (const child of this._cursorSprite.children) {
			child.bitmap = this.menu_cursor_skin;
		}
		this._setRectPartsGeometry(this._cursorSprite, srect, drect, m);
	};

	//未選択コマンドの背景を画像に
	Window_EroStatus_kaihatu_select.prototype.drawItemBackground = function (index) {};

	Window_EroStatus_kaihatu_select.prototype._refreshAllParts = function () {
		//this._refreshBack();
		// this._refreshFrame();
		this._refreshCursor();
		this._refreshArrows();
		this._refreshPauseSign();
	};

	// ########################################################
	// ################### 開発のビュー ######################
	// ########################################################
	Window_EroStatus_kaihatu_view.prototype = Object.create(Window_Base.prototype);
	Window_EroStatus_kaihatu_view.prototype.constructor = Window_EroStatus_kaihatu_view;

	Window_EroStatus_kaihatu_view.prototype.initialize = function (rect) {
		Window_Base.prototype.initialize.call(this, rect);
		this._list = [
			{
				id: "kou",
				sira: { rank: 246, exp: 253 },
				yozu: { rank: 326, exp: 333 }
			},
			{
				id: "man",
				sira: { rank: 248, exp: 255 },
				yozu: { rank: 328, exp: 335 }
			},
			{
				id: "hou",
				sira: { rank: 251, exp: 258 },
				yozu: { rank: 331, exp: 338 }
			},
			{
				id: "tibu",
				sira: { rank: 247, exp: 254 },
				yozu: { rank: 327, exp: 334 }
			},

			{
				id: "ana",
				sira: { rank: 249, exp: 256 },
				yozu: { rank: 329, exp: 336 }
			},
			{
				id: "rosyu",
				sira: { rank: 250, exp: 257 },
				yozu: { rank: 330, exp: 337 }
			}
		];

		this.refresh();
	};

	Window_EroStatus_kaihatu_view.prototype.setItem = function (data) {
		this._data = data;
		this.refresh();
	};

	Window_EroStatus_kaihatu_view.prototype._refreshAllParts = function () {
		//this._refreshFrame();
		this._refreshCursor();
		this._refreshArrows();
		this._refreshPauseSign();
		this._refreshBack();
	};

	Window_EroStatus_kaihatu_view.prototype.loadWindowskin = function () {
		this.windowskin = ImageManager.loadSystem("erost_kaihatu_waku");

		var list_0 = ["sira", "yozu"];
		var list_1 = ["kou", "man", "hou", "tibu", "ana", "rosyu"];
		var list_2 = ["a", "b", "c", "d"];

		this.erost_kai_icon = {
			sira: {},
			yozu: {}
		};

		for (var c = 0; c < 2; c++) {
			this.erost_kai_icon[list_0[c]] = {};
			for (var i = 0; i < 6; i++) {
				this.erost_kai_icon[list_0[c]][list_1[i]] = {};
				for (var k = 0; k < 4; k++) {
					this.erost_kai_icon[list_0[c]][list_1[i]][list_2[k]] = ImageManager.loadSystem(
						`erost_kai_${list_0[c]}_${list_1[i]}_${list_2[k]}`
					);
				}
			}
		}
	};

	Window_EroStatus_kaihatu_view.prototype._refreshBack = function () {
		const sprite = this._backSprite;
		sprite.bitmap = this._windowskin;
	};

	Window_EroStatus_kaihatu_view.prototype.refresh = function () {
		//const rect = this.baseTextRect();
		this.contents.clear();

		var actor = $gameParty.menuActor();
		var chara = actor.name() == "Shirayuki" ? "sira" : "yozu";

		var list_1 = ["kou", "man", "hou", "tibu", "ana", "rosyu"];
		var list_2 = ["a", "b", "c", "d"];

		var x1 = 3;
		var x2 = 635;
		var y1 = 57;
		var y2 = 274;
		var y3 = 490;
		var y4 = 60;
		var rectList = [
			{ x: x1, y: y1 },
			{ x: x1, y: y2 },
			{ x: x1, y: y3 },
			{ x: x2, y: y4 },
			{ x: x2, y: y2 },
			{ x: x2, y: y3 }
		];

		for (var i = 0; i < 6; i++) {
			var info = this._list[i][chara];
			// D→0 A→3
			var rank_num = $gameVariables.value(info.rank);
			var ary = ["d", "c", "b", "a"];

			var img = this.erost_kai_icon[chara][list_1[i]][ary[rank_num]];
			const bitmap = img;
			const pw = img.width;
			const ph = img.height;
			const sx = 0;
			const sy = 0;
			this.contents.blt(bitmap, sx, sy, pw, ph, rectList[i].x, rectList[i].y);
		}
	};

	// 背景（枠）を一番上のレイヤーにする
	Window_EroStatus_kaihatu_view.prototype._createAllParts = function () {
		this._createContainer();
		this._createFrameSprite();
		this._createClientArea();
		this._createContentsBackSprite();
		this._createCursorSprite();
		this._createContentsSprite();
		this._createArrowSprites();
		this._createPauseSignSprites();
		this._createBackSprite();
	};

	Window_EroStatus_kaihatu_view.prototype._createBackSprite = function () {
		this._backSprite = new Sprite();
		this._backSprite.addChild(new TilingSprite());
		this.addChild(this._backSprite);
	};
})();

function Sprite_Gauge_Kaihatu() {
	this.initialize(...arguments);
}
Sprite_Gauge_Kaihatu.prototype = Object.create(Sprite_Gauge.prototype);
Sprite_Gauge_Kaihatu.prototype.constructor = Sprite_Gauge_Kaihatu;

Sprite_Gauge_Kaihatu.prototype.bitmapWidth = function () {
	return 168;
};
Sprite_Gauge_Kaihatu.prototype.gaugeHeight = function () {
	return 11;
};

Sprite_Gauge_Kaihatu.prototype.currentValue = function () {
	if (this._battler) {
		switch (this._statusType) {
			case "hp":
				return this._battler.hp;
			case "ero_kou":
				return $gameVariables.value(this.expVar);
			case "ero_man":
				return $gameVariables.value(this.expVar);
			case "ero_hou":
				return $gameVariables.value(this.expVar);
			case "ero_tibu":
				return $gameVariables.value(this.expVar);
			case "ero_ana":
				return $gameVariables.value(this.expVar);
			case "ero_rosyu":
				return $gameVariables.value(this.expVar);
			case "ero_sou":
				return $gameVariables.value(this.expVar);
		}
	}
	return NaN;
};

Sprite_Gauge_Kaihatu.prototype.currentMaxValue = function () {
	if (this._battler) {
		var keiken = [100, 350, 850, 9999];
		switch (this._statusType) {
			case "hp":
				return this._battler.mhp;
			case "ero_kou":
				return keiken[$gameVariables.value(this.maxRankVar)];
			case "ero_man":
				return keiken[$gameVariables.value(this.maxRankVar)];
			case "ero_hou":
				return keiken[$gameVariables.value(this.maxRankVar)];
			case "ero_tibu":
				return keiken[$gameVariables.value(this.maxRankVar)];
			case "ero_ana":
				return keiken[$gameVariables.value(this.maxRankVar)];
			case "ero_rosyu":
				return keiken[$gameVariables.value(this.maxRankVar)];
			case "ero_sou":
				return keiken[$gameVariables.value(this.maxRankVar)];
		}
	}
	return NaN;
};

Sprite_Gauge_Kaihatu.prototype.setup = function (battler, statusType, info) {
	this._battler = battler;
	this._statusType = statusType;

	this.maxRankVar = info.rank || 0;
	this.expVar = info.exp || 0;

	this._value = this.currentValue();
	this._maxValue = this.currentMaxValue();

	this.updateBitmap();
};

Sprite_Gauge_Kaihatu.prototype.redraw = function () {
	this.bitmap.clear();
	const currentValue = this.currentValue();
	if (!isNaN(currentValue)) {
		this.drawGauge();
	}
};
