Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
EhOBruno committed Sep 9, 2024
2 parents fff6b5b + b0d0b98 commit 07b380d
Show file tree
Hide file tree
Showing 3 changed files with 168 additions and 59 deletions.
189 changes: 138 additions & 51 deletions app/src/game/combat.py
Original file line number Diff line number Diff line change
@@ -1,85 +1,172 @@
from ..utils.helpers import mostrar_texto_gradualmente
from colorama import Fore
import random
import time

# Comando: Atacar Mob
def atacar_mob(connection, cursor, nomeUser, nomeMob, nomeFerramenta):
"""
Permite ao jogador atacar um mob utilizando uma ferramenta ou arma do inventário.
Lida com mobs pacíficos e agressivos.
"""
# Verificar se o jogador possui a ferramenta adequada para o ataque e sua durabilidade

# Variáveis chave para o ataque
DURABILIDADE_PERDIDA = 1 # Quantidade de durabilidade perdida por ataque

# Verificar se o mob está no mesmo chunk que o jogador e obter suas informações
cursor.execute("""
SELECT InstanciaMob.vida_atual, Mob.tipo_mob
FROM InstanciaMob
JOIN Mob ON InstanciaMob.nome_mob = Mob.nome
WHERE InstanciaMob.nome_mob = %s
AND InstanciaMob.numero_chunk = (SELECT numero_chunk FROM Jogador WHERE nome = %s)
AND InstanciaMob.nome_mapa = (SELECT nome_mapa FROM Jogador WHERE nome = %s);
""", (nomeMob, nomeUser, nomeUser))

mob_data = cursor.fetchone()

if not mob_data:
mostrar_texto_gradualmente(f"O mob {nomeMob} não está presente neste chunk.", Fore.RED)
time.sleep(2)
return

vida_mob_atual, tipo_mob = mob_data

# Verificar se o jogador possui a ferramenta para atacar e sua durabilidade
cursor.execute("""
SELECT FerramentaDuravel.pts_dano, InstanciaItem.durabilidade_atual
SELECT FerramentaDuravel.pts_dano, InstanciaItem.durabilidade_atual, InstanciaItem.id_inst_item
FROM InstanciaItem
JOIN FerramentaDuravel ON InstanciaItem.nome_item = FerramentaDuravel.nome_item
WHERE InstanciaItem.nome_item = %s
WHERE InstanciaItem.nome_item = %s
AND EXISTS (
SELECT 1 FROM Inventario
WHERE id_inst_item = InstanciaItem.id_inst_item
AND id_inventario = (SELECT id_jogador FROM Jogador WHERE nome = %s)
);
""", (nomeFerramenta, nomeUser))

ferramenta = cursor.fetchone()

if ferramenta and ferramenta[1] > 0:
# Atualizar a vida do mob após o ataque
cursor.execute("""
UPDATE InstanciaMob
SET vida_atual = vida_atual - %s
WHERE nome_mob = %s
AND numero_chunk = (SELECT numero_chunk FROM Jogador WHERE nome = %s);
""", (ferramenta[0], nomeMob, nomeUser))

# Reduzir a durabilidade da ferramenta utilizada
cursor.execute("""
UPDATE InstanciaItem
SET durabilidade_atual = durabilidade_atual - 1
WHERE nome_item = %s;
""", (nomeFerramenta,))

# Verificar a vida restante do mob

if not ferramenta or ferramenta[1] <= 0:
mostrar_texto_gradualmente("Você não tem uma ferramenta válida ou ela está quebrada.", Fore.RED)
time.sleep(2)
return

pts_dano_ferramenta, durabilidade_atual, id_inst_item_ferramenta = ferramenta

# Reduzir a vida do mob
nova_vida_mob = vida_mob_atual - pts_dano_ferramenta
cursor.execute("""
UPDATE InstanciaMob
SET vida_atual = %s
WHERE nome_mob = %s
AND numero_chunk = (SELECT numero_chunk FROM Jogador WHERE nome = %s);
""", (nova_vida_mob, nomeMob, nomeUser))

# Reduzir a durabilidade da ferramenta
nova_durabilidade = durabilidade_atual - DURABILIDADE_PERDIDA
cursor.execute("""
UPDATE InstanciaItem
SET durabilidade_atual = %s
WHERE id_inst_item = %s;
""", (nova_durabilidade, id_inst_item_ferramenta))

