// File: /workspace/github_cpp_makefile_star2_O3/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 %rcx, -0x40(%rbp)
movl %edx, -0x2c(%rbp)
movq %rsi, -0x38(%rbp)
movq %rdi, %r15
movl %r8d, -0x54(%rbp)
movq (%rdi), %rdi
movq 0x8(%r15), %rdx
movq %rdx, %rax
subq %rdi, %rax
shrq $0x2, %rax
cmpl $0x1, %eax
jne 0x873f
testl %r8d, %r8d
jle 0x898f
movslq -0x2c(%rbp), %rax
movl %r8d, %esi
xorl %ebx, %ebx
imulq $0x138, %rax, %rax      # imm = 0x138
movq %rax, -0x48(%rbp)
xorl %r13d, %r13d
movq %rsi, -0x50(%rbp)
movq -0x40(%rbp), %rax
movq (%rax), %rax
movl (%rax,%rbx), %ecx
movq (%r15), %rdx
cmpl (%rdx), %ecx
jne 0x8727
movq -0x38(%rbp), %r12
movq (%r12), %rcx
leaq (%rax,%rbx), %rsi
addq $0x8, %rsi
movq -0x48(%rbp), %r14
leaq (%rcx,%r14), %rdi
addq $0x30, %rdi
callq 0x21b0
movq (%r12), %r12
movq -0x40(%rbp), %rax
movq (%rax), %rax
movl (%rax,%rbx), %ecx
movl %ecx, 0x94(%r12,%r14)
movl -0x2c(%rbp), %ecx
movl %ecx, 0xd0(%rax,%rbx)
movl $0xba, %edx
leaq -0x150(%rbp), %rdi
xorl %esi, %esi
callq 0x2130
movups 0x1286(%rip), %xmm0     # 0x992d
movaps %xmm0, -0x190(%rbp)
movups 0x1288(%rip), %xmm0     # 0x993d
movaps %xmm0, -0x180(%rbp)
movups 0x128a(%rip), %xmm0     # 0x994d
movaps %xmm0, -0x170(%rbp)
movups 0x128c(%rip), %xmm0     # 0x995d
movaps %xmm0, -0x160(%rbp)
movl 0x94(%r12,%r14), %r12d
leaq -0x190(%rbp), %r14
movq %r14, %rdi
callq 0x2100
movl %r12d, %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 0x871b
subq %rsi, %rdx
callq 0x22f0
movq 0x8(%r15), %rdx
addq $-0x4, %rdx
movq %rdx, 0x8(%r15)
movq -0x50(%rbp), %rsi
incq %r13
addq $0xd4, %rbx
cmpq %rsi, %r13
jb 0x8637
jmp 0x898f
jle 0x898f
movq %r9, %r14
movslq -0x2c(%rbp), %r12
testl %r8d, %r8d
jle 0x881f
movq %r14, -0x48(%rbp)
movq -0x40(%rbp), %rax
movq (%rax), %rax
movl %r8d, %ecx
movq %rcx, -0x50(%rbp)
xorl %r14d, %r14d
movq %r12, -0x60(%rbp)
imulq $0x138, %r12, %r13      # imm = 0x138
xorl %r12d, %r12d
movl (%rax,%r14), %ecx
movq (%r15), %rdx
cmpl (%rdx), %ecx
jne 0x87b7
movq -0x38(%rbp), %rbx
movq (%rbx), %rcx
leaq (%rax,%r14), %rsi
addq $0x8, %rsi
leaq (%rcx,%r13), %rdi
addq $0x30, %rdi
callq 0x21b0
movq (%rbx), %rcx
movq -0x40(%rbp), %rax
movq (%rax), %rax
movl (%rax,%r14), %edx
movl %edx, 0x94(%rcx,%r13)
jmp 0x87f1
cmpl 0x4(%rdx), %ecx
jne 0x87fc
movq -0x38(%rbp), %rbx
movq (%rbx), %rcx
leaq (%rax,%r14), %rsi
addq $0x8, %rsi
leaq (%rcx,%r13), %rdi
addq $0xb0, %rdi
callq 0x21b0
movq (%rbx), %rcx
movq -0x40(%rbp), %rax
movq (%rax), %rax
movl (%rax,%r14), %edx
movl %edx, 0x114(%rcx,%r13)
movl -0x2c(%rbp), %ecx
movl %ecx, 0xd0(%rax,%r14)
incq %r12
addq $0xd4, %r14
cmpq -0x50(%rbp), %r12
jb 0x8778
movq (%r15), %rdi
movq 0x8(%r15), %rdx
movq -0x48(%rbp), %r14
movq -0x60(%rbp), %r12
leaq 0x4(%rdi), %rsi
cmpq %rdx, %rsi
je 0x8837
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 0x8854
subq %rsi, %rdx
callq 0x22f0
movq 0x8(%r15), %rdx
addq $-0x4, %rdx
movq %rdx, 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 0x10e6(%rip), %xmm0     # 0x996d
movaps %xmm0, -0x18(%r15)
movq -0x38(%rbp), %rbx
movq (%rbx), %rax
imulq $0x138, %r12, %r15      # imm = 0x138
movl 0x94(%rax,%r15), %r13d
leaq -0x190(%rbp), %r12
movq %r12, %rdi
callq 0x2100
movl %r13d, %edi
movq %r12, %rsi
movq %rax, %rdx
xorl %ecx, %ecx
callq 0x2110
movq (%rbx), %rax
movl 0x114(%rax,%r15), %r13d
movq %r12, %rdi
callq 0x2100
movl %r13d, %edi
movq %r12, %rsi
movq %rax, %rdx
xorl %ecx, %ecx
callq 0x2110
incl (%r14)
movq (%rbx), %rbx
leaq (%rbx,%r15), %rsi
leaq -0x90(%rbp), %r12
movq %r12, %rdi
callq 0x487e
leaq (%rbx,%r15), %rdi
addq $0x98, %rdi
movq %r12, %rsi
callq 0x4f28
movq -0x90(%rbp), %rdi
testq %rdi, %rdi
je 0x8928
movq -0x80(%rbp), %rsi
subq %rdi, %rsi
callq 0x21f0
leaq -0x68(%rbp), %r14
movq -0x38(%rbp), %rax
movq (%rax), %rbx
leaq (%rbx,%r15), %rsi
leaq -0x78(%rbp), %r12
movq %r12, %rdi
callq 0x487e
leaq (%rbx,%r15), %rdi
addq $0x118, %rdi            # imm = 0x118
movq %r12, %rsi
callq 0x4f28
movq -0x78(%rbp), %rdi
testq %rdi, %rdi
je 0x896b
movq -0x68(%rbp), %rsi
subq %rdi, %rsi
callq 0x21f0
movq -0x38(%rbp), %rbx
movq (%rbx), %rdi
addq %r15, %rdi
callq 0x493e
addq (%rbx), %r15
leaq -0x54(%rbp), %rdx
movq %r15, %rdi
movl %eax, %esi
movq -0x40(%rbp), %rcx
callq 0x62a2
addq $0x168, %rsp            # imm = 0x168
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %r14, %rcx
movq %rax, %rbx
movq -0x78(%rbp), %rdi
jmp 0x89bb
leaq -0x80(%rbp), %rcx
movq %rax, %rbx
movq -0x90(%rbp), %rdi
testq %rdi, %rdi
je 0x89cb
movq (%rcx), %rsi
subq %rdi, %rsi
callq 0x21f0
movq %rbx, %rdi
callq 0x2330