//=============================================================================
// MUR_Tools.js
//=============================================================================

/*:
* @plugindesc v1.1 Некоторые утилиты для работы
* @author Mur
*
*
*/

// var MUR = {};

var Imported = Imported || {};
var MUR = MUR || {};                // MUR's main object

function isInt(n){
	return Number(n) === n && n % 1 === 0;
}

function isFloat(n){
	return Number(n) === n && n % 1 !== 0;
}

// fix Sfont ///////////////////////////////
Bitmap.prototype.drawSFontTextBody = function(text, tx, ty) {
	var bitmap = ImageManager.loadSFont(this.sfont.name);
	bitmap.paintOpacity = this.paintOpacity;
	var bslash = false;
	var cmd = '';
	var arg = '';
	text.split("").forEach(function(glyph) {
		if (cmd == 'f') {
			if (glyph == ']') {
				bitmap = ImageManager.loadSFont(arg);
				cmd = '';
				arg = '';
			} else if (glyph != '[') {
				arg += glyph;
			}

		} else if (bslash) {
			cmd = glyph;
			arg = '';
			bslash = false;
		} else if (glyph == "\\") {
			bslash = true;
		} else {
			var value = this.sfont.values(glyph);
			this.blt(bitmap, value.x, value.y, value.width, value.height, tx, ty);
			tx += value.width;
		}
	}, this)
};

Bitmap.prototype.sfontWidth = function(text) {
	text = text.replace(/\\f\[\w+\]+?/g, '');
	var sfont = this.sfont;
	return text.split("").reduce(function(r, glyph) { 
		return r + sfont.values(glyph).width;
	}, 0);
};

///////////////////////////////

MUR.fonts = {
	n: {
		white: 1,
		yellow: 2,
		brown: 4,
		blue: 16,
		lazure: 17,
		red: 18,
		redbrick: 22,
		blue: 23,
		green: 24,
		grey: 25,
		violet: 26
	},
	m: {
		white: 7,
		yellow: 8,
		brown: 9,
		grey: 12,
		red: 14
	},
	s: {
		green: 5,
		red: 6,
		brown: 10,
		white: 11,
		grey: 13,
		yellow: 15,
		blue: 19,
		violet: 20,
		orange: 21,
		peach: 27
	}
}

MUR.setfont = function(c, size, color) {
	if (c.changeSFont) {
		c.changeSFont(MUR.fonts[size][color]);
	}
}

