|
| 1 | +from db.db_utils import execute_query |
| 2 | +from utils.display import limpar_tela, exibir_mensagem |
| 3 | + |
| 4 | + |
| 5 | +def comprar_item(id_personagem): |
| 6 | + """ |
| 7 | + Lista os NPCs vendedores disponíveis na sala atual do personagem, |
| 8 | + permitindo o jogador comprar um item se tiver dinheiro e espaço. |
| 9 | + """ |
| 10 | + limpar_tela() |
| 11 | + print("--- 🛒 LOJA DE ITENS ---\n") |
| 12 | + |
| 13 | + # Mostrar saldo atual do personagem |
| 14 | + query_dinheiro = "SELECT dinheiro FROM PERSONAGEM WHERE id_personagem = %s;" |
| 15 | + saldo = execute_query(query_dinheiro, (id_personagem,), fetch_one=True) |
| 16 | + if saldo: |
| 17 | + print(f"Seu dinheiro atual: 💰 {saldo[0]} zeny\n") |
| 18 | + |
| 19 | + # Pega sala atual do personagem |
| 20 | + query_sala = "SELECT id_sala FROM PERSONAGEM WHERE id_personagem = %s;" |
| 21 | + sala_result = execute_query(query_sala, (id_personagem,), fetch_one=True) |
| 22 | + |
| 23 | + if not sala_result: |
| 24 | + exibir_mensagem("Não foi possível identificar a sala atual.", tipo="erro") |
| 25 | + return |
| 26 | + |
| 27 | + id_sala_atual = sala_result[0] |
| 28 | + |
| 29 | + # Lista os NPCs vendedores na mesma sala |
| 30 | + query_npcs = """ |
| 31 | + SELECT NV.id_npc_vendedor, N.nome, S.nome_sala |
| 32 | + FROM NPC_VENDEDOR NV |
| 33 | + JOIN NPC N ON N.id_npc = NV.id_npc_vendedor |
| 34 | + JOIN SALA S ON S.id_sala = N.id_sala |
| 35 | + WHERE N.id_sala = %s |
| 36 | + ORDER BY N.nome; |
| 37 | + """ |
| 38 | + npcs = execute_query(query_npcs, (id_sala_atual,), fetch_all=True) |
| 39 | + |
| 40 | + if not npcs: |
| 41 | + exibir_mensagem("Não há vendedores nesta sala.", tipo="erro") |
| 42 | + return |
| 43 | + |
| 44 | + print("Vendedores nesta sala:") |
| 45 | + for npc in npcs: |
| 46 | + print(f" {npc[0]}. {npc[1]} (local: {npc[2]})") |
| 47 | + |
| 48 | + try: |
| 49 | + id_npc = int(input("\nDigite o ID do vendedor com quem deseja negociar: ")) |
| 50 | + except ValueError: |
| 51 | + exibir_mensagem("Entrada inválida.", tipo="erro") |
| 52 | + return |
| 53 | + |
| 54 | + # Listar os itens vendidos pelo NPC |
| 55 | + query_itens = """ |
| 56 | + SELECT I.id_item, |
| 57 | + COALESCE(A.nome_item, PO.nome_item, PE.nome_item, CO.nome_item, |
| 58 | + CA.nome_item, BO.nome_item, AC.nome_item, CAPA.nome_item, ES.nome_item, PEIT.nome_item) AS nome_item, |
| 59 | + COALESCE(A.custo_item, PO.custo_item, PE.custo_item, CO.custo_item, |
| 60 | + CA.custo_item, BO.custo_item, AC.custo_item, CAPA.custo_item, ES.custo_item, PEIT.custo_item) AS preco |
| 61 | + FROM NPC_VENDEDOR NV |
| 62 | + JOIN VENDE_ESTOQUE_ITEM VEI ON VEI.id_estoque = NV.id_estoque |
| 63 | + JOIN ITEM I ON I.id_item = VEI.id_item |
| 64 | + LEFT JOIN ARMA A ON A.id_item = I.id_item |
| 65 | + LEFT JOIN POCAO PO ON PO.id_consumivel = I.id_item |
| 66 | + LEFT JOIN PERGAMINHO PE ON PE.id_consumivel = I.id_item |
| 67 | + LEFT JOIN COMIDA CO ON CO.id_consumivel = I.id_item |
| 68 | + LEFT JOIN CAPACETE CA ON CA.id_armadura = I.id_item |
| 69 | + LEFT JOIN BOTA BO ON BO.id_armadura = I.id_item |
| 70 | + LEFT JOIN ACESSORIO AC ON AC.id_armadura = I.id_item |
| 71 | + LEFT JOIN CAPA CAPA ON CAPA.id_armadura = I.id_item |
| 72 | + LEFT JOIN ESCUDO ES ON ES.id_armadura = I.id_item |
| 73 | + LEFT JOIN PEITORAL PEIT ON PEIT.id_armadura = I.id_item |
| 74 | + WHERE NV.id_npc_vendedor = %s; |
| 75 | + """ |
| 76 | + |
| 77 | + itens = execute_query(query_itens, (id_npc,), fetch_all=True) |
| 78 | + |
| 79 | + if not itens: |
| 80 | + exibir_mensagem("Esse vendedor não possui itens.", tipo="erro") |
| 81 | + return |
| 82 | + |
| 83 | + print("\nItens à venda:") |
| 84 | + for item in itens: |
| 85 | + print(f" {item[0]}. {item[1]} - 💰 {item[2]} zeny") |
| 86 | + |
| 87 | + try: |
| 88 | + id_item = int(input("\nDigite o ID do item que deseja comprar: ")) |
| 89 | + except ValueError: |
| 90 | + exibir_mensagem("Entrada inválida.", tipo="erro") |
| 91 | + return |
| 92 | + |
| 93 | + # Executa a compra via stored procedure |
| 94 | + result = execute_query("SELECT comprar_item(%s, %s, %s);", (id_personagem, id_item, id_npc), fetch_one=True, commit=True) |
| 95 | + |
| 96 | + if result: |
| 97 | + mensagem = result[0] |
| 98 | + if "sucesso" in mensagem.lower(): |
| 99 | + exibir_mensagem(mensagem, tipo="sucesso") |
| 100 | + else: |
| 101 | + exibir_mensagem(mensagem, tipo="erro") |
| 102 | + else: |
| 103 | + exibir_mensagem("Erro ao tentar comprar o item.", tipo="erro") |
0 commit comments