mostrar_texto_gradualmente(f"Você atacou {nomeMob} com {nomeFerramenta}.", Fore.GREEN)
time.sleep(1.5)

# Verificar se o mob morreu
if nova_vida_mob <= 0:
mostrar_texto_gradualmente(f"Você derrotou {nomeMob}!", Fore.YELLOW)
time.sleep(1.5)

# Remover o mob morto da instância
cursor.execute("""
SELECT vida_atual
FROM InstanciaMob
DELETE FROM InstanciaMob
WHERE nome_mob = %s
AND numero_chunk = (SELECT numero_chunk FROM Jogador WHERE nome = %s);
""", (nomeMob, nomeUser))

vida_mob = cursor.fetchone()[0]

if vida_mob <= 0:
# Mob morreu, remover instância do mob e notificar o jogador
cursor.execute("""
DELETE FROM InstanciaMob
WHERE nome_mob = %s
AND numero_chunk = (SELECT numero_chunk FROM Jogador WHERE nome = %s);
""", (nomeMob, nomeUser))
mostrar_texto_gradualmente(f"Você matou {nomeMob}.", Fore.GREEN)

# Verificar e aplicar drops do mob
cursor.execute("""
SELECT nome_item, probabilidade
FROM MobDropaItem
WHERE nome_mob = %s;
""", (nomeMob,))
drops = cursor.fetchall()
for drop in drops:
nome_item, probabilidade = drop
if random.random() <= probabilidade / 100:
# Adicionar o item dropado ao inventário do jogador
# Verificar e aplicar drops do mob
cursor.execute("""
SELECT nome_item, probabilidade, quantidade
FROM MobDropaItem
WHERE nome_mob = %s;
""", (nomeMob,))
drops = cursor.fetchall()

for drop in drops:
nome_item, probabilidade, quantidade = drop
if random.random() <= probabilidade / 100:
# Adicionar o item dropado ao inventário do jogador (quantidade correta)
for _ in range(quantidade):
cursor.execute("""
INSERT INTO InstanciaItem (nome_item)
VALUES (%s) RETURNING id_inst_item;
""", (nome_item,))
id_inst_item = cursor.fetchone()[0]

cursor.execute("""
INSERT INTO Inventario (id_inst_item, id_inventario)
VALUES (%s, (SELECT id_jogador FROM Jogador WHERE nome = %s));
""", (id_inst_item, nomeUser))
mostrar_texto_gradualmente(f"O mob dropou {nome_item}.", Fore.YELLOW)
else:
mostrar_texto_gradualmente(f"Você atacou {nomeMob} com {nomeFerramenta}.", Fore.GREEN)
connection.commit()

mostrar_texto_gradualmente(f"O mob {nomeMob} dropou {quantidade}x {nome_item}.", Fore.YELLOW)
time.sleep(1.5)

else:
mostrar_texto_gradualmente("Você não tem uma ferramenta válida ou ela está quebrada.", Fore.RED)
# Se o mob for agressivo, ele ataca de volta
if tipo_mob == 'agressivo':
mostrar_texto_gradualmente(f"{nomeMob} ainda está vivo e ataca de volta!", Fore.RED)
time.sleep(1.5)

# Mob ataca de volta, aplicar dano ao jogador com base no `pts_dano` da tabela `Agressivo`
cursor.execute("""
SELECT pts_dano
FROM Agressivo
WHERE nome_mob = %s;
""", (nomeMob,))
dano_mob = cursor.fetchone()[0]

cursor.execute("""
UPDATE Jogador
SET vida = vida - %s
WHERE nome = %s;
""", (dano_mob, nomeUser))

# Verificar a vida do jogador
cursor.execute("""
SELECT vida
FROM Jogador
WHERE nome = %s;
""", (nomeUser,))
vida_jogador = cursor.fetchone()[0]

if vida_jogador <= 0:
mostrar_texto_gradualmente(f"{nomeMob} derrotou você!", Fore.RED)
time.sleep(2)

