Field/FieldAdd.js


// ДОБАВЛЕНИЕ КАРТ

/**
* Добавляет карты в поле.
* @param {Card[]}          newCards                             добавляемые карты
* @param {BRING_TO_TOP_ON} [bringToTopOn=BRING_TO_TOP_ON.START] когда поднимать карты на передний план
* @param {boolean}         [noDelay=false]                      убирает время ожидания перед добавлением карт
*
* @return {number} Время добавления
*/
Field.prototype.addCards = function(newCards, bringToTopOn, noDelay){

	if(!newCards.length){
		return;
	}

	if(bringToTopOn === undefined){
		bringToTopOn = BRING_TO_TOP_ON.START;
	}
	if(this.style.sortable){
		bringToTopOn = BRING_TO_TOP_ON.END_ALL;
	}

	if(this._queuedCards.length){
		var lastQueuedCard = this._queuedCards[this._queuedCards.length - 1];
		var delay = this._delays[lastQueuedCard.id] || 0;
		delay += this.delayTime;
		this.queueCards(newCards, delay);
		this.placeQueuedCards(bringToTopOn, noDelay);
		delay += (this._queuedCards.length - 1) * this.delayTime;
		return delay;
	}
	else{
		this._appendCards(newCards);
		this.sortCards();
		this._setUninteractibleTimer(newCards.length * this.delayTime);
		return this.placeCards(newCards, bringToTopOn, noDelay);
	}
};

/**
* Добавляет карты в {@link Field#cards}.
* Вычисляет и сохраняет угол карты в {@link Field#_angles}, если указан {@link Field#randomAngle}.
* @param {Card[]} cards карты для добавления
*/
Field.prototype._appendCards = function(cards){

	if(!cards || !cards.length){
		return;
	}

	var	angle;
	if(this.style.randomAngle){		
		angle = this._getLastAngle();
		if(angle === null){
			angle = Math.floor(Math.random()*10) * (cards[0].sprite.angle >= 0 ? 1 : -1) - 12;
		}
	}

	for(var ci = 0; ci < cards.length; ci++){
		var card = cards[ci];
		card.field = this;
		if(this.style.addTo == 'front'){
			this.cards.push(card);
		}
		else{
			this.cards.unshift(card);
		}

		// Сохраняем новый угол карты
		if(this.style.randomAngle){
			var addedAngle = (Math.floor(Math.random()*5) + 8);
			if(
				this.style.randomAngle == 'bi' && Math.random() > 0.5 || 
				this.style.randomAngle == 'uni' && this.style.direction == 'backward'
			){
				addedAngle = -addedAngle;
			}
			angle += addedAngle;
			this._angles[card.id] = angle;
		}
	}
};

/**
* Возвращает угол последней карты в поле.
* @return {(number|null)} Угол последней карты или `null`.
*/
Field.prototype._getLastAngle = function(){
	var lastAngle = null;	
	for(var ci = 0; ci < this.cards.length; ci++){
		var card = this.cards[ci];
		if(this._angles[card.id] !== undefined){
			lastAngle = this._angles[card.id];
		}
	}
	return lastAngle;
};