// File: /workspace/github_cpp_makefile_star2_O2/janthonyo[P]Redes-Practicas/funcionesServer.cc
// Function: waitListGame(std::vector<int, std::allocator<int>>&, std::vector<domino, std::allocator<domino>>&, int, std::vector<cliente, std::allocator<cliente>>&, int, int*)
void waitListGame(std::vector <int> &lista_espera, std::vector<domino> &partida, int pos, std::vector<cliente> &arrayClientes, int numClientes, int *numPartidas)
{
	int size_lista = (int) lista_espera.size();
	int result;
	char buffer[MSG_SIZE];
	char mensaje[MSG_SIZE];


	// Si solo hay un jugador en la lista
	if (size_lista == 1)
	{

		for (int i = 0; i < numClientes; i++)
		{

			if (arrayClientes[i].sd == lista_espera[0])
			{

				// Establecemos al usuario en partida
				partida[pos].setPlayer1(arrayClientes[i].user);
				partida[pos].setSocket1(arrayClientes[i].sd);

				// Guardamos en el cliente la partida asignada
				arrayClientes[i].inGame = pos;

				// Mandamos un mensaje de que hemos encontrado una partida disponible
				bzero(buffer, sizeof(buffer));
				strcpy(buffer, "+Ok. Partida disponible. Quedamos a la espera de mas jugadores\n");
				send(partida[pos].getSocketP1(), buffer, strlen(buffer), 0);

				// Borramos al usuario de la lista de espera
				lista_espera.erase(lista_espera.begin());
			}
		}
	}

	// Mas de un jugador en la lista
	else if (size_lista >= 2)
	{

		// Buscamos los clientes en el arrayClientes para asignar los datos
		for (int i = 0; i< numClientes; i++)
		{
			if (arrayClientes[i].sd == lista_espera[0])
			{
				// Establecemos al usuario como J1 en partida
				partida[pos].setPlayer1(arrayClientes[i].user);
				partida[pos].setSocket1(arrayClientes[i].sd);

				// Guardamos en el cliente la partida asignada
				arrayClientes[i].inGame = pos;
			}

			else if (arrayClientes[i].sd == lista_espera[1])
			{
				// Establecemos al usuario como J2 en partida
				partida[pos].setPlayer2(arrayClientes[i].user);
				partida[pos].setSocket2(arrayClientes[i].sd);

				// Guardamos en el cliente la partida asignada
				arrayClientes[i].inGame = pos;
			}
		}

		// Borramos a los usuarios de la lista de espera
		lista_espera.erase(lista_espera.begin()); 			// Borramos al 1er usuario
		lista_espera.erase(lista_espera.begin());			// Borramos al 2o. usuario (el nuevo primero)

		// Mandamos un mensaje a los jugadores de que empieza la partida.
		bzero(buffer, sizeof(buffer));
		strcpy(buffer, "+Ok. Empieza la partida");
		send(partida[pos].getSocketP1(), buffer, strlen(buffer), 0);
		send(partida[pos].getSocketP2(), buffer, strlen(buffer), 0);

		(*numPartidas)++;

		// Establecemos las manos
		partida[pos].setHand1(partida[pos].newHand());
		partida[pos].setHand2(partida[pos].newHand());

		// Vemos quien sale
		result = partida[pos].startPlayer();

		startGameMessage(partida[pos], result, &numClientes, arrayClientes);
	}

	// Si la lista esta vacia o ya se han hecho las operaciones, no se hace nada mas
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x168, %rsp            # imm = 0x168
movq %rsi, -0x48(%rbp)
movq %rdi, %r15
movl %r8d, -0x4c(%rbp)
movq 0x8(%rdi), %rax
subq (%rdi), %rax
shrq $0x2, %rax
cmpl $0x1, %eax
movq %rcx, -0x40(%rbp)
movl %edx, -0x2c(%rbp)
movq %rdi, -0x58(%rbp)
jne 0x6f2a
movslq %edx, %rax
movslq %r8d, %r12
xorl %r14d, %r14d
imulq $0x138, %rax, %rax      # imm = 0x138
movq %rax, -0x38(%rbp)
xorl %r13d, %r13d
cmpq %r12, %r13
jge 0x7113
movq (%rcx), %rax
movl (%rax,%r14), %esi
movq (%r15), %rdx
cmpl (%rdx), %esi
jne 0x6f1b
movq -0x48(%rbp), %r15
movq (%r15), %rcx
leaq (%rax,%r14), %rsi
addq $0x8, %rsi
movq -0x38(%rbp), %rbx
leaq (%rcx,%rbx), %rdi
addq $0x30, %rdi
callq 0x21b0
movq (%r15), %r15
movq -0x40(%rbp), %rax
movq (%rax), %rax
movl (%rax,%r14), %ecx
movl %ecx, 0x94(%r15,%rbx)
movl -0x2c(%rbp), %ecx
movl %ecx, 0xd0(%rax,%r14)
movl $0xba, %edx
leaq -0x150(%rbp), %rdi
xorl %esi, %esi
callq 0x2130
movups 0x1a77(%rip), %xmm0     # 0x8927
movaps %xmm0, -0x190(%rbp)
movups 0x1a79(%rip), %xmm0     # 0x8937
movaps %xmm0, -0x180(%rbp)
movups 0x1a7b(%rip), %xmm0     # 0x8947
movaps %xmm0, -0x170(%rbp)
movups 0x1a7d(%rip), %xmm0     # 0x8957
movaps %xmm0, -0x160(%rbp)
movl 0x94(%r15,%rbx), %r15d
leaq -0x190(%rbp), %rbx
movq %rbx, %rdi
callq 0x20f0
movl %r15d, %edi
movq -0x58(%rbp), %r15
movq %rbx, %rsi
movq %rax, %rdx
xorl %ecx, %ecx
callq 0x2110
movq (%r15), %rsi
movq %r15, %rdi
callq 0x730e
movq -0x40(%rbp), %rcx
incq %r13
addq $0xd4, %r14
jmp 0x6e3a
jle 0x7113
movq %r9, -0x60(%rbp)
movslq -0x2c(%rbp), %rax
movslq %r8d, %r12
xorl %r14d, %r14d
imulq $0x138, %rax, %rax      # imm = 0x138
movq %rax, -0x38(%rbp)
xorl %r13d, %r13d
cmpq %r12, %r13
jge 0x6fec
movq (%rcx), %rax
leaq (%rax,%r14), %rsi
addq $0x8, %rsi
movl -0x8(%rsi), %eax
movq (%r15), %rdx
cmpl (%rdx), %eax
jne 0x6f99
movq -0x48(%rbp), %r15
movq (%r15), %rax
movq -0x38(%rbp), %rbx
leaq (%rax,%rbx), %rdi
addq $0x30, %rdi
callq 0x21b0
movq -0x40(%rbp), %rcx
movq (%r15), %rsi
movq (%rcx), %rax
movl (%rax,%r14), %edx
movl %edx, 0x94(%rsi,%rbx)
jmp 0x6fce
cmpl 0x4(%rdx), %eax
jne 0x6fdd
movq -0x48(%rbp), %r15
movq (%r15), %rax
movq -0x38(%rbp), %rbx
leaq (%rax,%rbx), %rdi
addq $0xb0, %rdi
callq 0x21b0
movq -0x40(%rbp), %rcx
movq (%r15), %rsi
movq (%rcx), %rax
movl (%rax,%r14), %edx
movl %edx, 0x114(%rsi,%rbx)
movl -0x2c(%rbp), %edx
movl %edx, 0xd0(%rax,%r14)
movq -0x58(%rbp), %r15
incq %r13
addq $0xd4, %r14
jmp 0x6f4c
movq (%r15), %rsi
movq %r15, %rdi
callq 0x730e
movq (%r15), %rsi
movq %r15, %rdi
callq 0x730e
leaq -0x178(%rbp), %r12
movl $0xe2, %edx
movq %r12, %rdi
xorl %esi, %esi
callq 0x2130
movabsq $0x61646974726170, %rax # imm = 0x61646974726170
movq %rax, -0x8(%r12)
movups 0x1939(%rip), %xmm0     # 0x8967
movaps %xmm0, -0x18(%r12)
movq -0x48(%rbp), %r14
movq (%r14), %rax
movq -0x38(%rbp), %r15
movl 0x94(%rax,%r15), %r12d
leaq -0x190(%rbp), %r13
movq %r13, %rdi
callq 0x20f0
movl %r12d, %edi
movq %r13, %rsi
movq %rax, %rdx
xorl %ecx, %ecx
callq 0x2110
movq (%r14), %rax
movl 0x114(%rax,%r15), %r12d
movq %r13, %rdi
callq 0x20f0
movl %r12d, %edi
movq %r13, %rsi
movq %rax, %rdx
xorl %ecx, %ecx
callq 0x2110
movq -0x60(%rbp), %rax
incl (%rax)
movq (%r14), %rbx
leaq (%rbx,%r15), %rsi
leaq -0x90(%rbp), %r12
movq %r12, %rdi
callq 0x40f8
leaq (%rbx,%r15), %rdi
addq $0x98, %rdi
movq %r12, %rsi
callq 0x482c
leaq -0x90(%rbp), %rdi
callq 0x4d28
movq (%r14), %rbx
leaq (%rbx,%r15), %rsi
leaq -0x78(%rbp), %r12
movq %r12, %rdi
callq 0x40f8
leaq (%rbx,%r15), %rdi
addq $0x118, %rdi            # imm = 0x118
movq %r12, %rsi
callq 0x482c
leaq -0x78(%rbp), %rdi
callq 0x4d28
movq (%r14), %rdi
addq %r15, %rdi
callq 0x4186
addq (%r14), %r15
leaq -0x4c(%rbp), %rdx
movq %r15, %rdi
movl %eax, %esi
movq -0x40(%rbp), %rcx
callq 0x5bfa
addq $0x168, %rsp            # imm = 0x168
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x7127
movq %rax, %rbx
movq %r12, %rdi
callq 0x4d28
movq %rbx, %rdi
callq 0x2340