# Remover o jogador do jogo
cursor.execute("""
DELETE FROM Jogador WHERE nome = %s;
""", (nomeUser,))
else:
mostrar_texto_gradualmente(f"Você sofreu {dano_mob} de dano. Sua vida agora é {vida_jogador}.", Fore.YELLOW)
time.sleep(1.5)

# Verificar se a ferramenta quebrou
if nova_durabilidade <= 0:
mostrar_texto_gradualmente(f"Sua {nomeFerramenta} quebrou após o ataque!", Fore.RED)
time.sleep(1.5)

cursor.execute("""
DELETE FROM Inventario
WHERE id_inst_item = %s;
""", (id_inst_item_ferramenta,))

cursor.execute("""
DELETE FROM InstanciaItem
WHERE id_inst_item = %s;
""", (id_inst_item_ferramenta,))

connection.commit()

10 changes: 5 additions & 5 deletions app/src/game/environment_actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,11 @@ def minerar_fonte(connection, cursor, nomeUser, nomeFonte):
ferramenta = cursor.fetchone()

if not ferramenta:
mostrar_texto_gradualmente(f"Você precisa de uma {ferramenta_minima} ou melhor para minerar {nomeFonte}.", Fore.RED)
mostrar_texto_gradualmente(f"Você precisa de um(a) {ferramenta_minima} ou melhor para minerar {nomeFonte}.", Fore.RED)
time.sleep(2)
return

ferramenta_nome, durabilidade, id_inst_item = ferramenta
ferramenta_nome, durabilidade, id_inst_Ferramenta = ferramenta

# Se a ferramenta existir, verificar se ela tem durabilidade suficiente
if durabilidade <= 0:
Expand Down Expand Up @@ -159,19 +159,19 @@ def minerar_fonte(connection, cursor, nomeUser, nomeFonte):
SET durabilidade_atual = durabilidade_atual - %s
WHERE id_inst_item = %s
RETURNING durabilidade_atual;
""", (DURABILIDADE_PERDIDA, id_inst_item))
""", (DURABILIDADE_PERDIDA, id_inst_Ferramenta))

durabilidade_atual = cursor.fetchone()[0]

if durabilidade_atual <= 0:
# Remover ferramenta quebrada do inventário e tabela InstanciaItem
cursor.execute("""
DELETE FROM Inventario WHERE id_inst_item = %s;
""", (id_inst_item,))
""", (id_inst_Ferramenta,))

cursor.execute("""
DELETE FROM InstanciaItem WHERE id_inst_item = %s;
""", (id_inst_item,))
""", (id_inst_Ferramenta,))

mostrar_texto_gradualmente(f"Sua {ferramenta_nome} quebrou após a mineração!", Fore.RED)
time.sleep(2)
Expand Down
28 changes: 25 additions & 3 deletions app/src/game/gameplay.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,10 +189,32 @@ def processar_comando(connection, cursor, nomeUser, movimentos):
equipar_item(connection, cursor, nomeUser, nome_item)
break

elif acao == "atacar_mob" and len(parametros) == 2:
if acao == "atacar_mob" and len(parametros) > 1:
limpar_tela()
nome_mob = formatar_nome_item(' '.join(parametros))
nome_ferramenta = formatar_nome_item(parametros[1])

# Percorrer os parâmetros ao contrário para identificar a ferramenta primeiro
for i in range(1, len(parametros)):
nome_ferramenta_possivel = formatar_nome_item(' '.join(parametros[-i:]))

# Verificar se o nome_ferramenta_possivel é uma ferramenta válida
cursor.execute("""
SELECT 1 FROM FerramentaDuravel WHERE nome_item = %s;
""", (nome_ferramenta_possivel,))

ferramenta_existe = cursor.fetchone()

if ferramenta_existe:
# Ferramenta encontrada, agora separa o nome do mob
nome_ferramenta = nome_ferramenta_possivel
nome_mob = formatar_nome_item(' '.join(parametros[:-i])) # O restante são os parâmetros do mob
break
else:
# Se nenhuma ferramenta válida for encontrada
mostrar_texto_gradualmente(f"Ferramenta inválida para atacar.", Fore.RED)
time.sleep(2)
continue

# Chamar a função atacar_mob
atacar_mob(connection, cursor, nomeUser, nome_mob, nome_ferramenta)
break

Expand Down

0 comments on commit 07b380d

Please sign in to comment.