//=============================================================================
// MUR Window Decor v2.0
// Copyright (C) 2018,2019 MUR (https://github.com/murlab)
// BSD 3-Clause "New" or "Revised" License
// Free for use with both free and commercial RPG Maker games
//=============================================================================

var Imported = Imported || {};
Imported.MUR_WINDECOR = true;

var MUR = MUR || {};                // MUR's main object
MUR.WINDECOR = MUR.WINDECOR || {};  // Plugins's stuff

/*:
 * @plugindesc v2.0 Window Decor
 * @author MUR
 * @help Декорация окон
 *
 * @param msgWindow
 * @text Настройки окна сообщений
 *
 * @param enableWindowHeight
 * @parent msgWindow
 * @text Вносить изменения в высоту окна
 * @type boolean
 * @desc Разрешить изменять высоту окна сообщений
 * @default true
 * @on Разрешить
 * @off Высота по умолчанию
 *
 * @param msgWindowHeight
 * @parent msgWindow
 * @text Высота окна сообщений (px)
 * @type number
 * @desc Задать фиксированную высоту окна сообщений
 * @default 216
 *
 * @param msgWindow
 * @text Настройки рамки окна
 *
 * @param imgBorderFile
 * @parent msgWindow
 * @text Файл рамки окна
 * @desc Файл декораций окна
 * @default newWindow
 * @type file
 * @dir img/system
 * @require 1
 *
 * @param lWidth
 * @parent msgWindow
 * @type number
 * @text Ширина слева (px)
 * @desc Размер левого блока
 * @default 48
 *
 * @param cWidth
 * @parent msgWindow
 * @type number
 * @text Ширина центра (px)
 * @desc Размер центрального блока
 * @default 96
 *
 * @param rWidth
 * @parent msgWindow
 * @type number
 * @text Ширина справа (px)
 * @desc Размер правого блока
 * @default 48
 *
 * @param tHeight
 * @parent msgWindow
 * @type number
 * @text Высота верха (px)
 * @desc Размер вехнего блока
 * @default 48
 *
 * @param cHeight
 * @parent msgWindow
 * @type number
 * @text Высота центра (px)
 * @desc Размер центрального блока
 * @default 62
 *
 * @param bHeight
 * @parent msgWindow
 * @type number
 * @text Высота низа (px)
 * @desc Размер нижнего блока
 * @default 48
 *
 * @param bgPaddingH
 * @parent msgWindow
 * @type number
 * @text Фон отступ (гор., px)
 * @desc Размер горизонтального отступа для фонового изображения
 * @default 9
 *
 * @param bgPaddingV
 * @parent msgWindow
 * @type number
 * @text Фон отступ (верт., px)
 * @desc Размер вертикального отступа для фонового изображения
 * @default 15
 *
 * @param msgWindowName
 * @text Настройки имени персонажа
 *
 * @param imgNameFile
 * @parent msgWindowName
 * @text Файл таблички имени
 * @desc Файл таблички имени актёра
 * @default newWindowName
 * @type file
 * @dir img/system
 * @require 1
 *
 * @param namePosX
 * @parent msgWindowName
 * @type number
 * @text Позиция таблички имени X (px)
 * @desc X положение внутри окна сообщения
 * @default 0
 * @min -1024
 * @max 1024
 *
 * @param nameAlignH
 * @parent namePosX
 * @text Выравнивание таблички имени (гор.)
 * @desc X выравнивание положения внутри окна сообщения
 * @default center
 * @type select
 * @option Слева
 * @value left
 * @option Центр
 * @value center
 * @option Справа
 * @value right
 *
 * @param namePosY
 * @parent msgWindowName
 * @type number
 * @text Позиция таблички имени Y (px)
 * @desc Y положение внутри окна сообщения
 * @default 0
 * @min -1024
 * @max 1024
 *
 * @param nameAlignV
 * @parent namePosY
 * @text Выравнивание таблички имени (верт.)
 * @desc Y выравнивание положения внутри окна сообщения
 * @default center
 * @type select
 * @option Верх
 * @value top
 * @option Центр
 * @value center
 * @option Низ
 * @value bottom
 */

var params = PluginManager.parameters('MUR_WindowDecor');

MUR.WINDECOR.enableWindowHeight = params['enableWindowHeight'].toUpperCase()=="TRUE" ? true : false;
MUR.WINDECOR.msgWindowHeight = Number(params['msgWindowHeight']);

MUR.WINDECOR.imgBorderFile = params['imgBorderFile'];
MUR.WINDECOR.lWidth = Number(params['lWidth']);
MUR.WINDECOR.cWidth = Number(params['cWidth']);
MUR.WINDECOR.rWidth = Number(params['rWidth']);
MUR.WINDECOR.tHeight = Number(params['tHeight']);
MUR.WINDECOR.cHeight = Number(params['cHeight']);
MUR.WINDECOR.bHeight = Number(params['bHeight']);
MUR.WINDECOR.bgPaddingH = Number(params['bgPaddingH']);
MUR.WINDECOR.bgPaddingV = Number(params['bgPaddingV']);

MUR.WINDECOR.imgNameFile = params['imgNameFile'];
MUR.WINDECOR.namePosX = Number(params['namePosX']);
MUR.WINDECOR.nameAlignH = params['nameAlignH'];
MUR.WINDECOR.namePosY = Number(params['namePosY']);
MUR.WINDECOR.nameAlignV = params['nameAlignV'];

