Field/FieldManager/FieldManagerForEach.js

// FOR EACH FIELD

/**
* Выполняет callback для каждого поля из {@link FieldManager#fields}. 
* @param {function} callback Вызываемая функция
* @param {function} context  Контекст вызываваемой функции
*
* @return {any[]} Возвращенные переданной функцей значения
*/
FieldManager.prototype.forEachField = function(callback, context){
	var returnedValues = [];
	for(var si in this.fields){
		if(!this.fields.hasOwnProperty(si)){
			continue;
		}
		var field = this.fields[si];
		var returnValue = callback.call(context || this, field, si);
		if(returnValue !== undefined){
			returnedValues.push(returnValue);
		}
	}
	return returnedValues;
};

/** 
* Заставляет каждое поле разместить все карты. 
* @param {BRING_TO_TOP_ON} bringToTopOn Когда поднимать карту на передний план
* @param {boolean}         noDelay      Говорит полю, что перемещение не нужно задерживать
*/
FieldManager.prototype.placeCards = function(bringToTopOn, noDelay){
	this.forEachField(function(field){
		field.placeCards(null, bringToTopOn, noDelay);
	});
};

/** Заставляет каждое поле повернуть все карты. */
FieldManager.prototype.rotateCards = function(){
	this.forEachField(function(field){
		field.rotateCards();
	});
};

/** Заставляет каждое поле присвоить правильный z-index всем картам. */
FieldManager.prototype.zAlignCards = function(){
	this.forEachField(function(field){
		field.zAlignCards();
	});
};

/** Убирает подсветку всех полей и карт и восстанавливает масштаб карт в полях. */
FieldManager.prototype.resetHighlights = function(){
	this.forEachField(function(field){
		field.setPopOut(false);
		field.setOwnPlayability(false);
		field.validCards.length = 0;
		field.setOwnHighlight(false);
		field.setCardsPlayability(false);
	});
};

/** 
* Увеличивает масштаб карт в поле, восстанавливает масштаб во всех остальных полях.
* @param {Field} field поле
*/
FieldManager.prototype.popOutField = function(field){
	this.resetPopOut();
	field.setPopOut(true);
};

/** Восстанавливает масштаб во всех полях */
FieldManager.prototype.resetPopOut = function(){
	this.forEachField(function(field){
		field.setPopOut(false);
	});
};

/** 
* Меняет размеры и устанавливает позицию полей в соотстветсвии с 
* {@link FieldBuilder#positions} и {@link FieldBuilder#dimensions}.
*/
FieldManager.prototype.resizeFields = function(){
	if(!this.networkCreated){
		return;
	}
	this.builder.calcSizes();
	this.forEachField(function(field, id){
		field.style.padding = this.builder.offsets[id];
		
		var options = this.builder.options[id];
		if(options){
			mergeOptions(field, style);
		}

		var style = this.builder.styles[id];
		if(style){
			mergeOptions(field.style, style);
		}

		var badgeStyle = this.builder.badgeStyles[id];
		if(badgeStyle){
			mergeOptions(field.badgeStyle, badgeStyle);
		}

		field.setBase(this.builder.positions[id].x, this.builder.positions[id].y);
		field.setSize(this.builder.dimensions[id].width, this.builder.dimensions[id].height, true);

		field.savedPosition = null;
	});
};

/** Ресетит поля.*/
FieldManager.prototype.resetFields = function(){
	this.forEachField(function(field){
		field.reset();
	});
};

/** Уничтожает поля.*/
FieldManager.prototype.resetNetwork = function(){
	this.forEachField(function(field){
		field.destroy();
	});
	this.fields = {};
	this.table = [];
	this.networkCreated = false;
};

/** Восстанавливает порядок полей стола */
FieldManager.prototype.resetTableOrder = function(){
	for(var i = 0; i < this.table.length; i++){
		var table = this.table[i];
		if(table.savedPosition){
			table.setBase(table.savedPosition.x, table.savedPosition.y, true);
			table.savedPosition = null;
		}
	}
};

FieldManager.prototype.getFirstEmptyTable = function(){
	for(var i = 0; i < this.table.length; i++){
		if(this.table[i].cards.length === 0 && !this.table[i].icon){
			return this.table[i];
		}
	}
	return null;
};

FieldManager.prototype.endFieldAnimations = function(){
	this.forEachField(function(f){
		f.endAnimation();
	});
};

/** Применяет скин к полям */
FieldManager.prototype.applySkin = function(){
	this.resizeFields();
	var deck = this.fields.DECK;
	if(deck && deck.icon && skinManager.skin.hasSuits){
		var frame = deck.icon.frame;
		deck.icon.loadTexture(skinManager.skin.suitsName);
		deck.icon.scale.set(skinManager.skin.scale, skinManager.skin.scale);
		deck.icon.frame = frame;
	}
};

FieldManager.prototype.updateBadges = function(){
	this.forEachField(function(f){
		if(f.badge){
			f.badge.updatePosition();
		}
	});
};

/**
* Возвращает все поля, соотвтетствующие переданному условию
* @param {(function|number)} check условие в виде функции, в которую передаются поля
*                                  и которая возвращает `true` если поле выполняет условие;
*                                  либо в виде числа, соответствующего кол-ву карт в поле
* @return {Field[]}
*/
FieldManager.prototype.getFieldsWith = function(check){
	return this.forEachField(function(f){
		var isFunc = typeof check == 'function';
		if(!isFunc && f.cards.length === check || isFunc && check(f)){
			return f;
		}
	});
};