// File: arisKoutsou[P]oopproj/./src/livings/Hero.cpp
// Function: Hero::buy(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)
void Hero::buy(const string& itemName) {
  Market* currentMarket = this->getTile().getMarket();

  if (currentMarket == NULL) {
    cout << "You can't buy on a tile that has no market!" << endl << endl;
    return;
  }

  Item* itemToBuy = currentMarket->getItemByName(itemName);

  if (itemToBuy != NULL) {    
    string kind = itemToBuy->kindOf();
    Item* itemToAdd;
    bool equiped = false;

    cout << endl << "Bought " << itemName
	 << " (" << kind << ")";
    if (kind == "Weapon") {
      itemToAdd = new Weapon(*static_cast<Weapon*>(itemToBuy));
      Weapon* aux = static_cast<Weapon*>(itemToAdd);
      if (aux->needsBothHands()) {
        if (this->usesLeftHand() == false && this->usesRightHand() == false) {
	  this->equipWeapon(aux);
	  equiped = true;
	}
      } else {
	if (this->usesLeftHand() == false || this->usesRightHand() == false) {
	  this->equipWeapon(aux);
	  equiped = true;
	}
      }
    } else if (kind == "Armor") {
      itemToAdd = new Armor(*static_cast<Armor*>(itemToBuy));
      if (this->shield == NULL) {
	this->shield = static_cast<Armor*>(itemToAdd);
	equiped = true;
      }
    } else {
      itemToAdd = new Potion(*static_cast<Potion*>(itemToBuy));
    }

    if(!equiped) inventory.addItem(itemToAdd);
    setMoney(getMoney() - itemToBuy->buyFor());
    return;
  }

  Spell* spellToBuy = currentMarket->getSpellByName(itemName);
  
  if (spellToBuy != NULL) {
    string kind = spellToBuy->kindOf();
    Spell* spellToAdd;
    bool equiped = false;

    cout << endl << "Bought " << itemName
	 << " (" << kind << ")";
    if (kind == "IceSpell") {
      spellToAdd = new IceSpell(*static_cast<IceSpell*>(spellToBuy));
    } else if (kind == "FireSpell") {
      spellToAdd = new FireSpell(*static_cast<FireSpell*>(spellToBuy));
    } else {
      spellToAdd = new LightningSpell(*static_cast<LightningSpell*>(spellToBuy));
    }
    if (this->spells.size() == 0) {
      this->spells.push_back(spellToAdd);
      equiped = true;
    }

    if (!equiped) inventory.addSpell(spellToAdd);
    setMoney(getMoney() - spellToBuy->getValue());
    return;
  }

  cout << endl << "There's no item/spell with this name" << endl;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x160, %rsp            # imm = 0x160
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rdi
movq %rdi, -0xa8(%rbp)
callq 0x22050
movq %rax, %rdi
callq 0x9030
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0x24e8c
movq 0x1b163(%rip), %rdi     # 0x3ffc0
leaq 0xa1cb(%rip), %rsi      # 0x2f02f
callq 0x52f0
movq %rax, %rdi
movq 0x1b12d(%rip), %rsi     # 0x3ffa0
callq 0x5330
movq %rax, %rdi
movq 0x1b11e(%rip), %rsi     # 0x3ffa0
callq 0x5330
jmp 0x2555e
movq -0x18(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x20010
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x25239
movq -0x20(%rbp), %rsi
movq (%rsi), %rax
movq 0x18(%rax), %rax
leaq -0x40(%rbp), %rdi
callq *%rax
movb $0x0, -0x49(%rbp)
movq 0x1b0fc(%rip), %rdi     # 0x3ffc0
movq 0x1b0d5(%rip), %rsi     # 0x3ffa0
callq 0x5330
movq %rax, -0xb0(%rbp)
jmp 0x24ed9
movq -0xb0(%rbp), %rdi
leaq 0xa174(%rip), %rsi      # 0x2f05b
callq 0x52f0
movq %rax, -0xb8(%rbp)
jmp 0x24ef5
movq -0xb8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x52a0
movq %rax, -0xc0(%rbp)
jmp 0x24f0e
movq -0xc0(%rbp), %rdi
leaq 0xa147(%rip), %rsi      # 0x2f063
callq 0x52f0
movq %rax, -0xc8(%rbp)
jmp 0x24f2a
movq -0xc8(%rbp), %rdi
leaq -0x40(%rbp), %rsi
callq 0x52a0
movq %rax, -0xd0(%rbp)
jmp 0x24f43
movq -0xd0(%rbp), %rdi
leaq 0x965a(%rip), %rsi      # 0x2e5ab
callq 0x52f0
jmp 0x24f58
leaq 0x9c33(%rip), %rsi      # 0x2eb92
leaq -0x40(%rbp), %rdi
callq 0x8e10
movb %al, -0xd1(%rbp)
jmp 0x24f70
movb -0xd1(%rbp), %al
testb $0x1, %al
jne 0x24f7f
jmp 0x250d1
movl $0x48, %edi
callq 0x5300
movq %rax, -0xe0(%rbp)
jmp 0x24f92
movq -0xe0(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x28880
jmp 0x24fa4
movq -0xe0(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rdi
callq 0x2c3b0
movb %al, -0xe1(%rbp)
jmp 0x24fc8
movb -0xe1(%rbp), %al
testb $0x1, %al
jne 0x24fd7
jmp 0x2506c
movq -0xa8(%rbp), %rdi
callq 0x25570
movb %al, -0xe2(%rbp)
jmp 0x24feb
movb -0xe2(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
jne 0x2506a
movq -0xa8(%rbp), %rdi
callq 0x25590
movb %al, -0xe3(%rbp)
jmp 0x2500f
movb -0xe3(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
jne 0x2506a
movq -0xa8(%rbp), %rdi
movq -0x68(%rbp), %rsi
callq 0x241b0
jmp 0x25031
movb $0x1, -0x49(%rbp)
jmp 0x2506a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x2522b
movq -0xe0(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
movl $0x48, %esi
callq 0x5310
jmp 0x2522b
jmp 0x250cc
movq -0xa8(%rbp), %rdi
callq 0x25570
movb %al, -0xe4(%rbp)
jmp 0x25080
movb -0xe4(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
je 0x250b4
movq -0xa8(%rbp), %rdi
callq 0x25590
movb %al, -0xe5(%rbp)
jmp 0x250a4
movb -0xe5(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
jne 0x250ca
movq -0xa8(%rbp), %rdi
movq -0x68(%rbp), %rsi
callq 0x241b0
jmp 0x250c6
movb $0x1, -0x49(%rbp)
jmp 0x250cc
jmp 0x251bf
leaq 0x9ac1(%rip), %rsi      # 0x2eb99
leaq -0x40(%rbp), %rdi
callq 0x8e10
movb %al, -0xe6(%rbp)
jmp 0x250e9
movb -0xe6(%rbp), %al
testb $0x1, %al
jne 0x250f5
jmp 0x2516c
movl $0x48, %edi
callq 0x5300
movq %rax, -0xf0(%rbp)
jmp 0x25108
movq -0xf0(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x288d0
jmp 0x2511a
movq -0xa8(%rbp), %rax
movq -0xf0(%rbp), %rcx
movq %rcx, -0x48(%rbp)
cmpq $0x0, 0x58(%rax)
jne 0x2516a
movq -0xa8(%rbp), %rax
movq -0x48(%rbp), %rcx
movq %rcx, 0x58(%rax)
movb $0x1, -0x49(%rbp)
jmp 0x2516a
movq -0xf0(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
movl $0x48, %esi
callq 0x5310
jmp 0x2522b
jmp 0x251bd
movl $0x60, %edi
callq 0x5300
movq %rax, -0xf8(%rbp)
jmp 0x2517f
movq -0xf8(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x28920
jmp 0x25191
movq -0xf8(%rbp), %rax
movq %rax, -0x48(%rbp)
jmp 0x251bd
movq -0xf8(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
movl $0x60, %esi
callq 0x5310
jmp 0x2522b
jmp 0x251bf
testb $0x1, -0x49(%rbp)
jne 0x251e0
movq -0xa8(%rbp), %rdi
addq $0xc0, %rdi
movq -0x48(%rbp), %rsi
callq 0x17050
jmp 0x251de
jmp 0x251e0
movq -0xa8(%rbp), %rdi
callq 0x21f80
movl %eax, -0x100(%rbp)
movq -0x20(%rbp), %rdi
callq 0x2d560
movl %eax, -0xfc(%rbp)
jmp 0x25203
movq -0xa8(%rbp), %rdi
movl -0xfc(%rbp), %eax
movl -0x100(%rbp), %esi
subl %eax, %esi
callq 0x220b0
leaq -0x40(%rbp), %rdi
callq 0x55d0
jmp 0x2555e
leaq -0x40(%rbp), %rdi
callq 0x55d0
jmp 0x25567
movq -0x18(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x200d0
movq %rax, -0x70(%rbp)
cmpq $0x0, -0x70(%rbp)
je 0x2552d
movq -0x70(%rbp), %rsi
movq (%rsi), %rax
movq 0x18(%rax), %rax
leaq -0x90(%rbp), %rdi
callq *%rax
movb $0x0, -0x99(%rbp)
movq 0x1ad49(%rip), %rdi     # 0x3ffc0
movq 0x1ad22(%rip), %rsi     # 0x3ffa0
callq 0x5330
movq %rax, -0x108(%rbp)
jmp 0x2528c
movq -0x108(%rbp), %rdi
leaq 0x9dc1(%rip), %rsi      # 0x2f05b
callq 0x52f0
movq %rax, -0x110(%rbp)
jmp 0x252a8
movq -0x110(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x52a0
movq %rax, -0x118(%rbp)
jmp 0x252c1
movq -0x118(%rbp), %rdi
leaq 0x9d94(%rip), %rsi      # 0x2f063
callq 0x52f0
movq %rax, -0x120(%rbp)
jmp 0x252dd
movq -0x120(%rbp), %rdi
leaq -0x90(%rbp), %rsi
callq 0x52a0
movq %rax, -0x128(%rbp)
jmp 0x252f9
movq -0x128(%rbp), %rdi
leaq 0x92a4(%rip), %rsi      # 0x2e5ab
callq 0x52f0
jmp 0x2530e
leaq 0x990d(%rip), %rsi      # 0x2ec22
leaq -0x90(%rbp), %rdi
callq 0x8e10
movb %al, -0x129(%rbp)
jmp 0x25329
movb -0x129(%rbp), %al
testb $0x1, %al
jne 0x25335
jmp 0x253a0
movl $0x58, %edi
callq 0x5300
movq %rax, -0x138(%rbp)
jmp 0x25348
movq -0x138(%rbp), %rdi
movq -0x70(%rbp), %rsi
callq 0x28980
jmp 0x2535a
movq -0x138(%rbp), %rax
movq %rax, -0x98(%rbp)
jmp 0x25477
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x2551f
movq -0x138(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
movl $0x58, %esi
callq 0x5310
jmp 0x2551f
leaq 0x9884(%rip), %rsi      # 0x2ec2b
leaq -0x90(%rbp), %rdi
callq 0x8e10
movb %al, -0x139(%rbp)
jmp 0x253bb
movb -0x139(%rbp), %al
testb $0x1, %al
jne 0x253c7
jmp 0x2541e
movl $0x58, %edi
callq 0x5300
movq %rax, -0x148(%rbp)
jmp 0x253da
movq -0x148(%rbp), %rdi
movq -0x70(%rbp), %rsi
callq 0x289d0
jmp 0x253ec
movq -0x148(%rbp), %rax
movq %rax, -0x98(%rbp)
jmp 0x25475
movq -0x148(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
movl $0x58, %esi
callq 0x5310
jmp 0x2551f
movl $0x58, %edi
callq 0x5300
movq %rax, -0x150(%rbp)
jmp 0x25431
movq -0x150(%rbp), %rdi
movq -0x70(%rbp), %rsi
callq 0x28a20
jmp 0x25443
movq -0x150(%rbp), %rax
movq %rax, -0x98(%rbp)
jmp 0x25475
movq -0x150(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
movl $0x58, %esi
callq 0x5310
jmp 0x2551f
jmp 0x25477
movq -0xa8(%rbp), %rdi
addq $0x60, %rdi
callq 0x17ba0
cmpq $0x0, %rax
jne 0x254ad
movq -0xa8(%rbp), %rdi
addq $0x60, %rdi
leaq -0x98(%rbp), %rsi
callq 0x18460
jmp 0x254a6
movb $0x1, -0x99(%rbp)
testb $0x1, -0x99(%rbp)
jne 0x254d4
movq -0xa8(%rbp), %rdi
addq $0xc0, %rdi
movq -0x98(%rbp), %rsi
callq 0x170b0
jmp 0x254d2
jmp 0x254d4
movq -0xa8(%rbp), %rdi
callq 0x21f80
movl %eax, -0x158(%rbp)
movq -0x70(%rbp), %rdi
callq 0x21a50
movl %eax, -0x154(%rbp)
jmp 0x254f7
movq -0xa8(%rbp), %rdi
movl -0x154(%rbp), %eax
movl -0x158(%rbp), %esi
subl %eax, %esi
callq 0x220b0
leaq -0x90(%rbp), %rdi
callq 0x55d0
jmp 0x2555e
leaq -0x90(%rbp), %rdi
callq 0x55d0
jmp 0x25567
movq 0x1aa8c(%rip), %rdi     # 0x3ffc0
movq 0x1aa65(%rip), %rsi     # 0x3ffa0
callq 0x5330
movq %rax, %rdi
leaq 0x9b1c(%rip), %rsi      # 0x2f066
callq 0x52f0
movq %rax, %rdi
movq 0x1aa47(%rip), %rsi     # 0x3ffa0
callq 0x5330
addq $0x160, %rsp            # imm = 0x160
popq %rbp
retq
movq -0x58(%rbp), %rdi
callq 0x5550