Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
trindadea committed Sep 9, 2024
2 parents 2223e56 + c068359 commit fab769c
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 20 deletions.
78 changes: 59 additions & 19 deletions app/src/game/combat.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,41 @@
import time

# Comando: Atacar Mob
def atacar_mob(connection, cursor, nomeUser, nomeMob, nomeFerramenta):
def atacar_mob(connection, cursor, nomeUser, nomeMob, nomeFerramenta, estaEmEstrutura):
"""
Permite ao jogador atacar um mob utilizando uma ferramenta ou arma do inventário.
Lida com mobs pacíficos e agressivos.
Lida com mobs pacíficos e agressivos, incluindo armaduras e estruturas.
"""

# Variáveis chave para o ataque
DURABILIDADE_PERDIDA = 1 # Quantidade de durabilidade perdida por ataque
DURABILIDADE_PERDIDA_FERRAMENTA = 1 # Quantidade de durabilidade perdida por ataque na ferramenta
DURABILIDADE_PERDIDA_ARMADURA = 1 # Quantidade de durabilidade perdida por ataque na armadura

# 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))
# Verificar se o mob está no mesmo chunk e na mesma estrutura (se aplicável)
if estaEmEstrutura:
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)
AND InstanciaMob.nome_estrutura = (SELECT nome_estrutura FROM Jogador WHERE nome = %s);
""", (nomeMob, nomeUser, nomeUser, nomeUser))
else:
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)
mostrar_texto_gradualmente(f"O mob {nomeMob} não está presente neste chunk ou estrutura.", Fore.RED)
time.sleep(2)
return

Expand Down Expand Up @@ -64,16 +76,20 @@ def atacar_mob(connection, cursor, nomeUser, nomeMob, nomeFerramenta):
""", (nova_vida_mob, nomeMob, nomeUser))

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

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

# Informar sobre a perda de durabilidade da ferramenta
mostrar_texto_gradualmente(f"A {nomeFerramenta} perdeu {DURABILIDADE_PERDIDA_FERRAMENTA} ponto(s) de durabilidade. Durabilidade atual: {nova_durabilidade_ferramenta}.", Fore.LIGHTBLUE_EX)
time.sleep(1.5)

# Verificar se o mob morreu
if nova_vida_mob <= 0:
mostrar_texto_gradualmente(f"Você derrotou {nomeMob}!", Fore.YELLOW)
Expand Down Expand Up @@ -127,11 +143,32 @@ def atacar_mob(connection, cursor, nomeUser, nomeMob, nomeFerramenta):
""", (nomeMob,))
dano_mob = cursor.fetchone()[0]

# Verificar armadura do jogador
cursor.execute("""
SELECT cabeca, peito, pernas, pes
FROM Jogador WHERE nome = %s;
""", (nomeUser,))
armaduras = cursor.fetchone()

total_armadura = 0
for peca_armadura in armaduras:
if peca_armadura is not None:
cursor.execute("""
SELECT pts_armadura FROM armaduraduravel WHERE nome_item = %s;
""", (peca_armadura,))
pontos_armadura = cursor.fetchone()
if pontos_armadura:
total_armadura += pontos_armadura[0]

# Calcular o dano mitigado
dano_recebido = dano_mob / (1 + (total_armadura / 10))
dano_mitigado = dano_mob - dano_recebido

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

# Verificar a vida do jogador
cursor.execute("""
Expand All @@ -141,6 +178,10 @@ def atacar_mob(connection, cursor, nomeUser, nomeMob, nomeFerramenta):
""", (nomeUser,))
vida_jogador = cursor.fetchone()[0]

# Informar ao jogador quanto dano foi mitigado pela armadura
mostrar_texto_gradualmente(f"Você sofreu {int(dano_recebido)} de dano. Sua armadura mitigou {int(dano_mitigado)} de dano.", Fore.YELLOW)
time.sleep(1.5)

if vida_jogador <= 0:
mostrar_texto_gradualmente(f"{nomeMob} derrotou você!", Fore.RED)
time.sleep(2)
Expand All @@ -150,11 +191,11 @@ def atacar_mob(connection, cursor, nomeUser, nomeMob, nomeFerramenta):
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)
mostrar_texto_gradualmente(f"Sua vida agora é {vida_jogador}.", Fore.YELLOW)
time.sleep(1.5)

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

Expand All @@ -169,4 +210,3 @@ def atacar_mob(connection, cursor, nomeUser, nomeMob, nomeFerramenta):
""", (id_inst_item_ferramenta,))

connection.commit()

2 changes: 1 addition & 1 deletion app/src/game/gameplay.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ def processar_comando(connection, cursor, nomeUser, movimentos):
continue

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

elif acao == "falar" and parametros:
Expand Down

0 comments on commit fab769c

Please sign in to comment.