//=============================================================================
// MUR Parallax Maping v1.0
// by MUR (https:var github.com/murlab)
// BSD 3-Clause License
// Free for use with both free and commercial RPG Maker games.
//=============================================================================

 /*:en
 * @plugindesc v1.0 Parallax Maping
 * @author Mur
 * @help This plugin has no additional settings, and all management occurs
 * through the comments (Note) in the settings of the map:
 *
 * <parallax: filename layer> — sets the image filename as a graphics
 * layer(parallax), where layer is the layer number. Files are loaded from
 * the img\parallaxes\ image directory.
 *
 * You can specify several layers, for example, on layer 1, make the
 * main (background) image, and on layer 3, place a translucent with shadows.
 * When a character moves behind overlapping objects, he will be translucent
 * and you will see where he is.
 * 
 * For example:
 * <parallax: bgMap 1>
 * <parallax: fgMap 3>
 */
 
 /*:ru
 * @plugindesc v1.0 Параллакс мапинг
 * @author Mur
 * @help Данный плагин не имеет дополнительных настроек, а всё управление происходит
 * через комментарии (Note) в настойках карты:
 *
 * <parallax: filename layer> — устанавливает изображение filename в качестве
 * слоя графики (параллакс), где layer номер слоя. Файлы подгружаются из директории
 * с изображаениями img\parallaxes\
 *
 * Можно задать несколько слоёв, например на слое 1 сделать основное (фоновое) 
 * изображение, а на 3 слое разместить полупрозрачное с тенями. Когда персонаж
 * перемещается за перекрывающими предметами, он будет полупрозрачный и будет
 * видно где он находится.
 * 
 * Например:
 * <parallax: bgMap 1>
 * <parallax: fgMap 3>
 */

(function() {

	var pData = new Array();
	
	var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
	Game_Interpreter.prototype.pluginCommand = function(command, args) {
		_Game_Interpreter_pluginCommand.call(this, command, args);
		
		if(command == "addMapParallax"){
			var pId = Number(args[0]);
			var pImage = args[1];
			var pLayer = Number(args[2]);
			
			if ($gameMap.murParallaxMaping == undefined) $gameMap.murParallaxMaping = [];
			$gameMap.murParallaxMaping[pId] = {
				"id": pId,
				"image": pImage,
				"layer": pLayer
			}		
			createParallaxMap($gameMap.murParallaxMaping[pId]);
		}
	};
	
	var Scene_Load_onSavefileOk = Scene_Load.prototype.onSavefileOk;
	Scene_Load.prototype.onSavefileOk = function() {
		Scene_Load_onSavefileOk.call(this);
		if ($gameMap.murParallaxMaping != undefined) {
			$gameMap.murParallaxMaping.forEach(function callback(p) {
				if (p != undefined) {
					var pId = p.id;
					var pImage = p.image;
					var pLayer = p.layer;
					createParallaxMap(p);
				}
			});
		}
	};
	
	function createParallaxMap(p) {
		if (pData[p.id] == undefined) {
			pData[p.id] = new Array();
			pData[p.id].sprite = new TilingSprite();
			pData[p.id].sprite.bitmap = ImageManager.loadBitmap('img/parallaxes/', p.image, null, true);
		}
		pData[p.id].new = true;
		pData[p.id].layer = p.layer;
	}
	
	var Scene_Map_update = Scene_Map.prototype.update;
	Scene_Map.prototype.update = function() {
		Scene_Map_update.call(this);
		if (this._spriteset != undefined) {
			pData.forEach(function callback(index, pItem) {
				if (pItem != undefined) {
					if (pItem.new) {
						this.addChildAt(pItem.sprite, index + pItem.layer);
						pItem.sprite.move(0, 0, Graphics.boxWidth, Graphics.boxHeight);
						pItem.new = false;
					}
					
					pItem.sprite.x = 0;
					pItem.sprite.y = 0;
					
					pItem.sprite.origin.x = $gameMap._displayX * 48;
					pItem.sprite.origin.y = $gameMap._displayY * 48;
				}
			}.bind(this._spriteset._baseSprite, this._spriteset._baseSprite.children.indexOf(this._spriteset._parallax)));
		}
	};
	
	// Disable original parallax
	Spriteset_Map.prototype.updateParallax = function() {
		if ($gameMap.murParallaxMaping == undefined) {
			$gameMap.murParallaxMaping = [];
			var mapNotes = $dataMap.note.split("\n");
			for (var pId=0; pId < mapNotes.length; pId++) {
				var mNote = mapNotes[pId];
				if (mNote != "" && mNote.match(/<parallax:\s*(.*)>/im)) {
					var shift = mNote.match(/<parallax:\s*(.*)>/im)[1].split(/(?:\s+,\s+|,\s+|\s+,|\s+|,)/);
					var pImage = shift[0];
					var pLayer = shift[1] ? Number(shift[1]) : 0;

					$gameMap.murParallaxMaping[pId] = {
						"id": pId,
						"image": pImage,
						"layer": pLayer
					}
					
					createParallaxMap($gameMap.murParallaxMaping[pId]);
				}
			}
		}
	}
	var _Scene_Map_terminate = Scene_Map.prototype.terminate;
	Scene_Map.prototype.terminate = function() {
		_Scene_Map_terminate.call(this);
		delete $gameMap.murParallaxMaping;
	}

})();
