Skip to content

Commit 098dc62

Browse files
committed
feat: melhorar e balancear o combate dos inimigos
1 parent eefda02 commit 098dc62

File tree

2 files changed

+95
-100
lines changed

2 files changed

+95
-100
lines changed

models/inimigo.py

Lines changed: 23 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,112 +1,56 @@
11
from __future__ import annotations
2-
from .base import Entidade
32

43

5-
class Inimigo(Entidade):
6-
def __init__(self, nome, vida, ataque, defesa, efeitos, nome_ataque):
4+
class Inimigo:
5+
def __init__(self, nome, vida, ataque, defesa, nome_ataque):
76
self.nome = nome
87
self.vida = vida
98
self.ataque = ataque
109
self.defesa = defesa
11-
self.efeitos = {"Sangramento": {"dano": 2, "turnos": 3}}
1210
self.nome_ataque = nome_ataque
1311

14-
def calcular_dano_base(self):
15-
16-
return self.ataque
17-
1812
def receber_dano(self, dano):
19-
2013
dano_final = max(0, dano - self.defesa)
2114
self.vida -= dano_final
22-
2315
if self.vida < 0:
2416
self.vida = 0
25-
26-
return dano_final
17+
return dano_final
2718

2819
def esta_vivo(self):
29-
3020
return self.vida > 0
3121

22+
def calcular_ataque(self):
23+
return self.ataque
3224

33-
class Goblin(Inimigo):
34-
35-
def __init__(self, nome, nome_ataque):
36-
37-
super.__init__(
38-
nome="Goblin", vida=100, ataque=7, defesa=7, nome_ataque="Furia Goblin"
39-
)
40-
41-
def habilidade_especial(self, alvo):
42-
43-
if self.defesa == 7:
4425

45-
self.defesa -= 2
46-
self.ataque += 2
47-
print(
48-
"{self.nome} usou {self.nome_ataque}, ao usar seu poder seu ataque ficou pra {self.ataque} e sua defesa {self.defesa} ."
49-
)
26+
# ===========================================================
27+
# INIMIGOS ESPECÍFICOS
28+
# ===========================================================
5029

51-
else:
52-
print("{self.nome} sentiu medo do oponente e fugiu da batalha.")
5330

54-
return self.ataque
31+
class Goblin(Inimigo):
32+
def __init__(self):
33+
super().__init__(
34+
nome="Goblin", vida=60, ataque=8, defesa=3, nome_ataque="Fúria Goblin"
35+
)
5536

5637

