// File: /workspace/github_cpp_makefile_star2_O1/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
movl %edx, -0x30(%rbp)
movq %rsi, -0x38(%rbp)
movq %rdi, %r15
movl %r8d, -0x2c(%rbp)
movq 0x8(%rdi), %rax
subq (%rdi), %rax
shrq $0x2, %rax
cmpl $0x1, %eax
movq %rcx, -0x48(%rbp)
jne 0x887a
cmpl $0x0, -0x2c(%rbp)
jle 0x8ab9
movslq -0x30(%rbp), %rax
xorl %r12d, %r12d
imulq $0x138, %rax, %rax      # imm = 0x138
movq %rax, -0x40(%rbp)
xorl %ebx, %ebx
movq %r15, -0x58(%rbp)
movq (%rcx), %rax
movl (%rax,%r12), %esi
movq (%r15), %rdx
cmpl (%rdx), %esi
jne 0x885e
movq -0x38(%rbp), %r13
movq (%r13), %rdx
leaq (%rax,%r12), %rsi
addq $0x8, %rsi
movq -0x40(%rbp), %r15
leaq (%rdx,%r15), %rdi
addq $0x30, %rdi
movq %rcx, %r14
callq 0x21b0
movq (%r13), %r13
movq (%r14), %rax
movl (%rax,%r12), %ecx
movl %ecx, 0x94(%r13,%r15)
movl -0x30(%rbp), %ecx
movl %ecx, 0xd0(%rax,%r12)
movl $0xba, %edx
leaq -0x150(%rbp), %rdi
xorl %esi, %esi
callq 0x2130
movups 0x114c(%rip), %xmm0     # 0x992d
movaps %xmm0, -0x190(%rbp)
movups 0x114e(%rip), %xmm0     # 0x993d
movaps %xmm0, -0x180(%rbp)
movups 0x1150(%rip), %xmm0     # 0x994d
movaps %xmm0, -0x170(%rbp)
movups 0x1152(%rip), %xmm0     # 0x995d
movaps %xmm0, -0x160(%rbp)
movl 0x94(%r13,%r15), %r13d
movq -0x58(%rbp), %r15
leaq -0x190(%rbp), %r14
movq %r14, %rdi
callq 0x2100
movl %r13d, %edi
movq %r14, %rsi
movq %rax, %rdx
xorl %ecx, %ecx
callq 0x2110
movq (%r15), %rdi
movq 0x8(%r15), %rdx
leaq 0x4(%rdi), %rsi
cmpq %rdx, %rsi
je 0x8855
subq %rsi, %rdx
callq 0x22f0
addq $-0x4, 0x8(%r15)
movq -0x48(%rbp), %rcx
incq %rbx
movslq -0x2c(%rbp), %rax
addq $0xd4, %r12
cmpq %rax, %rbx
jl 0x8773
jmp 0x8ab9
jle 0x8ab9
movq %r9, -0x50(%rbp)
cmpl $0x0, -0x2c(%rbp)
movslq -0x30(%rbp), %rax
movq %rax, -0x40(%rbp)
jle 0x8941
xorl %ebx, %ebx
imulq $0x138, -0x40(%rbp), %r14 # imm = 0x138
xorl %r12d, %r12d
movq (%rcx), %rax
movl (%rax,%rbx), %esi
movq (%r15), %rdx
cmpl (%rdx), %esi
jne 0x88e5
movq -0x38(%rbp), %r13
movq (%r13), %rcx
leaq (%rax,%rbx), %rsi
addq $0x8, %rsi
leaq (%rcx,%r14), %rdi
addq $0x30, %rdi
callq 0x21b0
movq -0x48(%rbp), %rcx
movq (%r13), %rsi
movq (%rcx), %rax
movl (%rax,%rbx), %edx
movl %edx, 0x94(%rsi,%r14)
jmp 0x8920
cmpl 0x4(%rdx), %esi
jne 0x892a
movq -0x38(%rbp), %r13
movq (%r13), %rcx
leaq (%rax,%rbx), %rsi
addq $0x8, %rsi
leaq (%rcx,%r14), %rdi
addq $0xb0, %rdi
callq 0x21b0
movq -0x48(%rbp), %rcx
movq (%r13), %rsi
movq (%rcx), %rax
movl (%rax,%rbx), %edx
movl %edx, 0x114(%rsi,%r14)
movl -0x30(%rbp), %edx
movl %edx, 0xd0(%rax,%rbx)
incq %r12
movslq -0x2c(%rbp), %rax
addq $0xd4, %rbx
cmpq %rax, %r12
jl 0x88a3
movq (%r15), %rdi
movq 0x8(%r15), %rdx
leaq 0x4(%rdi), %rsi
cmpq %rdx, %rsi
je 0x8959
subq %rsi, %rdx
callq 0x22f0
movq (%r15), %rdi
movq 0x8(%r15), %rdx
addq $-0x4, %rdx
movq %rdx, 0x8(%r15)
leaq 0x4(%rdi), %rsi
cmpq %rdx, %rsi
je 0x8979
subq %rsi, %rdx
callq 0x22f0
leaq -0x78(%rbp), %r14
addq $-0x4, 0x8(%r15)
leaq -0x178(%rbp), %r15
movl $0xe2, %edx
movq %r15, %rdi
xorl %esi, %esi
callq 0x2130
movabsq $0x61646974726170, %rax # imm = 0x61646974726170
movq %rax, -0x8(%r15)
movups 0xfc0(%rip), %xmm0      # 0x996d
movaps %xmm0, -0x18(%r15)
movq -0x38(%rbp), %rbx
movq (%rbx), %rax
imulq $0x138, -0x40(%rbp), %r15 # imm = 0x138
movl 0x94(%rax,%r15), %r12d
leaq -0x190(%rbp), %r13
movq %r13, %rdi
callq 0x2100
movl %r12d, %edi
movq %r13, %rsi
movq %rax, %rdx
xorl %ecx, %ecx
callq 0x2110
movq (%rbx), %rax
movl 0x114(%rax,%r15), %r12d
movq %r13, %rdi
callq 0x2100
movl %r12d, %edi
movq %r13, %rsi
movq %rax, %rdx
xorl %ecx, %ecx
callq 0x2110
movq -0x50(%rbp), %rax
incl (%rax)
movq (%rbx), %rbx
leaq (%rbx,%r15), %rsi
leaq -0x88(%rbp), %r12
movq %r12, %rdi
callq 0x496c
leaq (%rbx,%r15), %rdi
addq $0x98, %rdi
movq %r12, %rsi
callq 0x5072
movq -0x88(%rbp), %rdi
testq %rdi, %rdi
je 0x8a52
movq -0x78(%rbp), %rsi
subq %rdi, %rsi
callq 0x21f0
leaq -0x60(%rbp), %r14
movq -0x38(%rbp), %rax
movq (%rax), %rbx
leaq (%rbx,%r15), %rsi
leaq -0x70(%rbp), %r12
movq %r12, %rdi
callq 0x496c
leaq (%rbx,%r15), %rdi
addq $0x118, %rdi            # imm = 0x118
movq %r12, %rsi
callq 0x5072
movq -0x70(%rbp), %rdi
testq %rdi, %rdi
je 0x8a95
movq -0x60(%rbp), %rsi
subq %rdi, %rsi
callq 0x21f0
movq -0x38(%rbp), %rbx
movq (%rbx), %rdi
addq %r15, %rdi
callq 0x4a24
addq (%rbx), %r15
leaq -0x2c(%rbp), %rdx
movq %r15, %rdi
movl %eax, %esi
movq -0x48(%rbp), %rcx
callq 0x63be
addq $0x168, %rsp            # imm = 0x168
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
movq -0x70(%rbp), %rdi
jmp 0x8ade
movq %rax, %rbx
movq -0x88(%rbp), %rdi
testq %rdi, %rdi
je 0x8aee
movq (%r14), %rsi
subq %rdi, %rsi
callq 0x21f0
movq %rbx, %rdi
callq 0x2330