// File: /workspace/github_cpp_makefile_star2_O3/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
movq %rdi, %r12
leal 0x9(%rsi), %eax
movl $0x1, %ebx
cmpl $0x13, %eax
jb 0x3746
movl $0x1, %ebx
movslq %esi, %rax
imulq $0x66666667, %rax, %rax # imm = 0x66666667
movq %rax, %rcx
shrq $0x3f, %rcx
sarq $0x22, %rax
leal (%rax,%rcx), %esi
incl %ebx
addl %ecx, %eax
addl $0x9, %eax
cmpl $0x12, %eax
ja 0x3722
movq (%r12), %rax
movq %rax, -0x40(%rbp)
movq 0xe87b(%rip), %rdi      # 0x11fd0
leaq 0x69b1(%rip), %rsi      # 0xa10d
movl $0x3, %edx
callq 0x2140
movq %rbx, -0x48(%rbp)
leal 0x2(%rbx), %r13d
movl 0x8(%r12), %eax
imull %r13d, %eax
testl %eax, %eax
jle 0x37ad
xorl %r15d, %r15d
movq 0xe84b(%rip), %rbx      # 0x11fd0
leaq 0x6985(%rip), %r14      # 0xa111
movl $0x3, %edx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x2140
incl %r15d
movl 0x8(%r12), %eax
imull %r13d, %eax
cmpl %eax, %r15d
jl 0x378c
movl %r13d, -0x34(%rbp)
movq %r12, -0x50(%rbp)
movq 0xe814(%rip), %rdi      # 0x11fd0
leaq 0x6952(%rip), %rsi      # 0xa115
movl $0x4, %edx
callq 0x2140
movq -0x40(%rbp), %rax
testq %rax, %rax
je 0x39ab
movq 0xe7ef(%rip), %r14      # 0x11fd0
leaq 0xa289(%rip), %r15      # 0xda71
movq %rax, -0x40(%rbp)
movq 0x8(%rax), %r12
movl $0x3, %edx
movq %r14, %rdi
leaq 0x6c24(%rip), %rsi      # 0xa423
callq 0x2140
testq %r12, %r12
je 0x3987
movl 0x8(%r12), %ebx
cmpl $0x1, %ebx
je 0x383c
testl %ebx, %ebx
jne 0x3880
movl -0x34(%rbp), %r13d
subl %ebx, %r13d
movl $0x1, %edx
movq %r14, %rdi
movq %r15, %rsi
callq 0x2140
decl %r13d
jne 0x3822
jmp 0x397e
movb $0x5b, -0x29(%rbp)
movl $0x1, %edx
movq %r14, %rdi
leaq -0x29(%rbp), %rsi
callq 0x2140
movq -0x48(%rbp), %rax
movl %eax, %ebx
movl $0x1, %edx
movq %r14, %rdi
movq %r15, %rsi
callq 0x2140
decl %ebx
jne 0x3857
movb $0x5d, -0x2a(%rbp)
movl $0x1, %edx
movq %r14, %rdi
leaq -0x2a(%rbp), %rsi
jmp 0x3979
movb 0x10(%r12), %r13b
shlb $0x5, %r13b
leal 0x5b(%r13), %eax
orb $0x5d, %r13b
movl 0xc(%r12), %ecx
cmpl $0x2, %ecx
jl 0x38ec
movq %r13, -0x58(%rbp)
movb %al, -0x2b(%rbp)
movl $0x1, %edx
movq %r14, %rdi
leaq -0x2b(%rbp), %rsi
callq 0x2140
movq -0x48(%rbp), %rax
movl %eax, %ebx
leaq 0x685a(%rip), %r13      # 0xa11a
movl $0x1, %edx
movq %r14, %rdi
movq %r13, %rsi
callq 0x2140
decl %ebx
jne 0x38c0
movq -0x58(%rbp), %rax
movb %al, -0x2c(%rbp)
movl $0x1, %edx
movq %r14, %rdi
leaq -0x2c(%rbp), %rsi
jmp 0x3979
cmpl $0x1, %ecx
jne 0x397e
movb %al, -0x2d(%rbp)
movl $0x1, %edx
movq %r14, %rdi
leaq -0x2d(%rbp), %rsi
callq 0x2140
movl 0x8(%r12), %esi
decl %esi
movq %rax, %rdi
callq 0x2200
leal 0x8(%rbx), %ecx
movl $0x1, %eax
cmpl $0x13, %ecx
jb 0x394b
decl %ebx
movslq %ebx, %rcx
imulq $0x66666667, %rcx, %rcx # imm = 0x66666667
movq %rcx, %rdx
shrq $0x3f, %rdx
sarq $0x22, %rcx
leal (%rcx,%rdx), %ebx
incl %eax
addl %edx, %ecx
addl $0x9, %ecx
cmpl $0x13, %ecx
jae 0x3927
movq -0x48(%rbp), %rcx
movl %ecx, %ebx
subl %eax, %ebx
jle 0x3969
movl $0x1, %edx
movq %r14, %rdi
movq %r15, %rsi
callq 0x2140
decl %ebx
jne 0x3955
movb %r13b, -0x2e(%rbp)
movl $0x1, %edx
movq %r14, %rdi
leaq -0x2e(%rbp), %rsi
callq 0x2140
movq (%r12), %r12
jmp 0x3804
movl $0x4, %edx
movq %r14, %rdi
leaq 0xb34b(%rip), %rsi      # 0xece1
callq 0x2140
movq -0x40(%rbp), %rax
movq (%rax), %rax
testq %rax, %rax
jne 0x37e8
movq 0xe61e(%rip), %rdi      # 0x11fd0
leaq 0x6763(%rip), %rsi      # 0xa11c
movl $0x3, %edx
callq 0x2140
movq -0x50(%rbp), %r12
movl 0x8(%r12), %eax
imull -0x34(%rbp), %eax
testl %eax, %eax
jle 0x3a06
xorl %r15d, %r15d
movq 0xe5f2(%rip), %rbx      # 0x11fd0
leaq 0x672c(%rip), %r14      # 0xa111
movl $0x3, %edx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x2140
incl %r15d
movl 0x8(%r12), %eax
imull -0x34(%rbp), %eax
cmpl %eax, %r15d
jl 0x39e5
movq 0xe5c3(%rip), %rdi      # 0x11fd0
leaq 0x670c(%rip), %rsi      # 0xa120
movl $0x4, %edx
callq 0x2140
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop