serverjs/Game/Durak/DurakTurnStages.js

'use strict';

const GameTurnStages = reqfromroot('Game/GameTurnStages');

class DurakTurnStages extends GameTurnStages{

	/**
	* Класс содержит действия, выполняемые в различные стадии хода.  
	* Выполняется в своем собственном контексте.
	* Визуальное представление хода: https://i.imgur.com/Lje4C0D.png (outdated)
	*/
	constructor(game){
		super(game);
	}

	// Действия

	// Начинаем ход
	DEFAULT(){
		this.game.startTurn();
		// Turn stage: INITIAL_ATTACK
		return true;
	}

	INITIAL_ATTACK(){
		return this.game.let('INITIAL_ATTACK', this.game.players.attackers[0]);
		// Turn stage: ATTACK, ATTACK_DEFENSE
	}

	ATTACK(){
		return this.game.let('ATTACK', this.game.players.attackers[0]);
		// Turn stage: ATTACK, DEFENSE_TRANSFER
	}

	DEFENSE_TRANSFER(){
		return this.game.let('DEFEND', this.game.players.defender, this.game.canTransfer);
		// Turn stage: DEFENSE_TRANSFER, ATTACK_DEFENSE, FOLLOWUP
	}

	ATTACK_DEFENSE(){
		return this.game.let('ATTACK_DEFEND', this.game.players.attackers, this.game.players.defender);
		// Turn stage: ATTACK_DEFENSE, DEFENSE, FOLLOWUP
	}

	DEFENSE(){
		return this.game.let('DEFEND', this.game.players.defender);
		// Turn stage: DEFENSE, FOLLOWUP
	}

	// Подкладывание карт в догонку
	FOLLOWUP(){
		return this.game.let('FOLLOWUP', this.game.players.attackers);
		// Turn stage: FOLLOWUP, END
	}

	TAKE(){
		const game = this.game;

		let action = game.cards.take(game.players.defender);

		this.setNext('END');

		game.players.rolesNotify();

		game.waitForResponse(game.actions.timeouts.take, game.players);
		game.players.takeNotify(action);
		return false;
		// Turn stage: END
	}

	// Начало конца хода, убираем карты со стола
	END(){
		const game = this.game;

		let discarded = game.cards.discard();

		this.setNext('END_DEAL');

		game.players.rolesNotify();

		if(discarded){
			game.waitForResponse(game.actions.timeouts.discard, game.players);
			game.players.completeActionNotify(discarded);
			return false;
		}
		return true;
		// Turn stage: END_DEAL
	}

	// Раздаем карты после окончания хода
	END_DEAL(){
		const game = this.game;

		let dealsOut = game.cards.dealTillFullHand();
		
		this.setNext('ENDED');

		game.players.rolesNotify();

		if(dealsOut.length){
			game.waitForResponse(game.actions.timeouts.deal, game.players);
			game.players.dealNotify(dealsOut);
			return false;
		}
		return true;
		// Turn stage: ENDED
	}

	// Конец конца хода
	// находим следующего игрока, ресетим ход и проверяем, закончилась ли игра
	ENDED(){

		const game = this.game;

		// Если защищающийся брал, сдвигаем айди, по которому будет искаться атакующий
		if(game.actions.takeOccurred){
			game.players.attackers = [game.players.defender];
		}

		let currentAttackerIndex = game.players.findInactive();
		game.resetTurn();
		// Turn stage: null

		if(!game.deck.length && game.players.notEnoughActive){
			game.players.findLoser();
			game.end();
			return false;
		}

		game.players.findToGoNext(currentAttackerIndex);
		return true;
	}
}

module.exports = DurakTurnStages;