// File: /workspace/github_cpp_makefile_star2_O2/giovifazi[P]knossos-bloodbath/Map.cpp
// Function: Map::draw(int)
void Map::draw(int n)
{
   // Crea due puntatori che iterano per la matrice
   listaY* ordi = origin;
   listaX* asci;
   
   // Contatore di quanti spazi stampare dentro i nodi in base al num di giocatori
   int spaces = 1;

   // parentesi quadrate usate per stampare nodi dove non avviene il turno
   char parentesiSx = '[';
   char parentesiDx = ']';
   
   // Conto il numero di spazi
   while (n/=10)
		spaces++;

   // Stampa bordo superiore alla mappa
   std::cout << "╔";
   
   for (int j=0; j<(spaces+2)*width; j++)
      std::cout << "═";

   std::cout << "╗\n";

   // Iterazione sulle liste
   while(ordi != NULL)
   {
      asci = ordi->h;

      std::cout << "║";

      while(asci != NULL)
      {
        
		   // Stampa nodo vuoto aka celle non visitate
		   if (asci->val == 0)
		   {
		      for (int j=0; j<spaces+2;j++)
		         std::cout << " ";
		   }
         // Stampa cella vuota ma visitata []
         else if (asci->val == 1)
         {
            bool exitt = false;
            std::cout << parentesiSx;
            
            for (int j=0; j<spaces; j++)
		         std::cout << " ";
            
            std::cout << parentesiDx;
         }
         else
         // Stampa celle dove ci sono giocatori
         {
            // Se siamo nella cella dove avviene il turno cambia parentesi
			   if (asci->turn)
			   {
				   parentesiSx = '{';
				   parentesiDx = '}';
				
			   }

            // Stampa cella con piu di un giocatore [X]
            if (asci->pres > 1)
            {
               std::cout << parentesiSx;
              
               for(int j=0; j<spaces; j++)
                  std::cout << "X";
				
				   std::cout << parentesiDx;
				}
			   // Stampa cella con un giocatore aka stampa il numero giocatore [int] o {int}
			   else if (asci->pres == 1)
			   {				
				   int tmpVal = asci->val-1, lenght = 1;	

				   // NB al numero giocatore nel nodo e` implicitamente contato +1 per via del nodo visitato
				   std::cout << parentesiSx << asci->val - 1;
						
					// Conto cifre numero giocatore
               while (tmpVal /= 10)
		            lenght++;
					
					// stampo tanti spazi quanto e` la differenza cifre e spazi
					for (int j=0;j<spaces-lenght;j++)
						std::cout<<" ";

		    	     std::cout <<parentesiDx;
		    	}		
		    	 
		    	// Reimposto le parentesi normali per altre celle
				parentesiSx = '[';
				parentesiDx = ']';
		   }
	
		   // Passo alla ascissa successiva
		   asci = asci->next;
		}

		// Se il ciclo arriva qui, significa che ha finito una riga
		std::cout << "║\n";
		ordi = ordi->down;    // passo alla riga successiva
  }
   
   // Stampa bordo inferiore mappa
	std::cout << "╚";
  	
	for (int j=0; j<(spaces+2)*width; j++)
		std::cout << "═";
  	
	std::cout << "╝\n";

  //////////////////////////////////////////////
  //DEBUG STUFF
 /* std::cout << "Top left coordinate";
  std::cout << "(" << mostLeft << ", " << mostUp << ")\n";
  std::cout << "width = " << width << "\nheight = " << height << std::endl;  */
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x38, %rsp
movl %esi, %eax
movq %rdi, -0x40(%rbp)
movq (%rdi), %r12
movq $0x0, -0x38(%rbp)
pushq $0xa
popq %rsi
leal 0x9(%rax), %ecx
cmpl $0x13, %ecx
jb 0x348e
cltd
idivl %esi
movq -0x38(%rbp), %rcx
incl %ecx
movq %rcx, -0x38(%rbp)
jmp 0x3477
movq 0xcb3b(%rip), %rbx      # 0xffd0
leaq 0x4c71(%rip), %rsi      # 0x810d
movq %rbx, %rdi
callq 0x2120
movq -0x38(%rbp), %rax
leal 0x3(%rax), %r13d
incl %eax
movl %eax, -0x2c(%rbp)
xorl %r15d, %r15d
leaq 0x4c56(%rip), %r14      # 0x8111
movq -0x40(%rbp), %rax
movl 0x8(%rax), %eax
imull %r13d, %eax
cmpl %eax, %r15d
jge 0x34db
movq %rbx, %rdi
movq %r14, %rsi
callq 0x2120
incl %r15d
jmp 0x34bb
movq 0xcaee(%rip), %r14      # 0xffd0
leaq 0x4c2c(%rip), %rsi      # 0x8115
movq %r14, %rdi
callq 0x2120
leaq 0x8579(%rip), %r15      # 0xba71
testq %r12, %r12
je 0x3644
movq %r12, -0x50(%rbp)
movq 0x8(%r12), %rbx
movq %r14, %rdi
leaq 0x4f0f(%rip), %rsi      # 0x8423
callq 0x2120
movq %rbx, %rax
testq %rax, %rax
je 0x3628
movl 0x8(%rax), %ebx
cmpl $0x1, %ebx
movq %rax, -0x48(%rbp)
je 0x3586
testl %ebx, %ebx
je 0x357f
movb 0x10(%rax), %r12b
shlb $0x5, %r12b
leal 0x5b(%r12), %ecx
orb $0x5d, %r12b
movl 0xc(%rax), %eax
movzbl %cl, %esi
cmpl $0x2, %eax
jl 0x35c1
movq %r14, %rdi
callq 0x2160
movl -0x2c(%rbp), %ebx
subl $0x1, %ebx
jb 0x35a9
movq %r14, %rdi
leaq 0x4baf(%rip), %rsi      # 0x811a
callq 0x2120
jmp 0x355c
movq %r14, %rdi
movq %r15, %rsi
callq 0x2120
incl %ebx
cmpl %ebx, %r13d
jne 0x3572
jmp 0x35b5
movq %r14, %rdi
pushq $0x5b
popq %rsi
callq 0x2160
movl -0x2c(%rbp), %ebx
subl $0x1, %ebx
jb 0x35a6
movq %r14, %rdi
movq %r15, %rsi
callq 0x2120
jmp 0x3594
movb $0x5d, %r12b
movzbl %r12b, %esi
movq %r14, %rdi
callq 0x2160
movq -0x48(%rbp), %rax
movq (%rax), %rax
jmp 0x351c
cmpl $0x1, %eax
jne 0x35b5
movq %r12, -0x58(%rbp)
decl %ebx
movq %r14, %rdi
callq 0x2160
movq -0x48(%rbp), %rcx
movl 0x8(%rcx), %esi
decl %esi
movq %rax, %rdi
callq 0x2210
movq -0x38(%rbp), %rax
movl %eax, %r12d
pushq $0xa
popq %rcx
leal 0x9(%rbx), %eax
cmpl $0x12, %eax
jbe 0x3603
movl %ebx, %eax
cltd
idivl %ecx
decl %r12d
movl %eax, %ebx
jmp 0x35ef
testl %r12d, %r12d
movl $0x0, %eax
cmovlel %eax, %r12d
subl $0x1, %r12d
jb 0x3622
movq %r14, %rdi
movq %r15, %rsi
callq 0x2120
jmp 0x360f
movq -0x58(%rbp), %r12
jmp 0x35a9
movq %r14, %rdi
leaq 0x96af(%rip), %rsi      # 0xcce1
callq 0x2120
movq -0x50(%rbp), %r12
movq (%r12), %r12
jmp 0x34f8
movq 0xc985(%rip), %rbx      # 0xffd0
leaq 0x4aca(%rip), %rsi      # 0x811c
movq %rbx, %rdi
callq 0x2120
xorl %r15d, %r15d
leaq 0x4aad(%rip), %r14      # 0x8111
movq -0x40(%rbp), %rax
movl 0x8(%rax), %eax
imull %r13d, %eax
cmpl %eax, %r15d
jge 0x3684
movq %rbx, %rdi
movq %r14, %rsi
callq 0x2120
incl %r15d
jmp 0x3664
movq 0xc945(%rip), %rdi      # 0xffd0
leaq 0x4a8e(%rip), %rsi      # 0x8120
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x2120
nop