From c068359bdeef79bc4f173ad02d17458b9127bbd4 Mon Sep 17 00:00:00 2001 From: Miguel Moreira Date: Mon, 9 Sep 2024 13:33:42 -0300 Subject: [PATCH] Nova logica de ataque para considerar armadura e estruturas --- app/src/game/combat.py | 78 ++++++++++++++++++++++++++++++---------- app/src/game/gameplay.py | 2 +- 2 files changed, 60 insertions(+), 20 deletions(-) diff --git a/app/src/game/combat.py b/app/src/game/combat.py index c11687c..08caa63 100644 --- a/app/src/game/combat.py +++ b/app/src/game/combat.py @@ -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 @@ -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) @@ -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(""" @@ -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) @@ -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) @@ -169,4 +210,3 @@ def atacar_mob(connection, cursor, nomeUser, nomeMob, nomeFerramenta): """, (id_inst_item_ferramenta,)) connection.commit() - diff --git a/app/src/game/gameplay.py b/app/src/game/gameplay.py index ad79fa3..e3bd824 100644 --- a/app/src/game/gameplay.py +++ b/app/src/game/gameplay.py @@ -213,7 +213,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: