// File: /workspace/github_cpp_makefile_star2_O2/giovifazi[P]knossos-bloodbath/Node.cpp
// Function: Node::search_node(int, int, Node&, Map&)
Node* Node::search_node(int x, int y, Node& current, Map& search_map)
{
 
   //std::cout << "cerco il nodo " << x << " " << y << "\ne sono nel " << current.x << " " << current.y << std::endl;

   // inizializzo il valore di ritorno a null ad ogni chiamata ricorsiva
	Node* ret = NULL;

	// Parte di debugging, cambia i valori nella mappa di ricerca per mostrare in
	// quale nodo sta avvenendo la ricerca e poi stampa la mappa
	search_map.changeValue(current.get_x(), current.get_y(), 2, 0);
	//search_map.draw_search();
	search_map.changeValue(current.get_x(), current.get_y(), 1, 0);
	//std::cout << "\n";

   // Caso base ricorsione (se il nodo e` stato trovato)
	if (current.get_x() == x && current.get_y() == y)
	{
			ret = &current;
			return ret;
	}
	else
	{
      // In base al nodo su cui mi trovo, se il puntatore a nord/est/sud/ovest
      // non e` nullo e se secondo la mappa non ho gia`  visitato il nodo a
      // nord/sud/est/ovest, aggiorno la mappa di ricerca e chiamo la funzione
      // sul nodo nel quale ho itenzione di spostarmi.
      // Se il nodo viene trovato, si assegna a ret l' indirizzo del nodo
      // e tramite if (ret != NULL) viene ritornato fino alla prima chiamata di
      // ricerca

		if (current.get_cardinal('n') != NULL && search_map.getValueAt(current.get_x(), current.get_y()+1) != 1)
		{
			if (search_map.getValueAt(current.get_x(), current.get_y()+1) == -99999)
				search_map.addLine(true);

			ret = search_node(x,y, (*current.nord), search_map);
		}

		if (ret != NULL)
			return ret;
		else
		{
			if (current.get_cardinal('e') != NULL && search_map.getValueAt(current.get_x()+1, current.get_y()) != 1)
			{
				if (search_map.getValueAt(current.get_x()+1, current.get_y()) == -99999)
					search_map.addColumn(false);

				ret = search_node(x,y, (*current.est), search_map);
			}
		}

		if (ret != NULL)
			return ret;
		else
		{
			if (current.get_cardinal('s') != NULL && search_map.getValueAt(current.get_x(), current.get_y()-1) != 1)
			{
				if (search_map.getValueAt(current.get_x(), current.get_y()-1) == -99999)
					search_map.addLine(false);

				ret = search_node(x,y, (*current.sud), search_map);
			}
		}

		if (ret != NULL)
			return ret;
		else
		{
			if (current.get_cardinal('o') != NULL && search_map.getValueAt(current.get_x()-1, current.get_y()) != 1)
			{
				if (search_map.getValueAt(current.get_x()-1, current.get_y()) == -99999)
					search_map.addColumn(true);

				ret = search_node(x,y, (*current.ovest), search_map);
			}
		}

		return ret;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %r8, %r14
movq %rcx, %rbx
movl %edx, %r15d
movl %esi, %r12d
movq %rdi, %r13
movl 0x20(%rbx), %esi
movl 0x24(%rbx), %edx
movq %r14, %rdi
pushq $0x2
popq %rcx
xorl %r8d, %r8d
callq 0x383a
movl 0x20(%rbx), %esi
movl 0x24(%rbx), %edx
movq %r14, %rdi
pushq $0x1
popq %rcx
xorl %r8d, %r8d
callq 0x383a
movl 0x20(%rbx), %esi
movl 0x24(%rbx), %edx
movl %esi, %eax
xorl %r12d, %eax
movl %edx, %ecx
xorl %r15d, %ecx
orl %eax, %ecx
je 0x2e31
cmpq $0x0, (%rbx)
je 0x2d31
incl %edx
movq %r14, %rdi
callq 0x37e6
cmpl $0x1, %eax
je 0x2d31
movl 0x20(%rbx), %esi
movl 0x24(%rbx), %edx
incl %edx
movq %r14, %rdi
callq 0x37e6
cmpl $0xfffe7961, %eax       # imm = 0xFFFE7961
jne 0x2d14
movq %r14, %rdi
pushq $0x1
popq %rsi
callq 0x3732
movq (%rbx), %rcx
movq %r13, %rdi
movl %r12d, %esi
movl %r15d, %edx
movq %r14, %r8
callq 0x2c80
testq %rax, %rax
jne 0x2e2e
cmpq $0x0, 0x10(%rbx)
je 0x2d8c
movl 0x20(%rbx), %esi
movl 0x24(%rbx), %edx
incl %esi
movq %r14, %rdi
callq 0x37e6
cmpl $0x1, %eax
je 0x2d8c
movl 0x20(%rbx), %esi
movl 0x24(%rbx), %edx
incl %esi
movq %r14, %rdi
callq 0x37e6
cmpl $0xfffe7961, %eax       # imm = 0xFFFE7961
jne 0x2d6e
movq %r14, %rdi
xorl %esi, %esi
callq 0x36a6
movq 0x10(%rbx), %rcx
movq %r13, %rdi
movl %r12d, %esi
movl %r15d, %edx
movq %r14, %r8
callq 0x2c80
testq %rax, %rax
jne 0x2e2e
cmpq $0x0, 0x8(%rbx)
je 0x2de3
movl 0x20(%rbx), %esi
movl 0x24(%rbx), %edx
decl %edx
movq %r14, %rdi
callq 0x37e6
cmpl $0x1, %eax
je 0x2de3
movl 0x20(%rbx), %esi
movl 0x24(%rbx), %edx
decl %edx
movq %r14, %rdi
callq 0x37e6
cmpl $0xfffe7961, %eax       # imm = 0xFFFE7961
jne 0x2dc9
movq %r14, %rdi
xorl %esi, %esi
callq 0x3732
movq 0x8(%rbx), %rcx
movq %r13, %rdi
movl %r12d, %esi
movl %r15d, %edx
movq %r14, %r8
callq 0x2c80
testq %rax, %rax
jne 0x2e2e
cmpq $0x0, 0x18(%rbx)
je 0x2e2a
movl 0x20(%rbx), %esi
movl 0x24(%rbx), %edx
decl %esi
movq %r14, %rdi
callq 0x37e6
cmpl $0x1, %eax
je 0x2e2a
movl 0x20(%rbx), %esi
movl 0x24(%rbx), %edx
decl %esi
movq %r14, %rdi
callq 0x37e6
cmpl $0xfffe7961, %eax       # imm = 0xFFFE7961
jne 0x2e21
movq %r14, %rdi
pushq $0x1
popq %rsi
callq 0x36a6
movq 0x18(%rbx), %rbx
jmp 0x2c9d
xorl %ebx, %ebx
jmp 0x2e31
movq %rax, %rbx
movq %rbx, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop