diff --git a/card_catalog.py b/card_catalog.py
index a4668c42..84b9f93c 100644
--- a/card_catalog.py
+++ b/card_catalog.py
@@ -511,7 +511,11 @@ def upgrade(self):
def apply(self, origin, target):
origin.attack(target, self)
- origin.draw_pile.insert(random.randint(0, len(origin.draw_pile) - 1), Wound())
+ # Handle when the player has no draw pile
+ if len(origin.draw_pile) == 0:
+ origin.draw_pile.append(Wound())
+ else:
+ origin.draw_pile.insert(random.randint(0, len(origin.draw_pile) - 1), Wound())
class BattleTrance(Card):
def __init__(self):
diff --git a/effect_catalog.py b/effect_catalog.py
index 978953fe..31a660d7 100644
--- a/effect_catalog.py
+++ b/effect_catalog.py
@@ -335,15 +335,18 @@ def __init__(self, host, amount):
"Combust",
StackType.INTENSITY,
EffectType.BUFF,
- "At the end of your turn, deals X damage to ALL enemies.",
+ f"At the end of your turn, lose 1 HP and deals {amount} damage to ALL enemies.",
amount,
)
def callback(self, message, data: tuple[Player, list[Enemy]]):
if message == Message.END_OF_TURN:
player, enemies = data
+ player.take_sourceless_dmg(1)
for enemy in enemies:
- enemy.health -= self.amount
+ ansiprint(f"{enemy.name} took {self.amount} damage from Combust.")
+ enemy.take_sourceless_dmg(self.amount)
+
class DarkEmbrace(Effect):
@@ -424,7 +427,7 @@ def callback(self, message, data: tuple[Player, Card, Enemy, list[Enemy]]):
player, card, target, enemies = data
if card.type == CardType.ATTACK:
for enemy in enemies:
- enemy.health -= self.amount
+ enemy.take_sourceless_dmg(self.amount)
ansiprint(
f"{enemy.name} took {self.amount} damage from Fire Breathing."
)
@@ -432,7 +435,7 @@ def callback(self, message, data: tuple[Player, Card, Enemy, list[Enemy]]):
class FlameBarrier(Effect):
# "Gain 12 Block. Whenever you're attacked this turn, deal 4 damage back."
- registers = [Message.ON_ATTACKED]
+ registers = [Message.AFTER_ATTACK]
def __init__(self, host, amount):
super().__init__(
@@ -444,10 +447,12 @@ def __init__(self, host, amount):
amount,
)
- def callback(self, message, data):
- if message == Message.ON_ATTACKED:
- target = data
- target.health -= 4
+ def callback(self, message, data: tuple[Player|Enemy, Player|Enemy, int]):
+ if message == Message.AFTER_ATTACK:
+ attacker, victim, damage = data
+ if victim == self.host:
+ ansiprint(f"{attacker.name} took 4 damage from {victim.name}'s Flame Barrier.")
+ attacker.take_sourceless_dmg(4)
class Metallicize(Effect):
diff --git a/enemy.py b/enemy.py
index 7f4807a2..f7e2d6ac 100644
--- a/enemy.py
+++ b/enemy.py
@@ -282,6 +282,11 @@ def take_turn(self, player: Player, enemies: list["Enemy"]):
if self.state == State.ALIVE:
self.execute_move(player, enemies)
+ def take_sourceless_dmg(self, dmg):
+ self.health -= dmg
+ if self.health <= 0:
+ self.die()
+
def callback(self, message, data):
global bus
if message == Message.START_OF_TURN:
diff --git a/tests/test_game.py b/tests/test_game.py
index 8c341c41..36a28283 100644
--- a/tests/test_game.py
+++ b/tests/test_game.py
@@ -100,7 +100,7 @@ def patched_input(*args, **kwargs):
@pytest.mark.timeout(10)
-@pytest.mark.parametrize("seed", list(range(30)))
+@pytest.mark.parametrize("seed", list(range(50)))
def test_e2e(seed, monkeypatch, sleepless):
'''Test the game from start to finish
Plays with (more or less) random inputs to test the game.