From acec475f69a073ff12aaf50c7250dae548ea5cc5 Mon Sep 17 00:00:00 2001 From: jackswitzer Date: Wed, 4 Feb 2026 12:13:09 -0500 Subject: [PATCH] Implement InnerPeace if_calm_draw_else_calm effect - Add canonical effect key `if_calm_draw_else_calm` for InnerPeace card - Keep `if_calm_draw_3_else_calm` as backwards-compatible alias - Update WATCHER_CARD_EFFECTS mapping to use canonical key - Add comprehensive tests for canonical effect: - Test: In Calm stance draws 3 cards (base) - Test: In Calm stance draws 4 cards (upgraded) - Test: From Neutral/Wrath enters Calm stance - Fix conftest.py to use dynamic project root path for worktrees Co-Authored-By: Claude Opus 4.5 --- packages/engine/effects/cards.py | 13 +++++++++--- packages/engine/effects/executor.py | 3 ++- tests/conftest.py | 6 ++++-- tests/test_watcher_card_effects.py | 32 ++++++++++++++++++++++++++--- 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/packages/engine/effects/cards.py b/packages/engine/effects/cards.py index dafe66d..5b1c73a 100644 --- a/packages/engine/effects/cards.py +++ b/packages/engine/effects/cards.py @@ -430,9 +430,9 @@ def if_in_wrath_extra_block(ctx: EffectContext) -> None: ctx.gain_block(extra) -@effect_simple("if_calm_draw_3_else_calm") +@effect_simple("if_calm_draw_else_calm") def if_calm_draw_else_calm(ctx: EffectContext) -> None: - """If in Calm draw 3, else enter Calm (Inner Peace).""" + """If in Calm draw 3/4, else enter Calm (Inner Peace).""" if ctx.stance == "Calm": amount = 4 if ctx.is_upgraded else 3 ctx.draw_cards(amount) @@ -440,6 +440,13 @@ def if_calm_draw_else_calm(ctx: EffectContext) -> None: ctx.change_stance("Calm") +# Alias for backwards compatibility +@effect_simple("if_calm_draw_3_else_calm") +def _if_calm_draw_else_calm_alias(ctx: EffectContext) -> None: + """Alias for if_calm_draw_else_calm.""" + if_calm_draw_else_calm(ctx) + + @effect_simple("if_wrath_gain_mantra_else_wrath") def if_wrath_gain_mantra_else_wrath(ctx: EffectContext) -> None: """If in Wrath gain mantra, else enter Wrath (Indignation).""" @@ -1152,7 +1159,7 @@ def hand_of_greed_effect(ctx: EffectContext) -> None: "EmptyMind": ["draw_cards", "exit_stance"], "Evaluate": ["add_insight_to_draw"], "Halt": ["if_in_wrath_extra_block_6"], - "InnerPeace": ["if_calm_draw_3_else_calm"], + "InnerPeace": ["if_calm_draw_else_calm"], "PathToVictory": ["apply_mark", "trigger_all_marks"], # Pressure Points "Protect": [], # Just block + retain "ThirdEye": ["scry"], diff --git a/packages/engine/effects/executor.py b/packages/engine/effects/executor.py index c99ccc3..2f43e84 100644 --- a/packages/engine/effects/executor.py +++ b/packages/engine/effects/executor.py @@ -389,7 +389,8 @@ def _handle_conditional_last_card(self, ctx: EffectContext, card: Card, result: "if_enemy_attacking_enter_calm": lambda s, c, cd, r: c.change_stance("Calm") if c.is_enemy_attacking() else None, # Calm/Wrath conditionals - "if_calm_draw_3_else_calm": lambda s, c, cd, r: c.draw_cards(4 if c.is_upgraded else 3) if c.stance == "Calm" else c.change_stance("Calm"), + "if_calm_draw_else_calm": lambda s, c, cd, r: c.draw_cards(4 if c.is_upgraded else 3) if c.stance == "Calm" else c.change_stance("Calm"), + "if_calm_draw_3_else_calm": lambda s, c, cd, r: c.draw_cards(4 if c.is_upgraded else 3) if c.stance == "Calm" else c.change_stance("Calm"), # Alias "if_wrath_gain_mantra_else_wrath": lambda s, c, cd, r: c.gain_mantra(5 if c.is_upgraded else 3) if c.stance == "Wrath" else c.change_stance("Wrath"), # Damage effects diff --git a/tests/conftest.py b/tests/conftest.py index 981fe19..9924c60 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,9 +10,11 @@ import pytest import sys +import os -# Ensure project root is in path -sys.path.insert(0, '/Users/jackswitzer/Desktop/SlayTheSpireRL') +# Ensure project root is in path (use the directory containing this conftest.py) +_PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, _PROJECT_ROOT) from packages.engine.state.combat import ( CombatState, EntityState, EnemyCombatState, diff --git a/tests/test_watcher_card_effects.py b/tests/test_watcher_card_effects.py index b024e9e..494dffd 100644 --- a/tests/test_watcher_card_effects.py +++ b/tests/test_watcher_card_effects.py @@ -15,12 +15,10 @@ """ import pytest -import sys -sys.path.insert(0, '/Users/jackswitzer/Desktop/SlayTheSpireRL') from packages.engine.state.combat import CombatState, EntityState, EnemyCombatState from packages.engine.effects.registry import EffectContext, execute_effect -from packages.engine.effects import cards as card_effects +from packages.engine.effects import cards as card_effects # noqa: F401 - imports to register effects from packages.engine.content.cards import get_card, CardType @@ -205,6 +203,34 @@ def test_inner_peace_not_in_calm_enters_calm(self, ctx_basic): execute_effect("if_calm_draw_3_else_calm", ctx_basic) assert ctx_basic.stance == "Calm" + def test_inner_peace_canonical_effect_in_calm(self, ctx_basic): + """Inner Peace canonical effect (if_calm_draw_else_calm) draws 3 in Calm.""" + ctx_basic.state.stance = "Calm" + ctx_basic.is_upgraded = False + initial_hand = len(ctx_basic.hand) + execute_effect("if_calm_draw_else_calm", ctx_basic) + assert len(ctx_basic.hand) == initial_hand + 3 + + def test_inner_peace_canonical_effect_not_in_calm(self, ctx_basic): + """Inner Peace canonical effect enters Calm from Neutral.""" + ctx_basic.state.stance = "Neutral" + execute_effect("if_calm_draw_else_calm", ctx_basic) + assert ctx_basic.stance == "Calm" + + def test_inner_peace_upgraded_draws_4(self, ctx_basic): + """Inner Peace upgraded draws 4 cards in Calm.""" + ctx_basic.state.stance = "Calm" + ctx_basic.is_upgraded = True + initial_hand = len(ctx_basic.hand) + execute_effect("if_calm_draw_else_calm", ctx_basic) + assert len(ctx_basic.hand) == initial_hand + 4 + + def test_inner_peace_from_wrath_enters_calm(self, ctx_basic): + """Inner Peace from Wrath stance enters Calm.""" + ctx_basic.state.stance = "Wrath" + execute_effect("if_calm_draw_else_calm", ctx_basic) + assert ctx_basic.stance == "Calm" + def test_indignation_in_wrath_gains_mantra(self, ctx_basic): """Indignation in Wrath gains 3 mantra.""" ctx_basic.state.stance = "Wrath"