//=============================================================================
// MUR Info Box 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_INFOBOX = true;

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

/*:
 * @plugindesc v2.0 Info Box
 * @author MUR
 * @help Отображает информацию о событии (получено/утерено: золото, оружие предметы итд)
 *
 */

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

MUR.INFOBOX.width = 816;
MUR.INFOBOX.height = 624;
MUR.INFOBOX.distance = 60;
MUR.INFOBOX.moneyIconId = 9;
MUR.INFOBOX.expIconId = 1;
MUR.INFOBOX.hpIconId = 1;
MUR.INFOBOX.mpIconId = 1;
MUR.INFOBOX.tpIconId = 1;

MUR.INFOBOX.titleWait = 300;
MUR.INFOBOX.step = 16;
MUR.INFOBOX.iconPosX = 35;
MUR.INFOBOX.iconPosY = 15; //20;
MUR.INFOBOX.textPosX1 = 80; //74;
MUR.INFOBOX.textPosY1 = 5;
MUR.INFOBOX.textPosX2 = 80; //74;
MUR.INFOBOX.textPosY2 = 28;

MUR.INFOBOX.textColorAdd = "rgba(0, 150, 0, 1.0)";
MUR.INFOBOX.textColorRemove = "rgba(150, 0, 0, 1.0)";
MUR.INFOBOX.textColorAddK = "rgba(0, 255, 0, 1.0)";
MUR.INFOBOX.textColorRemoveK = "rgba(255, 0, 0, 1.0)";

MUR.INFOBOX.imagePlusS = ImageManager.loadBitmap('img/system/', 'mapItemsGreenStart', null, true);
MUR.INFOBOX.imagePlusM = ImageManager.loadBitmap('img/system/', 'mapItemsGreenBg', null, true);
MUR.INFOBOX.imagePlusE = ImageManager.loadBitmap('img/system/', 'mapItemsGreenEnd', null, true);

MUR.INFOBOX.imagePlusSK = ImageManager.loadBitmap('img/system/', 'mapItemsGreenStart!', null, true);
MUR.INFOBOX.imagePlusMK = ImageManager.loadBitmap('img/system/', 'mapItemsGreenBg!', null, true);
MUR.INFOBOX.imagePlusEK = ImageManager.loadBitmap('img/system/', 'mapItemsGreenEnd!', null, true);

MUR.INFOBOX.imageMinusS = ImageManager.loadBitmap('img/system/', 'mapItemsRedStart', null, true);
MUR.INFOBOX.imageMinusM = ImageManager.loadBitmap('img/system/', 'mapItemsRedBg', null, true);
MUR.INFOBOX.imageMinusE = ImageManager.loadBitmap('img/system/', 'mapItemsRedEnd', null, true);

MUR.INFOBOX.imageMinusSK = ImageManager.loadBitmap('img/system/', 'mapItemsRedStart!', null, true);
MUR.INFOBOX.imageMinusMK = ImageManager.loadBitmap('img/system/', 'mapItemsRedBg!', null, true);
MUR.INFOBOX.imageMinusEK = ImageManager.loadBitmap('img/system/', 'mapItemsRedEnd!', null, true);

MUR.INFOBOX.needReDraw = false;
MUR.INFOBOX.msgList = [];
MUR.INFOBOX.sceneMap = undefined;
MUR.INFOBOX.enable = true;

var _MurInfoBox_Scene_Map_createDisplayObjects = Scene_Map.prototype.createDisplayObjects;
Scene_Map.prototype.createDisplayObjects = function() {
	_MurInfoBox_Scene_Map_createDisplayObjects.call(this);
	this.createInfoBox();
}

Scene_Map.prototype.createInfoBox = function() {
	MUR.INFOBOX.sceneMap = this;
	MUR.INFOBOX.self = new InfoBox();
	this.addChild(MUR.INFOBOX.self);
};

var _MurInfoBox_Scene_Base_popScene = Scene_Base.prototype.popScene;
Scene_Base.prototype.popScene = function() {
    _MurInfoBox_Scene_Base_popScene.call(this);
    // Если вызывалась какая-то другая сцена и мы вернулись, нужно принудительно перерисовать
    MUR.INFOBOX.needReDraw = true;
};