// (function() {
 MUR.dic = {
 	"slot":"Слот",
 	"equipFinishMsg":"Завершить",
 	"equipStatMsg":"~Экипировка~",
 	"equipStatMsgDis":"%n (%c). Сводные данные:",
 	"equipEmptyMsg":"Пустой слот",
 	"equipGradeMsg":"Класс",
 	"equipReqMsg":"~Ограничения~",
 	"equipReqWeaponMsg":"Требуется навык владения «%s»",
 	"equipReqArmorMsg":"Требуется навык ношения «%s»",
 	"equipReqSlotMsg":"Требуется слот экипировки «%s»",

 	"invMsg":"~Инвентарь~",
 	"statChangeMsg":"~Статы~",
 	gradeList: {
		ng:	'низкий',			// crude (сырой) / серый
		d:	'обычный',			// basic (основной) / белый
		c:	'надёжный',			// grand (великий) / зелёный
		b:	'раритетный',		// rare (раритет) / синий
		a:	'скрытый',			// arcane (скрытый) / фиолет
		s:	'героический',		// heroic (героический) / красный
		r1:	'эпический',		// epic (эпик) / желтый
		r2:	'легендарный'		// legendary (легендарый) / оранжевый
 	},

	"costMsg":"Расход очков",
	"weaponRestrictionMsg":"Требования",
	"andMsg":"и",
	"damageMsg":"Урон",
	"damageNormalMsg":"обычный",
	"damagePercentMsg":"Погрешность",
	"critMsg":"Крит",
	"effectsMsg":"~ Эффекты ~",
	"traitsMsg":"~ Особенности ~",
	"consumablesType":["","MP","TP"],
	"damageType":["","снимает HP","снимает MP","добавляет HP","добавляет MP","забирает HP","забирает MP"],
	"growList":[
		 {"note":"макс. здоровья"},
		 {"note":"макс. маны"},
		 {"note":"атаку"},
		 {"note":"защиту"},
		 {"note":"маг.атаку"},
		 {"note":"маг.защита"},
		 {"note":"ловкость"},
		 {"note":"удача"}
	 ],
	"buffList":[
		 {"note":"повышение макс. здоровья на %s%"},
		 {"note":"повышение макс. маны на %s%"},
		 {"note":"повышение атаки на %s%"},
		 {"note":"повышение защиты на %s%"},
		 {"note":"повышение маг. атаки на %s%"},
		 {"note":"повышение маг. защиты на %s%"},
		 {"note":"повышение ловкости на %s%"},
		 {"note":"повышение удачи на %s%"}
	],
	"debuffList":[
		 {"note":"снижение макс. здоровья на %s%"},
		 {"note":"снижение макс. маны на %s%"},
		 {"note":"снижение атаки на %s%"},
		 {"note":"снижение защиты на %s%"},
		 {"note":"снижение маг. атаки на %s%"},
		 {"note":"снижение маг. защиты на %s%"},
		 {"note":"снижение ловкости на %s%"},
		 {"note":"снижение удачи на %s%"}
	 ],
	"specialEffects":[{"note":"Появляется возможность сбежать"}],
	"hpNote":[{"note":"Восстановливает %s здоровья"}],
	"mpNote":[{"note":"Восстановливает %s маны"}],
	"tpNote":[{"note":"Восстановливает %s очков тактики"}],
	"addBuff":"Накладывает",
	"addDeBuff":"Накладывает",
	"removeBuff":"Снимает",
	"removeDeBuff":"Снимает",
	"grow":"Повышает",
	"addSkill":"Добавляет навык",
	"storage":"Инвентарь",
	"actorParams":[
											// Основные 8:
		"Здоровье",							// 0  - Max XP
		"Мана",								// 1  - Max MP
		"Физ. атака",						// 2  - Attack
		"Физ. защита",						// 3  - Defence
		"Маг. атака",						// 4  - M.Attack
		"Маг. защита",						// 5  - M.Defence
		"Ловкость",							// 6  - Agility
		"Удача",							// 7  - Luck
											// Дополнительные 10:
		"Шанс:\n  Попадания",				// 8  - hit rate
		"  Уклонения",						// 9  - evasion rate
		"  Крит. попадания",				// 10 - critical rate
		"  Крит. уклонения",				// 11 - critucal evasion
		"  Уклонения\n  от магии",			// 12 - magic evasion
		"Отражение магии",					// 13 - magic reflection
		"Контратака",						// 14 - counter attack
		"Регенерация:\n  здоровья",			// 15 - hp regeneration
		"  маны",							// 16 - mp regeneration
		"  очков тактики",					// 17 - tp regeneration
											// Специальные 10:
		"Шанс стать целью",					// 18 - target rate
		"Эффективность:\n  защиты",			// 19 - guard effect
		"  восстановления", 				// 20 - recovery effect
		"Фармакология",						// 21 - pharmacology
		"Стоимость маны",					// 22 - mp cost rate
		"Скорость зарядки\nочков тактики",	// 23 - tp charge rate
		"Получение:\n  физ. урона",			// 24 - physical damage
		"  маг. урона",						// 25 - magical damage
		"  от поверхности",					// 26 - floor damage
		"Получаемый опыт"					// 27 - experience
	],
	"paramsUpMsg":[
		{"note":"Макс.HP увеличен на +%s"},
		{"note":"Макс.MP увеличен на +%s"},
		{"note":"Атака увеличена на +%s"},
		{"note":"Защита увеличена на +%s"},
		{"note":"Маг.атака увеличена на +%s"},
		{"note":"Маг.защита увеличена на +%s"},
		{"note":"Ловкость увеличена на +%s"},
		{"note":"Удача увеличена на +%s"}
	],
	"paramsDownMsg":[
		{"note":"Макс.HP снижен на -%s"},
		{"note":"Макс.MP снижен на -%s"},
		{"note":"Атака снижена на -%s"},
		{"note":"Защита снижена на -%s"},
		{"note":"Маг.атака снижена на -%s"},
		{"note":"Маг.защита снижена на -%s"},
		{"note":"Ловкость снижена на -%s"},
		{"note":"Удача снижена на -%s"}
	],
	"elementRate":"Элемент",
	"debuffRate":"Ослабление",
	"stateRate":"Воздействие",
	"stateResist":"Cопротивление",
	"attackElement":"Атака элементом «%s»",
	"attackState":"Атака с наложением состояня «%s»",
	"attackSpeed":"Скорость атаки %s",
	"attackTimes":"Повторение атаки %s",
	"addSkillType":"Добавляет тип навыка «%s»",
	"sealSkillType":"Теряет тип навыка «%s",
	"addSkill":"Добавляет навык «%s»",
	"sealSkill":"Теряет навык «%s»",
	"equipWeapon":"Возможность использовать «%s»",
	"equipArmor":"Возможность одевать «%s»",
	"lockEquip":"Блокируется слот «%s»",
	"sealEquip":"Доступен слот «%s»",
	"slotType":"Использует слот «%s»",
	"actionTimes":"Повторяемость %s",
	"partyAbility":"Бонус группы %s",
	"exParametersList":[
		{"note":"+%s% шанс урона"},
		{"note":"+%s% шанс уклона"},
		{"note":"+%s% шанс критического урона"},
		{"note":"+%s% шанс критического уклона"},
		{"note":"+%s% шанс уклона от магии"},
		{"note":"Отражение магии +%s%"},
		{"note":"Контратака +%s%"},
		{"note":"Регенерация здоровья +%s%"},
		{"note":"Регенерация маны +%s%"},
		{"note":"Регенерация очков тактики +%s%"}
	],
	"spParametersList":[
		{"note":"Шанс стать целью *%s%"},
		{"note":"Эффективность защиты *%s%"},
		{"note":"Эффективность восстановления *%s%"},
		{"note":"Фармакология *%s%"},
		{"note":"Стоимость маны *%s%"},
		{"note":"Скорость зарядки очков тактики *%s%"},
		{"note":"Получение физического урона *%s%"},
		{"note":"Получение урона от магии *%s%"},
		{"note":"Получение урона от поверхности *%s%"},
		{"note":"Получение опыта *%s%"}
	],
	"slotTypesList":[
		{"note":"обычный"},
		{"note":"две руки"}
	],
	"collapseEffectsList":[
		{"note":"обычный"},
		{"note":"босс"},
		{"note":"немедленный"},
		{"note":"не исчезает"}
	],
	"specialFlagsList":[
		{"note":"автобой"},
		{"note":"оборона"},
		{"note":"заменитель"},
		{"note":"сохранение очков тактики"}
	],
	"partyAbilitysList":[
		{"note":"шанс стычки 50%"},
		{"note":"без стычек"},
		{"note":"без сюрпризов"},
		{"note":"упреждающий удар"},
		{"note":"двойное золото"},
		{"note":"двойные трофеи"}
	]
 };

