// File: 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
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x58(%rbp)
movq (%rax), %rax
movq %rax, -0x18(%rbp)
movl $0x1, -0x24(%rbp)
movb $0x5b, -0x25(%rbp)
movb $0x5d, -0x26(%rbp)
movl -0xc(%rbp), %eax
movl $0xa, %ecx
cltd
idivl %ecx
movl %eax, -0xc(%rbp)
cmpl $0x0, %eax
je 0x47fb
movl -0x24(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x24(%rbp)
jmp 0x47dd
movq 0xf7ce(%rip), %rdi      # 0x13fd0
leaq 0x795c(%rip), %rsi      # 0xc165
callq 0x21a0
movl $0x0, -0x2c(%rbp)
movq -0x58(%rbp), %rdx
movl -0x2c(%rbp), %eax
movl -0x24(%rbp), %ecx
addl $0x2, %ecx
imull 0x8(%rdx), %ecx
cmpl %ecx, %eax
jge 0x4848
movq 0xf79f(%rip), %rdi      # 0x13fd0
leaq 0x7931(%rip), %rsi      # 0xc169
callq 0x21a0
movl -0x2c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x2c(%rbp)
jmp 0x4815
movq 0xf781(%rip), %rdi      # 0x13fd0
leaq 0x7917(%rip), %rsi      # 0xc16d
callq 0x21a0
cmpq $0x0, -0x18(%rbp)
je 0x4a82
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
movq 0xf757(%rip), %rdi      # 0x13fd0
leaq 0x7cc7(%rip), %rsi      # 0xc547
callq 0x21a0
cmpq $0x0, -0x20(%rbp)
je 0x4a5f
movq -0x20(%rbp), %rax
cmpl $0x0, 0x8(%rax)
jne 0x48d1
movl $0x0, -0x30(%rbp)
movl -0x30(%rbp), %eax
movl -0x24(%rbp), %ecx
addl $0x2, %ecx
cmpl %ecx, %eax
jge 0x48cc
movq 0xf71b(%rip), %rdi      # 0x13fd0
leaq 0xb2d9(%rip), %rsi      # 0xfb95
callq 0x21a0
movl -0x30(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x30(%rbp)
jmp 0x48a1
jmp 0x4a4f
movq -0x20(%rbp), %rax
cmpl $0x1, 0x8(%rax)
jne 0x4931
movb $0x0, -0x31(%rbp)
movq 0xf6ea(%rip), %rdi      # 0x13fd0
movsbl -0x25(%rbp), %esi
callq 0x2240
movl $0x0, -0x38(%rbp)
movl -0x38(%rbp), %eax
cmpl -0x24(%rbp), %eax
jge 0x491c
movq 0xf6cb(%rip), %rdi      # 0x13fd0
leaq 0xb289(%rip), %rsi      # 0xfb95
callq 0x21a0
movl -0x38(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x38(%rbp)
jmp 0x48f6
movq 0xf6ad(%rip), %rdi      # 0x13fd0
movsbl -0x26(%rbp), %esi
callq 0x2240
jmp 0x4a4d
movq -0x20(%rbp), %rax
testb $0x1, 0x10(%rax)
je 0x4943
movb $0x7b, -0x25(%rbp)
movb $0x7d, -0x26(%rbp)
movq -0x20(%rbp), %rax
cmpl $0x1, 0xc(%rax)
jle 0x499f
movq 0xf67c(%rip), %rdi      # 0x13fd0
movsbl -0x25(%rbp), %esi
callq 0x2240
movl $0x0, -0x3c(%rbp)
movl -0x3c(%rbp), %eax
cmpl -0x24(%rbp), %eax
jge 0x498a
movq 0xf65d(%rip), %rdi      # 0x13fd0
leaq 0x77f8(%rip), %rsi      # 0xc172
callq 0x21a0
movl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c(%rbp)
jmp 0x4964
movq 0xf63f(%rip), %rdi      # 0x13fd0
movsbl -0x26(%rbp), %esi
callq 0x2240
jmp 0x4a45
movq -0x20(%rbp), %rax
cmpl $0x1, 0xc(%rax)
jne 0x4a43
movq -0x20(%rbp), %rax
movl 0x8(%rax), %eax
subl $0x1, %eax
movl %eax, -0x40(%rbp)
movl $0x1, -0x44(%rbp)
movq 0xf608(%rip), %rdi      # 0x13fd0
movsbl -0x25(%rbp), %esi
callq 0x2240
movq %rax, %rdi
movq -0x20(%rbp), %rax
movl 0x8(%rax), %esi
subl $0x1, %esi
callq 0x2310
movl -0x40(%rbp), %eax
movl $0xa, %ecx
cltd
idivl %ecx
movl %eax, -0x40(%rbp)
cmpl $0x0, %eax
je 0x4a01
movl -0x44(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x44(%rbp)
jmp 0x49e3
movl $0x0, -0x48(%rbp)
movl -0x48(%rbp), %eax
movl -0x24(%rbp), %ecx
subl -0x44(%rbp), %ecx
cmpl %ecx, %eax
jge 0x4a33
movq 0xf5b4(%rip), %rdi      # 0x13fd0
leaq 0xb172(%rip), %rsi      # 0xfb95
callq 0x21a0
movl -0x48(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x48(%rbp)
jmp 0x4a08
movq 0xf596(%rip), %rdi      # 0x13fd0
movsbl -0x26(%rbp), %esi
callq 0x2240
jmp 0x4a45
movb $0x5b, -0x25(%rbp)
movb $0x5d, -0x26(%rbp)
jmp 0x4a4f
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x20(%rbp)
jmp 0x4885
movq 0xf56a(%rip), %rdi      # 0x13fd0
leaq 0xc3a8(%rip), %rsi      # 0x10e15
callq 0x21a0
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
jmp 0x485b
movq 0xf547(%rip), %rdi      # 0x13fd0
leaq 0x76e4(%rip), %rsi      # 0xc174
callq 0x21a0
movl $0x0, -0x4c(%rbp)
movq -0x58(%rbp), %rdx
movl -0x4c(%rbp), %eax
movl -0x24(%rbp), %ecx
addl $0x2, %ecx
imull 0x8(%rdx), %ecx
cmpl %ecx, %eax
jge 0x4acf
movq 0xf518(%rip), %rdi      # 0x13fd0
leaq 0x76aa(%rip), %rsi      # 0xc169
callq 0x21a0
movl -0x4c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x4c(%rbp)
jmp 0x4a9c
movq 0xf4fa(%rip), %rdi      # 0x13fd0
leaq 0x769b(%rip), %rsi      # 0xc178
callq 0x21a0
addq $0x60, %rsp
popq %rbp
retq
nopl (%rax,%rax)