Field/FieldManager/FieldManager.js

/**
* Модуль, управляющий полями ({@link Field}).  
* Добавляет и удаляет карты из полей, предоставляет методы для работы с полями.  
* Создает {@link FieldBuilder}, который создает поля и карты.
* @class
* @extends {external:Phaser.Group}
* @param {Boolean} [inDebugMode] Отображать ли дебаг информацию {@link FieldManager#toggleDebugMode}
*/

var FieldManager = function(inDebugMode){

	Phaser.Group.call(this, game, null, 'fields');

	/**
	* Созданы ли поля
	* @type {boolean}
	* @default false
	*/
	this.networkCreated = false;

	/**
	* Поля
	* @type {object<Field>}
	*/
	this.fields = {};

	/**
	* Поля стола
	* @type {Field[]}
	*/
	this.table = [];

	/**
	* Поля оппонентов.
	* @type {Array}
	*/
	this.opponents = [];

	/**
	* Выводить ли дебаг информацию
	* @type {bolean}
	* @see  FieldManager#toggleDebugMode
	*/
	this.inDebugMode = inDebugMode;

	/**
	* Создает поля для менеджера
	* @type {FieldBuilder}
	*/
	this.builder = new FieldBuilder(this);

};

extend(FieldManager, Phaser.Group);

/**
* Добавляет поле.
* @param {function} Constructor конструктор поля
* @param {...object} options   опции, передаваемые в конструктор поля
*
* @return {Field}
*/
FieldManager.prototype.addField = function(Constructor){
	var args = [],
		len = arguments.length;
	for(var i = 1; i < len; i++) {
		args[i] = arguments[i];
	}
	var field = new (Constructor.bind.apply(Constructor, args))();
	if(this.fields[field.id]){
		this.fields[field.id].destroy();
	}
	this.fields[field.id] = field;
	this.add(field);
	field.initialize();
	return field;
};

/**
* Добавляет обычное поле или поле с иконкой.
* @param {object} options   
* @param {object} style   
* @param {object} [iconStyle]
* @return {(Field|Field.IconField)}
*/
FieldManager.prototype.addGenericField = function(options, style, iconStyle){
	return this.addField(iconStyle ? Field.IconField : Field, options, style, iconStyle);
};

/**
* Добавляет поле стола.
* @param {object} options   
* @param {object} style   
* @param {object} [iconStyle]
* @return {Field.TableField}
*/
FieldManager.prototype.addTableField = function(options, style, iconStyle){
	var field = this.addField(Field.TableField, options, style, iconStyle);
	this.table.push(field);
	return field;
};

/**
* Добавляет поле руки игрока.
* @param {object} options   
* @param {object} style   
* @param {object} [badgeStyle]
* @return {Field.PlayerField}
*/
FieldManager.prototype.addPlayerField = function(options, style, badgeStyle){
	return this.addField(Field.PlayerField, options, style, badgeStyle);
};

/**
* Добавляет поле руки оппонента.
* @param {object} options   
* @param {object} style   
* @param {object} [badgeStyle]
* @return {Field.BadgeField}
*/
FieldManager.prototype.addOpponentField = function(options, style, badgeStyle, popupStyle){
	var field = this.addField(Field.BadgeField, options, style, badgeStyle, popupStyle);
	this.opponents.push(field);
	return field;
};

/**
* Устанавливает козырь колоде.
* @param {number} suit козырь
*/
FieldManager.prototype.setTrumpSuit = function(suit){
	if(!this.fields.DECK || !this.fields.DECK.icon){
		console.error('Field manager: cannot set trump suit, no DECK');
		return;
	}
	var icon = this.fields.DECK.icon;
	icon.frame = suit;
	icon.visible = true;
};

/**
* Меняет местами два поля
* @param {Field} field1 первое поле
* @param {Field} field2 второе поле
*/
FieldManager.prototype.swapFields = function(field1, field2){
	var pos1 = {x: field1.x, y: field1.y};
	var pos2 = {x: field2.x, y: field2.y};
	if(!field1.savedPosition){
		field1.savedPosition = pos1;
	}
	if(!field2.savedPosition){
		field2.savedPosition = pos2;
	}
	field1.setBase(pos2.x, pos2.y, true);
	field2.setBase(pos1.x, pos1.y, true);
};

//@include:FieldManagerCard
//@include:FieldManagerForEach
//@include:FieldManagerAnim

// ДЕБАГ

/** Обновляет дебаг каждого поля */
FieldManager.prototype.updateDebug = function(){
	this.forEachField(function(field, si){
		field.updateDebug();
	});
};

/** Переключает режим дебага в каждом поле */
FieldManager.prototype.toggleDebugMode = function(){
	this.inDebugMode = !this.inDebugMode;
	gameOptions.set('debug_fields', this.inDebugMode);
	gameOptions.save();
	this.forEachField(function(field, si){
		if(field.inDebugMode != this.inDebugMode){
			field.toggleDebugMode();
		}
	});
	actionHandler.highlightPossibleActions();
	ui.setDebugButtonText('fields', 'Fields', this.inDebugMode);
};

FieldManager.prototype.sortPlayerHand = function(){
	if(!this.networkCreated || !gameInfo.pid || !this.fields[gameInfo.pid]){
		return;
	}
	var field = this.fields[gameInfo.pid];
	field.sortCards();
	field.placeCards();
};