5738
class Ladrao(Inimigo):
58-
59-
def __init__(self, nome, nome_ataque):
60-
61-
super.__init__(
62-
nome="Ladrão", vida=100, ataque=11, defesa=3, nome_ataque="Disparo de adaga"
39+
def __init__(self):
40+
super().__init__(
41+
nome="Ladrão", vida=80, ataque=11, defesa=2, nome_ataque="Disparo de Adaga"
6342
)
6443

65-
def habilidade_especial(self, alvo):
66-
67-
if self.ataque == 11:
68-
69-
print("{self.nome} usou {self.nome_ataque} . ")
70-
return self.ataque * 2
7144

72-
else:
73-
print("{self.nome} Fugiu da batalha!")
74-
75-
76-
class Golen(Inimigo):
77-
78-
def __init__(self, nome, nome_ataque):
79-
super.__init__(
80-
nome="Golen", vida=100, ataque=20, defesa=15, nome_ataque="Soco de pedra"
45+
class Golem(Inimigo):
46+
def __init__(self):
47+
super().__init__(
48+
nome="Golem", vida=120, ataque=16, defesa=10, nome_ataque="Soco de Pedra"
8149
)
8250

83-
def habilidade_especial(self, alvo):
84-
85-
if self.ataque == 20:
86-
print("{self.nome} usou {self.nome_ataque} .")
87-
88-
return self.ataque
89-
90-
else:
91-
92-
print("{self.nome} fugiu da batalha")
93-
9451

9552
class Demonio(Inimigo):
96-
def __init__(self, nome, nome_ataque):
97-
98-
super.__init__(
99-
nome="Trigon",
100-
vida=100,
101-
ataque=50,
102-
defesa=50,
103-
nome_ataque="Passeio no inferno",
53+
def __init__(self):
54+
super().__init__(
55+
nome="Demônio", vida=150, ataque=22, defesa=12, nome_ataque="Chama Profunda"
10456
)
105-
106-
def habilidade_especial(self, alvo):
107-
108-
if self.ataque == 50:
109-
print("{self.nome} usou {self.nome_ataque} .")
110-
111-
return self.ataque
112-

utils/controle_missao.py

Lines changed: 72 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
from models.inventario import Inventario, Item
2+
from models.inimigo import Goblin, Ladrao, Golem, Demonio
3+
import random
24

35
# =====================================================
46
# ========== MENU DE MISSÃO ==========================
57
# =====================================================
68

79

810
def menu_missao(jogo) -> None:
9-
"""
10-
Submenu de missões.
11-
Controla as escolhas e delega para funções específicas.
12-
"""
11+
"""Submenu de missões."""
1312
while True:
1413
print("\n=== Missão ===")
1514
print(f"Dificuldade atual: {jogo.missao_config['dificuldade']}")
@@ -49,6 +48,7 @@ def escolher_dificuldade(jogo) -> None:
4948
print("[2] Média")
5049
print("[3] Difícil")
5150
op = input("> ").strip()
51+
5252
mapa = {"1": "Fácil", "2": "Média", "3": "Difícil"}
5353
dif = mapa.get(op)
5454

@@ -72,6 +72,7 @@ def escolher_cenario(jogo) -> None:
7272
print("[4] Ruínas")
7373

7474
op = input("> ").strip()
75+
7576
mapa = {"1": "Trilha", "2": "Floresta", "3": "Caverna", "4": "Ruínas"}
7677
cen = mapa.get(op)
7778

@@ -82,6 +83,43 @@ def escolher_cenario(jogo) -> None:
8283
print("Opção inválida.")
8384

8485

86+
# -----------------------------------------------------
87+
# GERADOR DE INIMIGOS POR CENÁRIO
88+
# -----------------------------------------------------
89+
90+
91+
def gerar_inimigo_por_cenario(cenario):
92+
mapa = {
93+
"Trilha": [Goblin],
94+
"Floresta": [Goblin, Ladrao],
95+
"Caverna": [Ladrao, Golem],
96+
"Ruínas": [Golem, Demonio],
97+
}
98+
99+
lista = mapa.get(cenario, [Goblin])
100+
classe_escolhida = random.choice(lista)
101+
return classe_escolhida()
102+
103+
104+
# -----------------------------------------------------
105+
# APLICAR DIFICULDADE
106+
# -----------------------------------------------------
107+
108+
109+
def aplicar_dificuldade(inimigo, dificuldade):
110+
if dificuldade == "Média":
111+
inimigo.vida = int(inimigo.vida * 1.2)
112+
inimigo.ataque = int(inimigo.ataque * 1.2)
113+
inimigo.defesa = int(inimigo.defesa * 1.2)
114+
115+
elif dificuldade == "Difícil":
116+
inimigo.vida = int(inimigo.vida * 1.5)
117+
inimigo.ataque = int(inimigo.ataque * 1.5)
118+
inimigo.defesa = int(inimigo.defesa * 1.5)
119+
120+
return inimigo
121+
122+
85123
# -----------------------------------------------------
86124
# PRÉ-VISUALIZAÇÃO DA MISSÃO
87125
# -----------------------------------------------------
@@ -91,12 +129,12 @@ def preview_missao(jogo) -> None:
91129
print("\nPré-visualização da Missão")
92130
print(f"- Dificuldade: {jogo.missao_config['dificuldade']}")
93131
print(f"- Cenário: {jogo.missao_config['cenario']}")
94-
print("- Inimigos e recompensas: (em breve)")
95-
print("- Regras de combate: (em breve)")
132+
print("- Inimigos e recompensas: Gerados dinamicamente")
133+
print("- Regras de combate: Turnos alternados e uso de itens")
96134

97135

98136
# -----------------------------------------------------
99-
# PARTE 3 — COMBATE DINÂMICO
137+
# COMBATE DINÂMICO
100138
# -----------------------------------------------------
101139

102140

@@ -105,26 +143,29 @@ def iniciar_missao(jogo):
105143
print("Crie um personagem antes de iniciar uma missão.")
106144
return
107145

108-
# Inicializa inventário se não existir
109-
inventario = jogo.personagem_obj.inventario
146+
jogador = jogo.personagem_obj
147+
inventario = jogador.inventario
110148

111-
# Se for a primeira missão, dar poções iniciais
149+
# Poções iniciais caso inventário esteja vazio
112150
if len(inventario.itens) == 0:
113151
inventario.adicionar_item(Item("Poção de Cura", 30))
114152
inventario.adicionar_item(Item("Poção de Cura", 30))
115153

116-
jogador = jogo.personagem_obj
154+
# Gerar inimigo real
155+
cenario = jogo.missao_config["cenario"]
156+
dificuldade = jogo.missao_config["dificuldade"]
157+
158+
inimigo = gerar_inimigo_por_cenario(cenario)
159+
inimigo = aplicar_dificuldade(inimigo, dificuldade)
117160

118-
inimigo = type(
119-
"InimigoSimulado", (), {"nome": "Goblin", "vida": 60, "ataque": 8, "defesa": 3}
120-
)()
161+
print(f"\nVocê encontrou um {inimigo.nome}!")
121162

122163
turno = 1
123-
print("\nIniciando missão...")
124164
jogo.logger.log_batalha(
125-
f"Missão iniciada — {jogo.missao_config['dificuldade']} / {jogo.missao_config['cenario']}"
165+
f"Missão iniciada — {dificuldade} / {cenario} — Inimigo: {inimigo.nome}"
126166
)
127167

168+
# ===== LOOP DO COMBATE =====
128169
while jogador.vida > 0 and inimigo.vida > 0:
129170
print(f"\n--- Turno {turno} ---")
130171
print(f"{jogador.nome} HP: {jogador.vida} | {inimigo.nome} HP: {inimigo.vida}")
@@ -133,8 +174,12 @@ def iniciar_missao(jogo):
133174
print("[1] Atacar")
134175
print("[2] Usar item")
135176
print("[3] Fugir")
177+
136178
acao = input("> ").strip()
137179

180+
# ----------------------------------
181+
# ATAQUE DO JOGADOR
182+
# ----------------------------------
138183
if acao == "1":
139184
dano = max(jogador.ataque - inimigo.defesa, 0)
140185
inimigo.vida -= dano
@@ -144,7 +189,7 @@ def iniciar_missao(jogo):
144189
elif acao == "2":
145190
usar_item_em_combate(jogador, jogo)
146191
turno += 1
147-
continue # inimigo não perde turno
192+
continue
148193

149194
elif acao == "3":
150195
print("Você fugiu!")
@@ -155,8 +200,9 @@ def iniciar_missao(jogo):
155200
print("Ação inválida!")
156201
continue
157202

158-
# Ataque inimigo
159-
# Ataque inimigo — garante pelo menos 1 de dano
203+
# ----------------------------------
204+
# ATAQUE DO INIMIGO
205+
# ----------------------------------
160206
if inimigo.vida > 0:
161207
dano_inimigo = max(inimigo.ataque - jogador.defesa, 1)
162208
jogador.vida -= dano_inimigo
@@ -167,6 +213,9 @@ def iniciar_missao(jogo):
167213

168214
turno += 1
169215

216+
# ----------------------------------
217+
# RESULTADO FINAL
218+
# ----------------------------------
170219
resultado = "Vitória" if jogador.vida > 0 else "Derrota"
171220
print(f"\n=== Fim da Missão ===\nResultado: {resultado}")
172221
jogo.logger.log_batalha(f"Resultado: {resultado}")
@@ -203,6 +252,7 @@ def usar_item_em_combate(jogador, jogo):
203252

204253
jogador.vida += item.valor
205254
print(f"Você usou {item.nome} e recuperou {item.valor} HP!")
255+
206256
jogo.logger.log_batalha(f"{jogador.nome} usou {item.nome} (+{item.valor} HP).")
207257
inventario.remover_item(item)
208258

@@ -215,5 +265,6 @@ def usar_item_em_combate(jogador, jogo):
215265
def ajuda_missao() -> None:
216266
print("\nAjuda — Missão")
217267
print("- Selecione dificuldade e cenário.")
218-
print("- Durante a missão, use [1] Atacar, [2] Usar item, [3] Fugir.")
219-
print("- Poções curam HP fixo.")
268+
print("- Cada cenário tem seus inimigos específicos.")
269+
print("- Dificuldade aumenta vida, ataque e defesa do inimigo.")
270+
print("- Use poções no combate quando necessário.")

0 commit comments

Comments
 (0)