Card/CardManager/CardManager.js

/**
* Менеджер карт.
* @class
* @param {boolean} inDebugMode выводит ли менеджер дебаг информацию
* @extends {external:Phaser.Group}
*/
var CardManager = function(inDebugMode){

	Phaser.Group.call(this, game);

	this.name = 'cardManager';

	/**
	* Карты по id.
	* @type {Object<Card>}
	*/
	this.cards = {};

	/**
	* Кол-во карт в CardManager#cards.
	* @type {Number}
	*/
	this.numOfCards = 0;

	/**
	* Длительность перемещения карт по умолчанию.
	* @type {Number}
	* @default 300
	*/
	this.defaultMoveTime = 300;

	/**
	* Включена ли физика карт.
	* @type {Boolean}
	* @default false
	*/
	this.physicsEnabled = false;

	/**
	* Выводит ли менеджер дебаг информацию.
	* @type {boolean}
	*/
	this.inDebugMode = inDebugMode || false;

	/**
	* @method
	* @global
	* @see {@link CardManager#getCards}
	*/
	getCards = this.getCards.bind(this);
	/**
	* @method
	* @global
	* @see {@link CardManager#getCard}
	*/
	getCard = this.getCard.bind(this);
};

extend(CardManager, Phaser.Group);

/**
* Создает карты.
* @param {CardInfo[]} cardsInfo информация о создаваемых картах.
*/
CardManager.prototype.createCards = function(cardsInfo){
	this.numOfCards = 0;
	var ids = [];
	for(var i = 0; i < cardsInfo.length; i++){
		this.numOfCards++;
		var c = cardsInfo[i];
		var card = this.cards[c.cid];
		ids.push(c.cid);
		if(!card){
			this.createCard({
				game: 	game,
				x: 		game.screenWidth / 2,
				y:		game.screenHeight + 300,
				id: 	c.cid,
				suit: 	c.suit,
				value: 	c.value,
				debug: 	this.inDebugMode
			});
		}
		else{
			card.presetValue(c.suit, c.value);
			card.fieldId = null;
		}
	}
	for(var ci in this.cards){
		if(!this.cards.hasOwnProperty(ci)){
			continue;
		}
		if(!~ids.indexOf(ci)){
			this.cards[ci].destroy();
		}
	}
};

/**
* Добавляет карту.
* @param {object} options параметры карты
*/
CardManager.prototype.createCard = function(options){
	if(!options || typeof options != 'object' || !options.id){
		console.error('Card manager: incorrect options', options);
		return;
	}
	var card = new Card(options);
	this.cards[options.id] = card;
	this.add(card);
};

/** Уничтожает все карты. */
CardManager.prototype.reset = function(){
	this.numOfCards = 0;
	for(var i = this.children.length - 1; i >= 0; i--){
		this.children[i].destroy();
	}
};

/** Возвращает карты с `raised == true` на место. */
CardManager.prototype.resetRaised = function(){
	var raised = false;
	for(var ci in this.cards){
		if(!this.cards.hasOwnProperty(ci)){
			continue;
		}
		var card = this.cards[ci]; 
		if(card.raised){
			card.raised = false;
			raised = true;
		}
	}
	if(!raised){
		return;
	}
	fieldManager.placeCards();
};

/** Применяет скин ко всем картам и эмиттеру карт. */
CardManager.prototype.applySkin = function(){
	for(var ci in this.cards){
		if(this.cards.hasOwnProperty(ci)){
			var card = this.cards[ci]; 
			card.skin = skinManager.skin;
			card.applySkin();
		}
	}
};

/** Устанавливает текущие значения всем картам без анимации. */
CardManager.prototype.forceApplyValues = function(){
	for(var ci in this.cards){
		if(this.cards.hasOwnProperty(ci)){
			var card = this.cards[ci]; 
			card.setValue(card.suit, card.value, false);
		}
	}
};

/**
* Включает физику карт.
* @param {boolean} makeDraggable нужно ли делать карты перетаскиваемыми
*/
CardManager.prototype.enablePhysics = function(makeDraggable, except, only){

	for(var cid in this.cards){
		// jshint forin:false
		var card = this.cards[cid];
		if(!this.cards.hasOwnProperty(cid) || except && except.indexOf && ~except.indexOf(card) || only && !~only.indexOf(card)){
			continue;
		}

		card.enablePhysics(makeDraggable);
	}
	this.physicsEnabled = true;
};

/** Выключает физику карт. */
CardManager.prototype.disablePhysics = function(){

	for(var cid in this.cards){
		if(!this.cards.hasOwnProperty(cid)){
			continue;
		}
		var card = this.cards[cid];
		card.disablePhysics();
	}
	this.physicsEnabled = false;
};


/**
* Поднимает указанную карту наверх, опционально поднимает перетаскиваемую карту наверх.
* @param {Card}    card                 карта, которую нужно поднять
* @param {boolean} [fixController=true] нужно ли поднимать {@link cardControl#card} наверх
*/
CardManager.prototype.bringCardToTop = function(card, fixController){
	if(!card || !this.cards[card.id] || !~this.children.indexOf(card)){
		console.error('Card manager: can\'t bring card to top', card);
		return;
	}
	if(fixController === undefined){
		fixController = true;
	}
	this.bringToTop(card);
	if(fixController && cardControl.card && cardControl.card != card){
		this.bringToTop(cardControl.card, false);
	}
};

//@include:CardManagerDebug