Window_Message.prototype.windowHeight = function() {
	var result = MUR.WINDECOR.msgWindowHeight;
	if (!MUR.WINDECOR.enableWindowHeight) {
		result = this.fittingHeight(this.numVisibleRows());
	}
	return result;
};

var _MurWinDecor_Scene_Boot_loadSystemWindowImage = Scene_Boot.prototype.loadSystemWindowImage;
Scene_Boot.prototype.loadSystemWindowImage = function() {
	_MurWinDecor_Scene_Boot_loadSystemWindowImage.call(this);
	ImageManager.reserveSystem(MUR.WINDECOR.imgBorderFile);
	ImageManager.reserveSystem(MUR.WINDECOR.imgNameFile);
};

var _MurWinDecor_Window_Base_loadWindowskin = Window_Base.prototype.loadWindowskin;
Window_Base.prototype.loadWindowskin = function() {
	_MurWinDecor_Window_Base_loadWindowskin.call(this);
	this.newWindowSkin = ImageManager.loadSystem(MUR.WINDECOR.imgBorderFile);
	this.nameWindowSkin = ImageManager.loadSystem(MUR.WINDECOR.imgNameFile);
};

Window.prototype._refreshBack = function() {
	var mH = MUR.WINDECOR.bgPaddingH;
	var mV = MUR.WINDECOR.bgPaddingV;
	var w = this._width - mH * 2;
	var h = this._height - mV * 2;
	var bitmap = new Bitmap(w, h);

	this._windowBackSprite.bitmap = bitmap;
	this._windowBackSprite.setFrame(0, 0, w, h);
	this._windowBackSprite.move(mH, mV);

	if (w > 0 && h > 0 && this._windowskin) {
		var p = 96;
		bitmap.blt(this._windowskin, 0, 0, p, p, 0, 0, w, h);
		for (var y = 0; y < h; y += p) {
			for (var x = 0; x < w; x += p) {
				bitmap.blt(this._windowskin, 0, p, p, p, x, y, p, p);
			}
		}
		var tone = this._colorTone;
		bitmap.adjustTone(tone[0], tone[1], tone[2]);
	}
};

Window.prototype._refreshFrame = function() {
	var w = this._width;
	var h = this._height;
	var m = 24;
	var bitmap = new Bitmap(w, h);

	this._windowFrameSprite.bitmap = bitmap;
	this._windowFrameSprite.setFrame(0, 0, w, h);

	if (w > 0 && h > 0 && this.newWindowSkin) {
		var skin = this.newWindowSkin;

		var lWidth = MUR.WINDECOR.lWidth;
		var cWidth = MUR.WINDECOR.cWidth;
		var rWidth = MUR.WINDECOR.rWidth;

		var tHeight = MUR.WINDECOR.tHeight;
		var cHeight = MUR.WINDECOR.cHeight;
		var bHeight = MUR.WINDECOR.bHeight;


		//слева верх (откуда → куда)
		bitmap.blt(skin, 0, 0, lWidth, tHeight, 0, 0, lWidth, tHeight);
		
		//справа верх
		bitmap.blt(skin, lWidth + cWidth, 0, rWidth, tHeight, w - rWidth, 0, rWidth, tHeight);
		
		//слева низ
		bitmap.blt(skin, 0, tHeight + cHeight, lWidth, bHeight, 0, h - bHeight, lWidth, bHeight);
		
		//справа низ
		bitmap.blt(skin, lWidth + cWidth, tHeight + cHeight, rWidth, bHeight, w - rWidth, h - bHeight, rWidth, bHeight);
		
		var countH = (w - lWidth - rWidth) / cWidth;
		var countV = (h - tHeight - bHeight) / cHeight;

		for (var i=0; i<countH; i++) {
			var cw = cWidth;
			if (lWidth + (cWidth*(i+1)) > w - rWidth) {
				cw = w - rWidth - lWidth - (cWidth*i); 
			}
			//центр верх
			bitmap.blt(skin, lWidth, 0, cWidth, tHeight, lWidth + (cWidth*i), 0, cw, tHeight);
			//центр низ
			bitmap.blt(skin, lWidth, tHeight + cHeight, cWidth, bHeight, lWidth + (cWidth*i), h - bHeight, cw, bHeight);
		}

		for (var i=0; i<countV; i++) {
			var ch = cHeight;
			if (tHeight + (cHeight*(i+1)) > h - bHeight) {
				ch = h - bHeight - tHeight - (cHeight*i); 
			}
			// центр слева
			bitmap.blt(skin, 0, tHeight, lWidth, cHeight, 0, tHeight + (cHeight * i), lWidth, ch);
			// центр справа
			bitmap.blt(skin, lWidth + cWidth, tHeight, rWidth, cHeight, w - rWidth, tHeight + (cHeight * i), rWidth, ch);
		}
	}

	if (this instanceof Window_Message && this.nameWindowSkin) {
		var skin = this.nameWindowSkin;
		var sWidth = skin.width;
		var sHeight = skin.height;

		var sX = MUR.WINDECOR.namePosX;
		var sY = MUR.WINDECOR.namePosY;

		switch(MUR.WINDECOR.nameAlignH) {
			case 'center':
				sX += (this._width - sWidth) / 2;
				break;
			case 'right':
				sX += this._width - sWidth;
				break;
		}
		switch(MUR.WINDECOR.nameAlignV) {
			case 'center':
				sY += (this._height - sHeight) / 2;
				break;
			case 'bottom':
				sY += this._height - sHeight;
				break;
		}

		//слева верх (откуда → куда)
		bitmap.blt(skin, 0, 0, sWidth, sHeight, sX, sY, sWidth, sHeight);
	}
};
