Skip to content

Commit 40a2f35

Browse files
authored
Merge pull request #31 from SBD1/compras
implementa sistema de compras
2 parents ce0ca61 + ba362a5 commit 40a2f35

File tree

3 files changed

+340
-159
lines changed

3 files changed

+340
-159
lines changed

projeto/app/game/shop.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
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

Comments
 (0)