MUR.effectsTypes = [];
MUR.effectsTypes[11] = ["", "MUR.dic['hpNote']", 100, ""];
MUR.effectsTypes[12] = ["", "MUR.dic['mpNote']", 100, ""];
MUR.effectsTypes[13] = ["", "MUR.dic['tpNote']", 1, ""];
MUR.effectsTypes[21] = ["", "$dataStates", 100, ""];
MUR.effectsTypes[22] = ["", "$dataStates", 100, ""];
MUR.effectsTypes[31] = [MUR.dic["addBuff"] + " ", "MUR.dic['buffList']", 0, ""];
MUR.effectsTypes[32] = [MUR.dic["addDeBuff"] + " ", "MUR.dic['debuffList']", 1, "на"];
MUR.effectsTypes[33] = [MUR.dic["removeBuff"] + " ", "MUR.dic['buffList']", 0, ""];
MUR.effectsTypes[34] = [MUR.dic["removeDeBuff"] + " ", "MUR.dic['debuffList']", 1, "на"];
MUR.effectsTypes[41] = ["", "MUR.dic['specialEffects']", 0, ""];
MUR.effectsTypes[42] = [MUR.dic["grow"] + " ", "MUR.dic['growList']", 1, "на"];
MUR.effectsTypes[43] = [MUR.dic["addSkill"], "$dataSkills", 0, ""];

MUR.traitsTypes = [];
MUR.traitsTypes[11] = [MUR.dic["elementRate"], "$dataSystem.elements"];
MUR.traitsTypes[12] = [MUR.dic["debuffRate"], "MUR.dic['debuffList']"];
MUR.traitsTypes[13] = [MUR.dic["stateRate"], "$dataStates"];
MUR.traitsTypes[14] = [MUR.dic["stateResist"], "$dataStates"];
MUR.traitsTypes[21] = ["", "MUR.dic['buffList']"];
MUR.traitsTypes[22] = ["", "MUR.dic['exParametersList']"];
MUR.traitsTypes[23] = ["", "MUR.dic['spParametersList']"];
MUR.traitsTypes[31] = [MUR.dic["attackElement"], "$dataSystem.elements"];
MUR.traitsTypes[32] = [MUR.dic["attackState"], "$dataStates"];
MUR.traitsTypes[33] = [MUR.dic["attackSpeed"], "[]"];
MUR.traitsTypes[34] = [MUR.dic["attackTimes"], "[]"];
MUR.traitsTypes[41] = [MUR.dic["addSkillType"], "$dataSystem.skillTypes"];
MUR.traitsTypes[42] = [MUR.dic["sealSkillType"], "$dataSystem.skillTypes"];
MUR.traitsTypes[43] = [MUR.dic["addSkill"], "$dataSkills"];
MUR.traitsTypes[44] = [MUR.dic["sealSkill"], "$dataSkills"];
MUR.traitsTypes[51] = [MUR.dic["equipWeapon"], "$dataSystem.weaponTypes"];
MUR.traitsTypes[52] = [MUR.dic["equipArmor"], "$dataSystem.armorTypes"];
MUR.traitsTypes[53] = [MUR.dic["lockEquip"], "$dataSystem.equipTypes"];
MUR.traitsTypes[54] = [MUR.dic["sealEquip"], "$dataSystem.equipTypes"];
MUR.traitsTypes[55] = [MUR.dic["slotType"], "MUR.dic['slotTypesList']"];
MUR.traitsTypes[61] = [MUR.dic["actionTimes"], "[]"];
MUR.traitsTypes[62] = ["", "MUR.dic['specialFlagsList']"];
MUR.traitsTypes[63] = ["", "MUR.dic['collapseEffectsList']"];
MUR.traitsTypes[64] = [MUR.dic["partyAbility"], "MUR.dic['partyAbilitysList']"];
