1
+ from ast import For
1
2
from typing import List
2
3
import random
3
4
from colorama import Fore , Style
@@ -87,13 +88,16 @@ def get_spell(self) -> tuple:
87
88
selected_spell = spells [option_i - 1 ]
88
89
_ , _ , _ , energia_arcana , * _ = selected_spell
89
90
90
-
91
+ # Energia_arcana != None
92
+ energia_arcana = energia_arcana if energia_arcana is not None else 0
93
+
91
94
if energia_arcana > self .character .energia_arcana :
92
95
print (Fore .RED + "Energia Arcana insuficiente!" + Style .RESET_ALL )
93
96
display .press_enter ()
94
97
continue
95
98
# To-do: Add to query
96
- self .character .energia_arcana = query .update_mp (self .conn , self .character .id , energia_arcana )
99
+ self .character .energia_arcana -= energia_arcana
100
+ self .character .energia_arcana = query .update_mp (self .conn , self .character .id , self .character .energia_arcana )
97
101
break
98
102
99
103
return selected_spell
@@ -108,7 +112,7 @@ def apply_spell_effect(self, spell) -> None:
108
112
# ..
109
113
# To-do: debug test...
110
114
# ..
111
- debug (tipo , energia_arcana )
115
+ debug (f" tipo do feitiço: { tipo } , qtd_energia: { energia_arcana } " )
112
116
display .press_enter ()
113
117
114
118
if tipo == 'Dano' :
@@ -117,9 +121,10 @@ def apply_spell_effect(self, spell) -> None:
117
121
118
122
119
123
elif tipo == 'Dano de área' :
120
- enemy = self .select_enemy ()
121
- debug ('to-do: area damage' )
122
- display .press_enter ()
124
+ # enemy = self.select_enemy()
125
+ # debug('to-do: area damage')
126
+ # display.press_enter()
127
+ self .apply_area_damage_spell (spell )
123
128
124
129
125
130
elif tipo == 'Cura' :
@@ -128,19 +133,30 @@ def apply_spell_effect(self, spell) -> None:
128
133
# Functionality:
129
134
# Returns true if enemy was killed.
130
135
def apply_damage_spell (self , spell , enemy ) -> bool :
131
- damage = spell [3 ]
136
+ damage = spell [4 ]
132
137
133
138
damage *= self .advantage_element (self .character .elemento , enemy .elemento )
134
139
135
140
enemy .vida = min (enemy .vida - damage , 0 )
136
141
137
142
# To-do: put this into a interface file.
138
143
print (f"{ Fore .BLUE } Foi conjurado { spell [0 ]} causando { damage } de dano! { Style .RESET_ALL } " )
139
-
140
144
return enemy .vida <= 0
141
145
142
146
# Functionality:
143
147
# Apply area damage spell
148
+ def apply_area_damage_spell (self , spell ):
149
+ nome , _ , _ , _ , dano , qtd_inimigos_afetados = spell
150
+ print (f"{ Fore .MAGENTA } { nome } foi conjurado! { Style .RESET_ALL } " )
151
+
152
+ # filter enemies alive and random chose enemies
153
+ alive_enemies = [enemy for enemy in self .enemies if enemy .vida > 0 ]
154
+ affected_enemies = random .sample (alive_enemies , min (qtd_inimigos_afetados , len (alive_enemies )))
155
+
156
+ for enemy in affected_enemies :
157
+ final_damage = dano * self .advantage_element (self .character .elemento , enemy .elemento )
158
+ enemy .vida = max (enemy .vida - final_damage , 0 )
159
+ print (f"{ Fore .BLUE } { enemy .nome } recebeu { final_damage } de dano! { Style .RESET_ALL } " )
144
160
145
161
# Functionality:
146
162
# Apply recover from healing spell
@@ -157,6 +173,20 @@ def enemy_delay(self):
157
173
print (Style .BRIGHT + Fore .YELLOW + "..." + Style .RESET_ALL )
158
174
time .sleep (1 )
159
175
176
+ # Functionality
177
+ # Enemy turn
178
+ def enemy_turn (self ):
179
+ print (Style .BRIGHT + Fore .YELLOW + "Os inimigos estão atacando!!!" + Style .RESET_ALL )
180
+ time .sleep (1 )
181
+
182
+ for enemy in self .enemies :
183
+ if enemy .vida > 0 :
184
+ damage = random .randint (3 , 10 )
185
+ damage *= self .advantage_element (enemy .elemento , self .character .elemento )
186
+ self .character .vida = max (self .character .vida - damage , 0 )
187
+
188
+ print (f"{ Fore .RED } { enemy .nome } te atacou e causou { damage } de dano! { Style .RESET_ALL } " )
189
+
160
190
# Functionality:
161
191
# Select and returns an enemy.
162
192
def select_enemy (self ) -> Enemy :
@@ -170,6 +200,19 @@ def select_enemy(self) -> Enemy:
170
200
], False )
171
201
return self .enemies [enemy_i - 1 ]
172
202
203
+ # Functionality
204
+ # check if combat has terminated
205
+ def check_combat_end (self ):
206
+ if self .character .vida <= 0 :
207
+ print (Fore .RED + "Você foi derrotado..." + Style .RESET_ALL )
208
+ return True
209
+
210
+ if all (enemy .vida <= 0 for enemy in self .enemies ):
211
+ print (Fore .GREEN + "Todos os inimigos foram derrotados!" + Style .RESET_ALL )
212
+ return True
213
+
214
+ return False
215
+
173
216
# Logic:
174
217
# True: if the player ran away or won the combat
175
218
# False: if the player died.
@@ -221,17 +264,18 @@ def init(self):
221
264
222
265
debug (self .character .energia_arcana )
223
266
display .press_enter ()
224
-
225
- # to-do:
226
- query .update_combat (self .conn , self .enemies , self .character )
227
-
228
267
229
268
elif option == "Usar Poção" :
230
269
debug ("to-do: usar poção" )
231
270
display .press_enter ()
232
-
233
- # ---
234
- # ....
235
- # To-do: enemies turn.
271
+
272
+ query . update_combat ( self . conn , self . enemies , self . character )
273
+ if self . check_combat_end ():
274
+ return True
236
275
276
+ self .enemy_turn ()
277
+
278
+ if self .check_combat_end ():
279
+ return True
280
+
237
281
return True
0 commit comments