// File: rcolomina[P]the_charmed_house/src/operaciones.cpp
// Function: Tirar::execute()
void Tirar::execute(){

    Logger::instance().log("Entering into Tirar::execute() method ", Logger::kLogLevelInfo);

	  
    // Analisis sintactico parametros en entrada
    string objTirar;
    // parametro1 es una preposicion 
    bool param1Articulo=parametro=="de" or parametro=="del";
    // parametro2 no es vacio
    bool param2NotVoid=parametro2!="";

    if(param1Articulo and param2NotVoid)
        objTirar=parametro2;
    else 
        objTirar=parametro;
			
	 
    bool existeObjTirar=(*scene)->get_existe_objeto_escenario(objTirar);
    // Existe el objeto especificado en objTirar
    if(existeObjTirar)
    {
        Objeto *objeto=(*scene)->get_objeto(objTirar);
        //Si se puede tirar del objeto pasado por objTirar
		  		  
        if(objeto->get_value<bool>("tirable"))
        {
            if(objeto->get_value<bool>("stucked"))
            {					
                bool desatascador=false;
                desatascador=inventario.posee_desatascador();


                if(desatascador)
                {
                    Logger::instance().log("Bool desatascador es true", Logger::kLogLevelDebug);
                    Objeto *objDesatascador=inventario.tomar_desatascador();											  
                    string desatascador;
                    if(objDesatascador!=0){
                        Logger::instance().log("Existe objeto desatascador", Logger::kLogLevelDebug);
								 
                        desatascador=objDesatascador->Name();
                        inventario.eliminar(desatascador);
                    }
                    //TODO: Determinar genero del objeto desatascador para poner "del" o "de la" (determinar genero de la palabra)


                    cout<<Color::yellow<<"Has conseguido tirar del "<<objTirar<<" con ayuda de "<<objDesatascador->Name()<<Color::def<<endl;

                    objeto->tirar();
                    (*scene)->eliminar(objeto);					
                }
                else
                {
                    cout<<Color::magenta<<"Esta atascado"<<Color::def<<endl;
                }
            }						
            else
            {
                objeto->tirar();
                (*scene)->eliminar(objeto);					
            }
        }
        else
            cout<<Color::red<<"No puedes tirar de "<<objTirar<<Color::def<<endl;
    }
    else
    {
        if(objTirar!="")
            cout<<Color::red<<"No puedo tirar de '"<<objTirar<<"'."<<Color::def<<endl;
        else
            cout<<Color::magenta<<"Tirar de que?."<<Color::def<<endl;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x2c0, %rsp            # imm = 0x2C0
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x1a8(%rbp)
callq 0x3aa30
movq %rax, -0x1a0(%rbp)
leaq -0x29(%rbp), %rdi
movq %rdi, -0x198(%rbp)
callq 0x56d0
movq -0x198(%rbp), %rdx
leaq 0xbf23(%rip), %rsi      # 0x50e97
leaq -0x28(%rbp), %rdi
callq 0x299c0
jmp 0x44f7f
movq -0x1a0(%rbp), %rdi
leaq 0x3143b(%rip), %rdx     # 0x763c8
leaq -0x28(%rbp), %rsi
callq 0x3ace0
jmp 0x44f98
leaq -0x28(%rbp), %rdi
callq 0x5748
leaq -0x29(%rbp), %rdi
callq 0x5420
leaq -0x60(%rbp), %rdi
callq 0x5540
movq -0x1a8(%rbp), %rax
movq 0x38(%rax), %rdi
leaq 0xc11a(%rip), %rsi      # 0x510df
callq 0x2d7d0
movb %al, -0x1a9(%rbp)
jmp 0x44fd2
movb -0x1a9(%rbp), %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x1aa(%rbp)
jne 0x45014
jmp 0x44fe7
movq -0x1a8(%rbp), %rax
movq 0x38(%rax), %rdi
leaq 0xbec5(%rip), %rsi      # 0x50ebe
callq 0x2d7d0
movb %al, -0x1ab(%rbp)
jmp 0x45006
movb -0x1ab(%rbp), %al
movb %al, -0x1aa(%rbp)
jmp 0x45014
movq -0x1a8(%rbp), %rax
movb -0x1aa(%rbp), %cl
andb $0x1, %cl
movb %cl, -0x61(%rbp)
movq 0x40(%rax), %rdi
leaq 0xb609(%rip), %rsi      # 0x5063b
callq 0x2d830
movb %al, -0x1ac(%rbp)
jmp 0x4503f
movb -0x1ac(%rbp), %al
andb $0x1, %al
movb %al, -0x62(%rbp)
testb $0x1, -0x61(%rbp)
je 0x450b0
testb $0x1, -0x62(%rbp)
je 0x450b0
movq -0x1a8(%rbp), %rax
movq 0x40(%rax), %rsi
leaq -0x60(%rbp), %rdi
callq 0x5060
jmp 0x4506c
jmp 0x450c8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x45091
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x28(%rbp), %rdi
callq 0x5748
leaq -0x29(%rbp), %rdi
callq 0x5420
jmp 0x45864
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4585b
movq -0x1a8(%rbp), %rax
movq 0x38(%rax), %rsi
leaq -0x60(%rbp), %rdi
callq 0x5060
jmp 0x450c6
jmp 0x450c8
movq -0x1a8(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rax
movq %rax, -0x1b8(%rbp)
leaq -0x88(%rbp), %rdi
leaq -0x60(%rbp), %rsi
callq 0x5180
jmp 0x450ef
movq -0x1b8(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x2c800
movb %al, -0x1b9(%rbp)
jmp 0x4510a
leaq -0x88(%rbp), %rdi
callq 0x5748
movb -0x1b9(%rbp), %al
andb $0x1, %al
movb %al, -0x63(%rbp)
testb $0x1, -0x63(%rbp)
je 0x45715
movq -0x1a8(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rax
movq %rax, -0x1c8(%rbp)
leaq -0xb0(%rbp), %rdi
leaq -0x60(%rbp), %rsi
callq 0x5180
jmp 0x45152
movq -0x1c8(%rbp), %rdi
leaq -0xb0(%rbp), %rsi
callq 0x466d0
movq %rax, -0x1d0(%rbp)
jmp 0x4516e
leaq -0xb0(%rbp), %rdi
callq 0x5748
movq -0x1d0(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x90(%rbp), %rdi
leaq 0xaf2e(%rip), %rsi      # 0x500c4
callq 0x41690
movb %al, -0x1d1(%rbp)
jmp 0x451a3
movb -0x1d1(%rbp), %al
testb $0x1, %al
jne 0x451b2
jmp 0x4568c
movq -0x90(%rbp), %rdi
leaq 0xbd02(%rip), %rsi      # 0x50ec2
callq 0x41690
movb %al, -0x1d2(%rbp)
jmp 0x451cd
movb -0x1d2(%rbp), %al
testb $0x1, %al
jne 0x451dc
jmp 0x4565b
movq -0x1a8(%rbp), %rax
movb $0x0, -0xb1(%rbp)
movq 0x30(%rax), %rdi
callq 0x38760
movb %al, -0x1d3(%rbp)
jmp 0x451fb
movb -0x1d3(%rbp), %al
andb $0x1, %al
movb %al, -0xb1(%rbp)
testb $0x1, -0xb1(%rbp)
je 0x455ee
callq 0x3aa30
movq %rax, -0x1e0(%rbp)
jmp 0x45224
leaq -0xd9(%rbp), %rdi
movq %rdi, -0x1e8(%rbp)
callq 0x56d0
movq -0x1e8(%rbp), %rdx
leaq 0xbc85(%rip), %rsi      # 0x50eca
leaq -0xd8(%rbp), %rdi
callq 0x299c0
jmp 0x45253
movq -0x1e0(%rbp), %rdi
leaq 0x31147(%rip), %rdx     # 0x763a8
leaq -0xd8(%rbp), %rsi
callq 0x3ace0
jmp 0x4526f
leaq -0xd8(%rbp), %rdi
callq 0x5748
leaq -0xd9(%rbp), %rdi
callq 0x5420
movq -0x1a8(%rbp), %rax
movq 0x30(%rax), %rdi
callq 0x38800
movq %rax, -0x1f0(%rbp)
jmp 0x452a0
movq -0x1f0(%rbp), %rax
movq %rax, -0xe8(%rbp)
leaq -0x108(%rbp), %rdi
callq 0x5540
cmpq $0x0, -0xe8(%rbp)
je 0x454af
callq 0x3aa30
movq %rax, -0x1f8(%rbp)
jmp 0x452d6
leaq -0x129(%rbp), %rdi
movq %rdi, -0x200(%rbp)
callq 0x56d0
movq -0x200(%rbp), %rdx
leaq 0xbbed(%rip), %rsi      # 0x50ee4
leaq -0x128(%rbp), %rdi
callq 0x299c0
jmp 0x45305
movq -0x1f8(%rbp), %rdi
leaq 0x31095(%rip), %rdx     # 0x763a8
leaq -0x128(%rbp), %rsi
callq 0x3ace0
jmp 0x45321
leaq -0x128(%rbp), %rdi
callq 0x5748
leaq -0x129(%rbp), %rdi
callq 0x5420
movq -0xe8(%rbp), %rsi
leaq -0x150(%rbp), %rdi
callq 0x2d800
jmp 0x4534e
leaq -0x108(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0x5060
jmp 0x45363
leaq -0x150(%rbp), %rdi
callq 0x5748
movq -0x1a8(%rbp), %rax
movq 0x30(%rax), %rax
movq %rax, -0x208(%rbp)
leaq -0x170(%rbp), %rdi
leaq -0x108(%rbp), %rsi
callq 0x5180
jmp 0x45396
movq -0x208(%rbp), %rdi
leaq -0x170(%rbp), %rsi
callq 0x38950
jmp 0x453ab
leaq -0x170(%rbp), %rdi
callq 0x5748
jmp 0x454af
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x5748
jmp 0x4585b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0xb0(%rbp), %rdi
callq 0x5748
jmp 0x4585b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4541c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0xd8(%rbp), %rdi
callq 0x5748
leaq -0xd9(%rbp), %rdi
callq 0x5420
jmp 0x4585b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x455dd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x45464
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x128(%rbp), %rdi
callq 0x5748
leaq -0x129(%rbp), %rdi
callq 0x5420
jmp 0x455dd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x150(%rbp), %rdi
callq 0x5748
jmp 0x455dd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x170(%rbp), %rdi
callq 0x5748
jmp 0x455dd
movq 0x2bb02(%rip), %rdi     # 0x70fb8
leaq 0x332c3(%rip), %rsi     # 0x78780
callq 0x46680
movq %rax, -0x210(%rbp)
jmp 0x454cb
movq -0x210(%rbp), %rdi
leaq 0xba26(%rip), %rsi      # 0x50eff
callq 0x53a0
movq %rax, -0x218(%rbp)
jmp 0x454e7
movq -0x218(%rbp), %rdi
leaq -0x60(%rbp), %rsi
callq 0x5350
movq %rax, -0x220(%rbp)
jmp 0x45500
movq -0x220(%rbp), %rdi
leaq 0xba0b(%rip), %rsi      # 0x50f19
callq 0x53a0
movq %rax, -0x228(%rbp)
jmp 0x4551c
movq -0xe8(%rbp), %rsi
leaq -0x190(%rbp), %rdi
callq 0x2d800
jmp 0x45531
movq -0x228(%rbp), %rdi
leaq -0x190(%rbp), %rsi
callq 0x5350
movq %rax, -0x230(%rbp)
jmp 0x4554d
movq -0x230(%rbp), %rdi
leaq 0x33215(%rip), %rsi     # 0x78770
callq 0x46680
movq %rax, -0x238(%rbp)
jmp 0x45569
movq -0x238(%rbp), %rdi
movq 0x2ba19(%rip), %rsi     # 0x70f90
callq 0x5400
jmp 0x4557e
leaq -0x190(%rbp), %rdi
callq 0x5748
movq -0x90(%rbp), %rdi
callq 0x41490
jmp 0x45598
movq -0x1a8(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rdi
movq -0x90(%rbp), %rsi
callq 0x2caf0
jmp 0x455b4
leaq -0x108(%rbp), %rdi
callq 0x5748
jmp 0x45659
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x190(%rbp), %rdi
callq 0x5748
leaq -0x108(%rbp), %rdi
callq 0x5748
jmp 0x4585b
movq 0x2b9c3(%rip), %rdi     # 0x70fb8
leaq 0x3318c(%rip), %rsi     # 0x78788
callq 0x46680
movq %rax, -0x240(%rbp)
jmp 0x4560a
movq -0x240(%rbp), %rdi
leaq 0xb910(%rip), %rsi      # 0x50f28
callq 0x53a0
movq %rax, -0x248(%rbp)
jmp 0x45626
movq -0x248(%rbp), %rdi
leaq 0x3313c(%rip), %rsi     # 0x78770
callq 0x46680
movq %rax, -0x250(%rbp)
jmp 0x45642
movq -0x250(%rbp), %rdi
movq 0x2b940(%rip), %rsi     # 0x70f90
callq 0x5400
jmp 0x45657
jmp 0x45659
jmp 0x45687
movq -0x90(%rbp), %rdi
callq 0x41490
jmp 0x45669
movq -0x1a8(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rdi
movq -0x90(%rbp), %rsi
callq 0x2caf0
jmp 0x45685
jmp 0x45687
jmp 0x45710
movq 0x2b925(%rip), %rdi     # 0x70fb8
leaq 0x330de(%rip), %rsi     # 0x78778
callq 0x46680
movq %rax, -0x258(%rbp)
jmp 0x456a8
movq -0x258(%rbp), %rdi
leaq 0xb880(%rip), %rsi      # 0x50f36
callq 0x53a0
movq %rax, -0x260(%rbp)
jmp 0x456c4
movq -0x260(%rbp), %rdi
leaq -0x60(%rbp), %rsi
callq 0x5350
movq %rax, -0x268(%rbp)
jmp 0x456dd
movq -0x268(%rbp), %rdi
leaq 0x33085(%rip), %rsi     # 0x78770
callq 0x46680
movq %rax, -0x270(%rbp)
jmp 0x456f9
movq -0x270(%rbp), %rdi
movq 0x2b889(%rip), %rsi     # 0x70f90
callq 0x5400
jmp 0x4570e
jmp 0x45710
jmp 0x45849
leaq 0xaf1f(%rip), %rsi      # 0x5063b
leaq -0x60(%rbp), %rdi
callq 0x2d830
movb %al, -0x271(%rbp)
jmp 0x4572d
movb -0x271(%rbp), %al
testb $0x1, %al
jne 0x4573c
jmp 0x457dc
movq 0x2b875(%rip), %rdi     # 0x70fb8
leaq 0x3302e(%rip), %rsi     # 0x78778
callq 0x46680
movq %rax, -0x280(%rbp)
jmp 0x45758
movq -0x280(%rbp), %rdi
leaq 0xb7e4(%rip), %rsi      # 0x50f4a
callq 0x53a0
movq %rax, -0x288(%rbp)
jmp 0x45774
movq -0x288(%rbp), %rdi
leaq -0x60(%rbp), %rsi
callq 0x5350
movq %rax, -0x290(%rbp)
jmp 0x4578d
movq -0x290(%rbp), %rdi
leaq 0xb7c3(%rip), %rsi      # 0x50f5e
callq 0x53a0
movq %rax, -0x298(%rbp)
jmp 0x457a9
movq -0x298(%rbp), %rdi
leaq 0x32fb9(%rip), %rsi     # 0x78770
callq 0x46680
movq %rax, -0x2a0(%rbp)
jmp 0x457c5
movq -0x2a0(%rbp), %rdi
movq 0x2b7bd(%rip), %rsi     # 0x70f90
callq 0x5400
jmp 0x457da
jmp 0x45847
movq 0x2b7d5(%rip), %rdi     # 0x70fb8
leaq 0x32f9e(%rip), %rsi     # 0x78788
callq 0x46680
movq %rax, -0x2a8(%rbp)
jmp 0x457f8
movq -0x2a8(%rbp), %rdi
leaq 0xb75b(%rip), %rsi      # 0x50f61
callq 0x53a0
movq %rax, -0x2b0(%rbp)
jmp 0x45814
movq -0x2b0(%rbp), %rdi
leaq 0x32f4e(%rip), %rsi     # 0x78770
callq 0x46680
movq %rax, -0x2b8(%rbp)
jmp 0x45830
movq -0x2b8(%rbp), %rdi
movq 0x2b752(%rip), %rsi     # 0x70f90
callq 0x5400
jmp 0x45845
jmp 0x45847
jmp 0x45849
leaq -0x60(%rbp), %rdi
callq 0x5748
addq $0x2c0, %rsp            # imm = 0x2C0
popq %rbp
retq
leaq -0x60(%rbp), %rdi
callq 0x5748
movq -0x38(%rbp), %rdi
callq 0x56c0
nopl (%rax)