// Что бы не показывалось при смене экипировки
var _Game_Actor_tradeItemWithParty = Game_Actor.prototype.tradeItemWithParty;
Game_Actor.prototype.tradeItemWithParty = function(newItem, oldItem) {
	MUR.INFOBOX.enable = false;
	var result = _Game_Actor_tradeItemWithParty.call(this, newItem, oldItem);
	MUR.INFOBOX.enable = true;
	return result;
}

// Change Items/Weapons/Armors
var _MurInfoBox_Game_Party_gainItem = Game_Party.prototype.gainItem;
Game_Party.prototype.gainItem = function(item, amount, includeEquip) {
	_MurInfoBox_Game_Party_gainItem.call(this, item, amount, includeEquip);
	if (item) {
		var itemType = '?';
		if (item.itypeId) {
			itemType = 'i';
			if (item.itypeId == 2) { itemType = 'k'; }
		} else if (item.wtypeId) {
			itemType = 'w';
		} else if (item.atypeId) {
			itemType = 'a';
		}
		if (MUR.INFOBOX.enable)	MUR.INFOBOX.self.addMsg(amount > 0 ? '+' : '-', itemType, item.id)
	}
}

// Change Gold
var _MurInfoBox_Game_Party_gainGold = Game_Party.prototype.gainGold;
Game_Party.prototype.gainGold = function(amount) {
	_MurInfoBox_Game_Party_gainGold.call(this, amount);
	MUR.INFOBOX.self.addMsg(amount > 0 ? '+' : '-', 'm', amount)
}

function InfoBox() {
	this.initialize.apply(this);
	this.contentsOpacity = 0;
}

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

InfoBox.prototype.standardPadding = function() {
	return 0;
};

InfoBox.prototype._refreshFrame = function(type) {
}

InfoBox.prototype.windowWidth = function() {
	return MUR.INFOBOX.width;
};

InfoBox.prototype.windowHeight = function() {
	return MUR.INFOBOX.height;
};

InfoBox.prototype.update = function() {
	this.contents.clear();
	for (var i=0; i < MUR.INFOBOX.msgList.length; i++ ) {
		if (MUR.INFOBOX.msgList[i].showEnable) {
			if (MUR.INFOBOX.needReDraw) {
				MUR.INFOBOX.self.removeChild(MUR.INFOBOX.msgList[i]);
				MUR.INFOBOX.self.addChild(MUR.INFOBOX.msgList[i]);
			}
			MUR.INFOBOX.msgList[i].update();
		} else {
			MUR.INFOBOX.self.removeChild(MUR.INFOBOX.msgList[i]);

			delete MUR.INFOBOX.msgList[i];
			
			for (var j=i+1; j < MUR.INFOBOX.msgList.length; j++) {
				MUR.INFOBOX.msgList[j].move(
					MUR.INFOBOX.msgList[j].x,
					MUR.INFOBOX.msgList[j].y - MUR.INFOBOX.distance,
					MUR.INFOBOX.msgList[j].width,
					MUR.INFOBOX.msgList[j].height);
			}
		}
	}
	var tmpArray = [];
	for (var i=0; i < MUR.INFOBOX.msgList.length; i++ ) {
		if (MUR.INFOBOX.msgList[i] != undefined) {
			tmpArray.push(MUR.INFOBOX.msgList[i]);
		}
	}
	MUR.INFOBOX.msgList = tmpArray;
	MUR.INFOBOX.needReDraw = false;
};

InfoBox.prototype.getMetric = function(value) {
	var str = "единиц";
	if (value == 1) {
		str = "единицу";	
	} else if (value > 1 && value < 5) {
		str = "единицы";
	} else {
		str = "единиц";
	}
	return str;
}

InfoBox.prototype.addMsg = function(sign, type, arg) {
	var bitmapS = MUR.INFOBOX.imagePlusS;
	var bitmapM = MUR.INFOBOX.imagePlusM;
	var bitmapE = MUR.INFOBOX.imagePlusE;

	var textColor = MUR.INFOBOX.textColorAdd;
	var firstLine = 'получен';
	var swapTextLines = false;

	if (sign == '-') {
		bitmapS = MUR.INFOBOX.imageMinusS;
		bitmapM = MUR.INFOBOX.imageMinusM;
		bitmapE = MUR.INFOBOX.imageMinusE;

		firstLine = 'утрачен';
		textColor = MUR.INFOBOX.textColorRemove;
	}

	var typeName = '';
	var itemId = arg;
	var iPath = {i:'items', w:'weapons', a:'armors', k:'items'}

	var iconsBitmap;
	if (type == 'm') {
		iconsBitmap = ImageManager.loadBitmap('img/icons/money/42x42/', '1', null, true);

	} else {
		iconsBitmap = ImageManager.loadBitmap('img/icons/' + iPath[type] + '/42x42/', itemId, null, true);
	}

	switch (type) {
		// предмет
		case 'i':
			typeName = ' предмет';
			secondLine = $dataItems[itemId].name;
			break;
		// оружие
		case 'w':
			typeName = 'о оружие';
			secondLine = $dataWeapons[itemId].name;
			break;
		// броня
		case 'a':
			typeName = 'а экипировка';
			secondLine = $dataArmors[itemId].name;
			break;
		// важный предмет
		case 'k':
			typeName = ' важный предмет';
			bitmapS = MUR.INFOBOX.imagePlusSK;
			bitmapM = MUR.INFOBOX.imagePlusMK;
			bitmapE = MUR.INFOBOX.imagePlusEK;
			secondLine = $dataItems[itemId].name;
			textColor = MUR.INFOBOX.textColorAddK;
			if (sign == '-') {
				bitmapS = MUR.INFOBOX.imageMinusSK;
				bitmapM = MUR.INFOBOX.imageMinusMK;
				bitmapE = MUR.INFOBOX.imageMinusEK;
				textColor = MUR.INFOBOX.textColorRemoveK;
			}
			break;
		// деньги
		case 'm':
			typeName = 'ы деньги';
			secondLine = itemId + ' монет'
			if (itemId == 1 || itemId == -1) {
				secondLine += 'а';
			} else if ((itemId > 1 && itemId < 5) || (itemId < -1 && itemId > -5)) {
				secondLine += 'ы';
			}
			if (itemId > 0) {
				secondLine = "+" + secondLine;
			}
			break;
		// навык
		case 's':				
			firstLine = args[2];
			if (args[0] == '+') {
				firstLine += ' получает навык';
			} else {
				firstLine += ' теряет навык';
			}
			secondLine = $dataSkills[args[3]].name;					
			break;
		// группа
		case 'p':
			firstLine = $dataActors[itemId].name;
			if (args[0] == '-') {
				secondLine = 'покидает группу';
			} else {
				secondLine = 'присоединяется к группе';
			}
			swapTextLines = true;
			break;
		// опыт
		case 'e':
			firstLine = type;
			if (sign == '+') {
				firstLine += ' получает опыт';
			} else {
				firstLine += ' теряет опыт';
			}
			secondLine = arg + ' ' + this.getMetric(arg);
			break;
		// состояние
		case 'st':				
			firstLine = type;
			if (sign == '+') {
				firstLine += ' в состоянии';
			} else {
				firstLine += ' больше не в состоянии';
			}
			secondLine = "«" + $dataStates[args[3]].name + "»";
			break;
		// hp
		case 'hp':				
			firstLine = type;
			if (sign == '+') {
				firstLine += ' чувствует увеличение hp';
			} else {
				firstLine += ' чувствует уменьшение hp';
			}
			secondLine = "на " + arg + " " + this.getMetric(arg);
			break;
		// mp
		case 'mp':				
			firstLine = type;
			if (sign == '+') {
				firstLine += ' чувствует увеличение mp';
			} else {
				firstLine += ' чувствует уменьшение mp';
			}
			secondLine = "на " + arg + " " + this.getMetric(arg);
			break;
		// tp
		case 'tp':				
			firstLine = type;
			if (sign == '+') {
				firstLine += ' чувствует увеличение tp';
			} else {
				firstLine += ' чувствует уменьшение tp';
			}
			secondLine = "на " + arg + " " + this.getMetric(arg);
			// icon = MUR.INFOBOX.tpIconId;
			break;
		// параметры
		// case 'param':				
		// 	// firstLine = args[2];
		// 	firstLine = type;
		// 	// var pName = paramNames[args[4]];
		// 	// if (args[0] == '+') {
		// 	if (sign == '+') {
		// 		firstLine += ' повышает ' + pName;
		// 		icon = 2480 + args[4];
		// 	} else {
		// 		firstLine += ' снижает ' + pName;
		// 		icon = 2496 + args[4];
		// 	}
		// 	secondLine = "на " + args[3] + " " + edinica(args[3]);
		// 	break;
		default:
			typeName = '';
	}
	firstLine = firstLine + typeName;

	iconsBitmap.addLoadListener(function(bitmapS, bitmapM, bitmapE, iconsBitmap, firstLine, secondLine, swapTextLines, sign) {

		var index = MUR.INFOBOX.msgList.length;
		MUR.INFOBOX.msgList[index] = new InfoBoxWindow(
			0,
			0 + MUR.INFOBOX.distance * index,
			MUR.INFOBOX.width,
			70,
			bitmapS, bitmapM, bitmapE,
			iconsBitmap,
			firstLine,
			secondLine,
			swapTextLines,
			sign);

		setTimeout(function() {
			MUR.INFOBOX.self.addChild(MUR.INFOBOX.msgList[index]);
			MUR.INFOBOX.msgList[index].start();
		}, index*70);

	}.bind(this, bitmapS, bitmapM, bitmapE, iconsBitmap, firstLine, secondLine, swapTextLines, sign));
}

//---------------------------------------
	
function InfoBoxWindow(x,y, width, height, bitmapS, bitmapM, bitmapE, iconsBitmap, firstLine, secondLine, swapTextLines, sign) {
	this.sign = sign;
	this.initialize.apply(this, [x,y, width, height]);
	this.spr = new Sprite();
	MUR.setfont(this.contents, 's', 'red');
	var line1w = this.textWidth(firstLine, 0, 0);
	MUR.setfont(this.contents, 'm', 'white');
	var line2w = this.textWidth(secondLine, 0, 0);

	var middleWidth = Math.ceil(Math.max(line1w, line2w)) + 46;

	var allWidth = bitmapS.width + middleWidth + bitmapE.width;
	this.spr.bitmap = new Bitmap(allWidth, bitmapS.height);
	this.spr.bitmap.blt(bitmapS, 0, 0, bitmapS.width, bitmapS.height, 0, 0);
	this.spr.bitmap.blt(bitmapM, 0, 0, bitmapM.width, bitmapM.height, bitmapS.width, 0, middleWidth, bitmapM.height);
	this.spr.bitmap.blt(bitmapE, 0, 0, bitmapE.width, bitmapE.height, allWidth-bitmapE.width, 0);

	this.spr.x = 0;
	this.spr.y = 0;
	this.spr.opacity = 0;
	this.addChildToBack(this.spr);
	
	this.currentWait = MUR.INFOBOX.titleWait;
	this.step = MUR.INFOBOX.step;
	this.iconsBitmap = iconsBitmap;
	this.firstLine = firstLine;
	this.secondLine = secondLine;
	this.swapTextLines = swapTextLines;
	
	this.showEnable = true;
	this.width = width;
	this.height = height;

	this.contents.blt(this.iconsBitmap, 0, 0, 42, 42, MUR.INFOBOX.iconPosX, MUR.INFOBOX.iconPosY);	
	
	if (this.sign != '-') {
		MUR.setfont(this.contents, 's', 'green');
	} else {
		MUR.setfont(this.contents, 's', 'red');
	}

	this.drawText(this.firstLine, MUR.INFOBOX.textPosX1, MUR.INFOBOX.textPosY1);
	if (this.contents.changeSFont) this.contents.changeSFont(7);
	this.drawText(this.secondLine, MUR.INFOBOX.textPosX2, MUR.INFOBOX.textPosY2);

	this._start = false;
}

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

InfoBoxWindow.prototype.start = function() {
	this._start = true;
}

InfoBoxWindow.prototype._refreshBack = function() {
	// не отрисовывать фон окна
}

InfoBoxWindow.prototype.standardPadding = function() {
	return 0;
};

InfoBoxWindow.prototype._refreshFrame = function(type) {
	// не отрисовывать рамку окна
}

InfoBoxWindow.prototype.windowWidth = function() {
	return this.width;
};

InfoBoxWindow.prototype.windowHeight = function() {
	return this.height;
};

InfoBoxWindow.prototype.update = function() {
	// this.contents.clear();
	if (this._start) {
		this.contentsOpacity += this.step;
		this.spr.opacity += this.step;
		if (this.spr.opacity >= 255) {
			if (this.currentWait == 0) {
				this.step *= -1;
				this.currentWait = MUR.INFOBOX.titleWait;
			} else {
				this.currentWait--;
			}
		} else if (this.spr.opacity <= 0) {
			this.showEnable = false;
			this.removeChild(this.spr);
		}
	}
};
