From 77b927c33d3b8b401c87005395347468059bf179 Mon Sep 17 00:00:00 2001 From: Guillermo Etchebarne Date: Mon, 4 May 2026 20:49:40 -0300 Subject: [PATCH 1/4] Update Escape Plan to use id_source --- src/engine/mod.rs | 1 + src/engine/process_effect_escape_plan_check.rs | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/engine/mod.rs b/src/engine/mod.rs index 74be92d7..44e58feb 100644 --- a/src/engine/mod.rs +++ b/src/engine/mod.rs @@ -557,6 +557,7 @@ fn dispatch_by_kind( process_effect_escape_plan_check::process_effect_escape_plan_check( &state.entities, state.id_character, + id_source, &mut state.card_last_drawn, block, &mut state.effect_queue, diff --git a/src/engine/process_effect_escape_plan_check.rs b/src/engine/process_effect_escape_plan_check.rs index ea7864b2..de75b2de 100644 --- a/src/engine/process_effect_escape_plan_check.rs +++ b/src/engine/process_effect_escape_plan_check.rs @@ -7,24 +7,27 @@ use crate::types::CardKind; // EscapePlan post-draw check: if the last card drawn (set by CardDraw) is a // Skill, gain `block`. Consumes `state.card_last_drawn` so it can't fire on -// stale state if it runs again later +// stale state if it runs again later. `id_source` is the Escape Plan card +// (propagated from the dispatched EscapePlanCheck effect) — forwarded onto +// the BlockGain so it dispatches as card-driven (Dexterity / Frail apply) pub fn process_effect_escape_plan_check( entities: &[Entity], id_character: usize, + id_source: Option, card_last_drawn: &mut Option, block: u16, queue: &mut VecDeque, ) -> DispatchResult { - let id_card = match card_last_drawn.take() { + let id_drawn = match card_last_drawn.take() { Some(id) => id, None => return DispatchResult::Continue, }; - if entities[id_card].card_kind != CardKind::Skill { + if entities[id_drawn].card_kind != CardKind::Skill { return DispatchResult::Continue; } queue.push_front(Effect { kind: EffectKind::BlockGain { amount: block }, - id_source: Some(id_character), + id_source, target: Target::Direct(Some(id_character)), }); DispatchResult::Continue From 547df9a3c9b2a2d4eff9af51b7a39731326095a7 Mon Sep 17 00:00:00 2001 From: Guillermo Etchebarne Date: Mon, 4 May 2026 20:52:52 -0300 Subject: [PATCH 2/4] Fix negative dex and str artifact block --- src/engine/process_effect_card_play.rs | 17 ++++++++--------- src/engine/process_effect_modifier_gain.rs | 6 +++--- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/engine/process_effect_card_play.rs b/src/engine/process_effect_card_play.rs index 32a225e2..f2b039d9 100644 --- a/src/engine/process_effect_card_play.rs +++ b/src/engine/process_effect_card_play.rs @@ -3,7 +3,7 @@ use std::collections::VecDeque; use crate::effect::{Effect, EffectKind, Target}; use crate::engine::{DispatchResult, EffectBuf}; use crate::entity::{CardCostKind, Entity, card_effective_cost}; -use crate::modifier::{ModifierKind, modifier_has, modifier_stacks}; +use crate::modifier::{ModifierKind, modifier_def, modifier_has, modifier_remove, modifier_stacks}; use crate::types::CardKind; pub fn process_effect_card_play( @@ -129,14 +129,13 @@ pub fn process_effect_card_play( } } if burst { - buf_effects.push(Effect { - kind: EffectKind::ModifierGain { - kind: ModifierKind::Burst, - stacks: -1, - }, - id_source: Some(id_character), - target: Target::Direct(Some(id_character)), - }); + let mods = &mut entities[id_character].modifiers; + let stacks_new = modifier_stacks(mods, ModifierKind::Burst) - 1; + if stacks_new < modifier_def(ModifierKind::Burst).stacks_min { + modifier_remove(mods, ModifierKind::Burst); + } else { + mods.stacks[ModifierKind::Burst as usize] = stacks_new; + } } // Choke: pushed after card_effects so the played card resolves first diff --git a/src/engine/process_effect_modifier_gain.rs b/src/engine/process_effect_modifier_gain.rs index 0edc1aec..fed0d838 100644 --- a/src/engine/process_effect_modifier_gain.rs +++ b/src/engine/process_effect_modifier_gain.rs @@ -19,9 +19,9 @@ pub fn process_effect_modifier_gain( } // Check artifact - // TODO: should block Sihpon Soul - if stacks > 0 && !modifier_def(kind).is_buff && modifier_has(modifiers, ModifierKind::Artifact) - { + let is_buff = modifier_def(kind).is_buff; + let is_debuff_attempt = (stacks > 0 && !is_buff) || (stacks < 0 && is_buff); + if is_debuff_attempt && modifier_has(modifiers, ModifierKind::Artifact) { let stacks_new = modifier_stacks(modifiers, ModifierKind::Artifact) - 1; if stacks_new < modifier_def(ModifierKind::Artifact).stacks_min { modifier_remove(modifiers, ModifierKind::Artifact); From 6d6592d691360e7acde4b659080c819c43488166 Mon Sep 17 00:00:00 2001 From: Guillermo Etchebarne Date: Mon, 4 May 2026 21:01:15 -0300 Subject: [PATCH 3/4] Remove DamageCondition --- src/cards/all_out_attack.rs | 12 +-- src/cards/backstab.rs | 12 +-- src/cards/bane.rs | 22 +--- src/cards/choke.rs | 7 +- src/cards/dagger_spray.rs | 12 +-- src/cards/dagger_throw.rs | 12 +-- src/cards/dash.rs | 12 +-- src/cards/die_die_die.rs | 12 +-- src/cards/endless_agony.rs | 12 +-- src/cards/eviscerate.rs | 22 +--- src/cards/flying_knee.rs | 12 +-- src/cards/glass_knife.rs | 17 +-- src/cards/grand_finale.rs | 12 +-- src/cards/heel_hook.rs | 12 +-- src/cards/masterful_stab.rs | 12 +-- src/cards/neutralize.rs | 12 +-- src/cards/poisoned_stab.rs | 12 +-- src/cards/predator.rs | 12 +-- src/cards/quick_slash.rs | 12 +-- src/cards/riddle_with_holes.rs | 12 +-- src/cards/shiv.rs | 12 +-- src/cards/skewer.rs | 12 +-- src/cards/slice.rs | 12 +-- src/cards/sneaky_strike.rs | 12 +-- src/cards/strike.rs | 12 +-- src/cards/sucker_punch.rs | 12 +-- src/cards/unload.rs | 12 +-- src/effect.rs | 11 +- src/engine/mod.rs | 16 ++- src/engine/process_effect_damage_physical.rs | 22 ++-- src/engine/process_effect_finisher_damage.rs | 7 +- .../process_effect_flechettes_damage.rs | 7 +- .../process_effect_hexaghost_divider.rs | 7 +- src/engine/process_effect_turn_end.rs | 10 +- src/ffi.rs | 10 +- src/monsters/cultist.rs | 7 +- src/monsters/fungi_beast.rs | 7 +- src/monsters/gremlin_fat.rs | 17 +-- src/monsters/gremlin_nob.rs | 22 +--- src/monsters/gremlin_thief.rs | 12 +-- src/monsters/gremlin_tsundere.rs | 12 +-- src/monsters/gremlin_warrior.rs | 12 +-- src/monsters/gremlin_wizard.rs | 12 +-- src/monsters/hexaghost.rs | 102 ++++-------------- src/monsters/jaw_worm.rs | 17 +-- src/monsters/lagavulin.rs | 12 +-- src/monsters/looter.rs | 22 +--- src/monsters/louse_green.rs | 22 +--- src/monsters/louse_red.rs | 22 +--- src/monsters/sentry.rs | 12 +-- src/monsters/slaver_blue.rs | 27 ++--- src/monsters/slaver_red.rs | 27 ++--- src/monsters/slime_acid_large.rs | 22 +--- src/monsters/slime_acid_medium.rs | 22 +--- src/monsters/slime_acid_small.rs | 12 +-- src/monsters/slime_boss.rs | 12 +-- src/monsters/slime_spike_large.rs | 12 +-- src/monsters/slime_spike_medium.rs | 12 +-- src/monsters/slime_spike_small.rs | 12 +-- src/monsters/the_guardian.rs | 72 +++---------- 60 files changed, 246 insertions(+), 728 deletions(-) diff --git a/src/cards/all_out_attack.rs b/src/cards/all_out_attack.rs index 82a81426..04964a03 100644 --- a/src/cards/all_out_attack.rs +++ b/src/cards/all_out_attack.rs @@ -1,5 +1,5 @@ use crate::effect::{ - CandidatePool, DamageCondition, DiscardSource, Effect, EffectKind, SelectionKind, Target, + CandidatePool, DiscardSource, Effect, EffectKind, SelectionKind, Target, }; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -18,10 +18,7 @@ pub static ALL_OUT_ATTACK: Entity = make_entity_card( false, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 10, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 10 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Monsters, @@ -48,10 +45,7 @@ pub static ALL_OUT_ATTACK_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = ALL_OUT_ATTACK.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 14, // +4 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 14 }; // +4 damage a }, ..ALL_OUT_ATTACK diff --git a/src/cards/backstab.rs b/src/cards/backstab.rs index 3879877f..cc7cb4cb 100644 --- a/src/cards/backstab.rs +++ b/src/cards/backstab.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -15,10 +15,7 @@ pub static BACKSTAB: Entity = make_entity_card( true, true, &[Effect { - kind: EffectKind::DamagePhysical { - amount: 11, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 11 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -34,10 +31,7 @@ pub static BACKSTAB_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = BACKSTAB.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 15, // +4 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 15 }; // +4 damage a }, ..BACKSTAB diff --git a/src/cards/bane.rs b/src/cards/bane.rs index 923574f7..ac6b657a 100644 --- a/src/cards/bane.rs +++ b/src/cards/bane.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -16,10 +16,7 @@ pub static BANE: Entity = make_entity_card( true, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 7, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 7 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -27,10 +24,7 @@ pub static BANE: Entity = make_entity_card( }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 7, - condition: DamageCondition::IfPoisoned, - }, + kind: EffectKind::DamagePhysicalIfPoisoned { amount: 7 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -47,14 +41,8 @@ pub static BANE_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = BANE.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 10, // +3 - condition: DamageCondition::Always, - }; - a[1].kind = EffectKind::DamagePhysical { - amount: 10, // +3 - condition: DamageCondition::IfPoisoned, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 10 }; // +3 + a[1].kind = EffectKind::DamagePhysicalIfPoisoned { amount: 10 }; // +3 a }, ..BANE diff --git a/src/cards/choke.rs b/src/cards/choke.rs index 79fe41fe..703f34f2 100644 --- a/src/cards/choke.rs +++ b/src/cards/choke.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -17,10 +17,7 @@ pub static CHOKE: Entity = make_entity_card( true, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 12, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 12 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, diff --git a/src/cards/dagger_spray.rs b/src/cards/dagger_spray.rs index 06655d0a..5cc59517 100644 --- a/src/cards/dagger_spray.rs +++ b/src/cards/dagger_spray.rs @@ -1,12 +1,9 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; const HIT: Effect = Effect { - kind: EffectKind::DamagePhysical { - amount: 4, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 4 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Monsters, @@ -14,10 +11,7 @@ const HIT: Effect = Effect { }, }; const HIT_PLUS: Effect = Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, // +2 damage + kind: EffectKind::DamagePhysical { amount: 6 }, // +2 damage id_source: None, target: Target::Resolve { candidates: CandidatePool::Monsters, diff --git a/src/cards/dagger_throw.rs b/src/cards/dagger_throw.rs index 29b3c8f2..3bcae62f 100644 --- a/src/cards/dagger_throw.rs +++ b/src/cards/dagger_throw.rs @@ -1,5 +1,5 @@ use crate::effect::{ - CandidatePool, DamageCondition, DiscardSource, Effect, EffectKind, SelectionKind, Target, + CandidatePool, DiscardSource, Effect, EffectKind, SelectionKind, Target, }; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -18,10 +18,7 @@ pub static DAGGER_THROW: Entity = make_entity_card( true, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 9, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 9 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -53,10 +50,7 @@ pub static DAGGER_THROW_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = DAGGER_THROW.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 12, // +3 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 12 }; // +3 damage a }, ..DAGGER_THROW diff --git a/src/cards/dash.rs b/src/cards/dash.rs index 6adcd41f..2c786fa3 100644 --- a/src/cards/dash.rs +++ b/src/cards/dash.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -24,10 +24,7 @@ pub static DASH: Entity = make_entity_card( }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 10, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 10 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -45,10 +42,7 @@ pub static DASH_PLUS: Entity = Entity { card_effects: { let mut a = DASH.card_effects; a[0].kind = EffectKind::BlockGain { amount: 13 }; // +3 block - a[1].kind = EffectKind::DamagePhysical { - amount: 13, // +3 damage - condition: DamageCondition::Always, - }; + a[1].kind = EffectKind::DamagePhysical { amount: 13 }; // +3 damage a }, ..DASH diff --git a/src/cards/die_die_die.rs b/src/cards/die_die_die.rs index 9e4b1ae6..ac906b61 100644 --- a/src/cards/die_die_die.rs +++ b/src/cards/die_die_die.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -15,10 +15,7 @@ pub static DIE_DIE_DIE: Entity = make_entity_card( false, false, &[Effect { - kind: EffectKind::DamagePhysical { - amount: 13, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 13 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Monsters, @@ -34,10 +31,7 @@ pub static DIE_DIE_DIE_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = DIE_DIE_DIE.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 17, // +4 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 17 }; // +4 damage a }, ..DIE_DIE_DIE diff --git a/src/cards/endless_agony.rs b/src/cards/endless_agony.rs index 2c7740db..cb126aa6 100644 --- a/src/cards/endless_agony.rs +++ b/src/cards/endless_agony.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -26,10 +26,7 @@ pub static ENDLESS_AGONY: Entity = make_entity_card( false, true, &[Effect { - kind: EffectKind::DamagePhysical { - amount: 4, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 4 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -45,10 +42,7 @@ pub static ENDLESS_AGONY_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = ENDLESS_AGONY.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 6, // +2 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 6 }; // +2 damage a }, card_on_draw_effects: ENDLESS_AGONY_PLUS_ON_DRAW, diff --git a/src/cards/eviscerate.rs b/src/cards/eviscerate.rs index 1ac5b551..b2319486 100644 --- a/src/cards/eviscerate.rs +++ b/src/cards/eviscerate.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -16,10 +16,7 @@ pub static EVISCERATE: Entity = make_entity_card( true, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 7, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 7 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -27,10 +24,7 @@ pub static EVISCERATE: Entity = make_entity_card( }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 7, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 7 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -38,10 +32,7 @@ pub static EVISCERATE: Entity = make_entity_card( }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 7, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 7 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -58,10 +49,7 @@ pub static EVISCERATE_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = EVISCERATE.card_effects; - let upgraded_kind = EffectKind::DamagePhysical { - amount: 9, // +2 damage - condition: DamageCondition::Always, - }; + let upgraded_kind = EffectKind::DamagePhysical { amount: 9 }; // +2 damage a[0].kind = upgraded_kind; a[1].kind = upgraded_kind; a[2].kind = upgraded_kind; diff --git a/src/cards/flying_knee.rs b/src/cards/flying_knee.rs index d0f27e58..0df7ef4e 100644 --- a/src/cards/flying_knee.rs +++ b/src/cards/flying_knee.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -17,10 +17,7 @@ pub static FLYING_KNEE: Entity = make_entity_card( true, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -48,10 +45,7 @@ pub static FLYING_KNEE_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = FLYING_KNEE.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 11, // +3 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 11 }; // +3 damage a }, ..FLYING_KNEE diff --git a/src/cards/glass_knife.rs b/src/cards/glass_knife.rs index 1658c8b7..1d8bafac 100644 --- a/src/cards/glass_knife.rs +++ b/src/cards/glass_knife.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -16,10 +16,7 @@ pub static GLASS_KNIFE: Entity = make_entity_card( true, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -27,10 +24,7 @@ pub static GLASS_KNIFE: Entity = make_entity_card( }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -52,10 +46,7 @@ pub static GLASS_KNIFE_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = GLASS_KNIFE.card_effects; - let upgraded_kind = EffectKind::DamagePhysical { - amount: 12, // +4 damage - condition: DamageCondition::Always, - }; + let upgraded_kind = EffectKind::DamagePhysical { amount: 12 }; // +4 damage a[0].kind = upgraded_kind; a[1].kind = upgraded_kind; a diff --git a/src/cards/grand_finale.rs b/src/cards/grand_finale.rs index 190ee315..65acf591 100644 --- a/src/cards/grand_finale.rs +++ b/src/cards/grand_finale.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -15,10 +15,7 @@ pub static GRAND_FINALE: Entity = make_entity_card( false, false, &[Effect { - kind: EffectKind::DamagePhysical { - amount: 50, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 50 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Monsters, @@ -34,10 +31,7 @@ pub static GRAND_FINALE_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = GRAND_FINALE.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 60, // +10 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 60 }; // +10 damage a }, ..GRAND_FINALE diff --git a/src/cards/heel_hook.rs b/src/cards/heel_hook.rs index e197fa30..62bf4b30 100644 --- a/src/cards/heel_hook.rs +++ b/src/cards/heel_hook.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -16,10 +16,7 @@ pub static HEEL_HOOK: Entity = make_entity_card( true, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 5, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 5 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -44,10 +41,7 @@ pub static HEEL_HOOK_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = HEEL_HOOK.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 8, // +3 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 8 }; // +3 damage a }, ..HEEL_HOOK diff --git a/src/cards/masterful_stab.rs b/src/cards/masterful_stab.rs index 609ab732..1eea1d5d 100644 --- a/src/cards/masterful_stab.rs +++ b/src/cards/masterful_stab.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -15,10 +15,7 @@ pub static MASTERFUL_STAB: Entity = make_entity_card( false, true, &[Effect { - kind: EffectKind::DamagePhysical { - amount: 12, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 12 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -34,10 +31,7 @@ pub static MASTERFUL_STAB_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = MASTERFUL_STAB.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 16, // +4 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 16 }; // +4 damage a }, ..MASTERFUL_STAB diff --git a/src/cards/neutralize.rs b/src/cards/neutralize.rs index 4483ea8b..5c2f4850 100644 --- a/src/cards/neutralize.rs +++ b/src/cards/neutralize.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -17,10 +17,7 @@ pub static NEUTRALIZE: Entity = make_entity_card( true, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 3, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 3 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -48,10 +45,7 @@ pub static NEUTRALIZE_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = NEUTRALIZE.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 4, // +1 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 4 }; // +1 damage a[1].kind = EffectKind::ModifierGain { kind: ModifierKind::Weak, stacks: 2, // +1 stack diff --git a/src/cards/poisoned_stab.rs b/src/cards/poisoned_stab.rs index 46982b20..51e7dae3 100644 --- a/src/cards/poisoned_stab.rs +++ b/src/cards/poisoned_stab.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -17,10 +17,7 @@ pub static POISONED_STAB: Entity = make_entity_card( true, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -48,10 +45,7 @@ pub static POISONED_STAB_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = POISONED_STAB.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 8, // +2 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 8 }; // +2 damage a[1].kind = EffectKind::ModifierGain { kind: ModifierKind::Poison, stacks: 4, // +1 poison diff --git a/src/cards/predator.rs b/src/cards/predator.rs index 25951371..d64105c2 100644 --- a/src/cards/predator.rs +++ b/src/cards/predator.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -17,10 +17,7 @@ pub static PREDATOR: Entity = make_entity_card( true, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 15, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 15 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -48,10 +45,7 @@ pub static PREDATOR_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = PREDATOR.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 20, // +5 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 20 }; // +5 damage a }, ..PREDATOR diff --git a/src/cards/quick_slash.rs b/src/cards/quick_slash.rs index bd71fec7..c06acda5 100644 --- a/src/cards/quick_slash.rs +++ b/src/cards/quick_slash.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -16,10 +16,7 @@ pub static QUICK_SLASH: Entity = make_entity_card( true, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -41,10 +38,7 @@ pub static QUICK_SLASH_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = QUICK_SLASH.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 12, // +4 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 12 }; // +4 damage a }, ..QUICK_SLASH diff --git a/src/cards/riddle_with_holes.rs b/src/cards/riddle_with_holes.rs index 2d604a49..95ef57b1 100644 --- a/src/cards/riddle_with_holes.rs +++ b/src/cards/riddle_with_holes.rs @@ -1,12 +1,9 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; const HIT: Effect = Effect { - kind: EffectKind::DamagePhysical { - amount: 3, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 3 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -14,10 +11,7 @@ const HIT: Effect = Effect { }, }; const HIT_PLUS: Effect = Effect { - kind: EffectKind::DamagePhysical { - amount: 4, - condition: DamageCondition::Always, - }, // +1 damage + kind: EffectKind::DamagePhysical { amount: 4 }, // +1 damage id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, diff --git a/src/cards/shiv.rs b/src/cards/shiv.rs index 6df2c435..4286f3b9 100644 --- a/src/cards/shiv.rs +++ b/src/cards/shiv.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -15,10 +15,7 @@ pub static SHIV: Entity = make_entity_card( false, true, &[Effect { - kind: EffectKind::DamagePhysical { - amount: 4, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 4 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -34,10 +31,7 @@ pub static SHIV_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = SHIV.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 6, // +2 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 6 }; // +2 damage a }, ..SHIV diff --git a/src/cards/skewer.rs b/src/cards/skewer.rs index 705fdcdd..ad0b3b1b 100644 --- a/src/cards/skewer.rs +++ b/src/cards/skewer.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -15,10 +15,7 @@ pub static SKEWER: Entity = make_entity_card( false, true, &[Effect { - kind: EffectKind::DamagePhysical { - amount: 7, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 7 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -34,10 +31,7 @@ pub static SKEWER_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = SKEWER.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 10, // +3 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 10 }; // +3 damage a }, ..SKEWER diff --git a/src/cards/slice.rs b/src/cards/slice.rs index ab3ebb7f..0dd51294 100644 --- a/src/cards/slice.rs +++ b/src/cards/slice.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -15,10 +15,7 @@ pub static SLICE: Entity = make_entity_card( false, true, &[Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -34,10 +31,7 @@ pub static SLICE_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = SLICE.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 9, // +3 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 9 }; // +3 damage a }, ..SLICE diff --git a/src/cards/sneaky_strike.rs b/src/cards/sneaky_strike.rs index 8071b7be..ef6a4bb1 100644 --- a/src/cards/sneaky_strike.rs +++ b/src/cards/sneaky_strike.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -16,10 +16,7 @@ pub static SNEAKY_STRIKE: Entity = make_entity_card( true, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 12, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 12 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -41,10 +38,7 @@ pub static SNEAKY_STRIKE_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = SNEAKY_STRIKE.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 16, // +4 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 16 }; // +4 damage a }, ..SNEAKY_STRIKE diff --git a/src/cards/strike.rs b/src/cards/strike.rs index 1d214bea..7fe5953b 100644 --- a/src/cards/strike.rs +++ b/src/cards/strike.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -15,10 +15,7 @@ pub static STRIKE: Entity = make_entity_card( false, true, &[Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -34,10 +31,7 @@ pub static STRIKE_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = STRIKE.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 9, // +3 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 9 }; // +3 damage a }, ..STRIKE diff --git a/src/cards/sucker_punch.rs b/src/cards/sucker_punch.rs index 50b4180f..b2d91e04 100644 --- a/src/cards/sucker_punch.rs +++ b/src/cards/sucker_punch.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -17,10 +17,7 @@ pub static SUCKER_PUNCH: Entity = make_entity_card( true, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 7, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 7 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -48,10 +45,7 @@ pub static SUCKER_PUNCH_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = SUCKER_PUNCH.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 9, // +2 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 9 }; // +2 damage a[1].kind = EffectKind::ModifierGain { kind: ModifierKind::Weak, stacks: 2, // +1 weak diff --git a/src/cards/unload.rs b/src/cards/unload.rs index 4d7dfc3a..22ef272e 100644 --- a/src/cards/unload.rs +++ b/src/cards/unload.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::types::{CardColor, CardKind, CardName, CardRarity}; @@ -16,10 +16,7 @@ pub static UNLOAD: Entity = make_entity_card( true, &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 14, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 14 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::CardTarget, @@ -41,10 +38,7 @@ pub static UNLOAD_PLUS: Entity = Entity { card_upgraded: true, card_effects: { let mut a = UNLOAD.card_effects; - a[0].kind = EffectKind::DamagePhysical { - amount: 18, // +4 damage - condition: DamageCondition::Always, - }; + a[0].kind = EffectKind::DamagePhysical { amount: 18 }; // +4 damage a }, ..UNLOAD diff --git a/src/effect.rs b/src/effect.rs index aec8618a..b2154360 100644 --- a/src/effect.rs +++ b/src/effect.rs @@ -5,7 +5,8 @@ use crate::types::{CardName, MonsterName}; #[derive(Debug, Clone, Copy, PartialEq)] pub enum EffectKind { Noop, - DamagePhysical { amount: u16, condition: DamageCondition }, + DamagePhysical { amount: u16 }, + DamagePhysicalIfPoisoned { amount: u16 }, DistractionAdd, EndlessAgonyAddCopy { upgraded: bool }, BulletTimeProc, @@ -77,14 +78,6 @@ pub enum EffectKind { CardRewardSelect, } -// DamageCondition: gate on a DamagePhysical effect. Always = unconditional; -// IfPoisoned = handler bails unless the target has Poison (used by Bane) -#[derive(Debug, Clone, Copy, PartialEq)] -pub enum DamageCondition { - Always, - IfPoisoned, -} - // DiscardSource: tags a CardDiscard effect with its origin so the handler can // branch on it. Explicit = card- or player-driven discard (counter bumps, // fires `card_on_discard_effects`); EndOfTurn = turn-end auto-discard diff --git a/src/engine/mod.rs b/src/engine/mod.rs index 44e58feb..7fc98fc1 100644 --- a/src/engine/mod.rs +++ b/src/engine/mod.rs @@ -512,7 +512,7 @@ fn dispatch_by_kind( EffectKind::TargetClear => { process_effect_target_clear::process_effect_target_clear(&mut state.id_card_target) } - EffectKind::DamagePhysical { amount, condition } => { + EffectKind::DamagePhysical { amount } => { let id_actor = get_id_actor(&state.entities, state.id_character, id_source); process_effect_damage_physical::process_effect_damage_physical( &state.entities, @@ -520,7 +520,19 @@ fn dispatch_by_kind( id_actor, id_target.unwrap(), amount, - condition, + false, + &mut state.effect_queue, + ) + } + EffectKind::DamagePhysicalIfPoisoned { amount } => { + let id_actor = get_id_actor(&state.entities, state.id_character, id_source); + process_effect_damage_physical::process_effect_damage_physical( + &state.entities, + id_source, + id_actor, + id_target.unwrap(), + amount, + true, &mut state.effect_queue, ) } diff --git a/src/engine/process_effect_damage_physical.rs b/src/engine/process_effect_damage_physical.rs index 3c7fed59..ffd80a6f 100644 --- a/src/engine/process_effect_damage_physical.rs +++ b/src/engine/process_effect_damage_physical.rs @@ -1,32 +1,28 @@ use std::collections::VecDeque; use crate::consts::{FACTOR_VULN, FACTOR_WEAK}; -use crate::effect::{DamageCondition, Effect, EffectKind, Target}; +use crate::effect::{Effect, EffectKind, Target}; use crate::engine::DispatchResult; use crate::entity::Entity; use crate::modifier::{ModifierKind, modifier_has, modifier_stacks}; -// Unified physical-damage handler. `condition` selects whether the hit is -// unconditional (Always) or gated on the target being Poisoned (Bane). -// -// IfPoisoned bails (no damage, no Thorns) when the target is dead or lacks -// Poison; otherwise both branches run the same scaling pipeline: -// Strength + Weak + DoubleDamage on the actor, Vulnerable + Intangible on -// target, Thorns reflect, then push DamageDeal +// Unified physical-damage handler. `if_poisoned` gates the hit: when true +// (Bane), the handler bails (no damage, no Thorns) unless the target has +// Poison; when false, the hit always lands. Both branches share the same +// scaling pipeline: Strength + Weak + DoubleDamage on the actor, Vulnerable + +// Intangible on target, Thorns reflect, then push DamageDeal pub fn process_effect_damage_physical( entities: &[Entity], id_source: Option, id_actor: usize, id_target: usize, amount: u16, - condition: DamageCondition, + if_poisoned: bool, queue: &mut VecDeque, ) -> DispatchResult { let target = &entities[id_target]; - if let DamageCondition::IfPoisoned = condition { - if target.dead || !modifier_has(&target.modifiers, ModifierKind::Poison) { - return DispatchResult::Continue; - } + if if_poisoned && (target.dead || !modifier_has(&target.modifiers, ModifierKind::Poison)) { + return DispatchResult::Continue; } let mods_actor = &entities[id_actor].modifiers; diff --git a/src/engine/process_effect_finisher_damage.rs b/src/engine/process_effect_finisher_damage.rs index 6e7573d0..aeb5bb29 100644 --- a/src/engine/process_effect_finisher_damage.rs +++ b/src/engine/process_effect_finisher_damage.rs @@ -1,6 +1,6 @@ use std::collections::VecDeque; -use crate::effect::{DamageCondition, Effect, EffectKind, Target}; +use crate::effect::{Effect, EffectKind, Target}; use crate::engine::DispatchResult; // Subtract 1 because card_play increments the counter before this effect fires @@ -14,10 +14,7 @@ pub fn process_effect_finisher_damage( let num_attacks = this_turn_attacks_played.saturating_sub(1); for _ in 0..num_attacks { queue.push_front(Effect { - kind: EffectKind::DamagePhysical { - amount: damage, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: damage }, id_source, target: Target::Direct(Some(id_target)), }); diff --git a/src/engine/process_effect_flechettes_damage.rs b/src/engine/process_effect_flechettes_damage.rs index bbe4ecb2..fb200595 100644 --- a/src/engine/process_effect_flechettes_damage.rs +++ b/src/engine/process_effect_flechettes_damage.rs @@ -1,6 +1,6 @@ use std::collections::VecDeque; -use crate::effect::{DamageCondition, Effect, EffectKind, Target}; +use crate::effect::{Effect, EffectKind, Target}; use crate::engine::DispatchResult; use crate::entity::Entity; use crate::types::CardKind; @@ -23,10 +23,7 @@ pub fn process_effect_flechettes_damage( .count(); for _ in 0..num_skills_in_hand { queue.push_front(Effect { - kind: EffectKind::DamagePhysical { - amount: damage, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: damage }, id_source, target: Target::Direct(Some(id_target)), }); diff --git a/src/engine/process_effect_hexaghost_divider.rs b/src/engine/process_effect_hexaghost_divider.rs index 96567884..1343992c 100644 --- a/src/engine/process_effect_hexaghost_divider.rs +++ b/src/engine/process_effect_hexaghost_divider.rs @@ -1,7 +1,7 @@ use std::collections::VecDeque; use crate::consts::HEXAGHOST_DIVIDER_HITS; -use crate::effect::{DamageCondition, Effect, EffectKind, Target}; +use crate::effect::{Effect, EffectKind, Target}; use crate::engine::DispatchResult; use crate::entity::Entity; @@ -17,10 +17,7 @@ pub fn process_effect_hexaghost_divider( for _ in 0..HEXAGHOST_DIVIDER_HITS { queue.push_front(Effect { - kind: EffectKind::DamagePhysical { - amount: dmg, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: dmg }, id_source, target: Target::Direct(Some(id_character)), }); diff --git a/src/engine/process_effect_turn_end.rs b/src/engine/process_effect_turn_end.rs index b388072b..2fcdb7fc 100644 --- a/src/engine/process_effect_turn_end.rs +++ b/src/engine/process_effect_turn_end.rs @@ -1,7 +1,7 @@ use std::collections::VecDeque; use crate::effect::{ - CandidatePool, DamageCondition, DiscardSource, Effect, EffectKind, SelectionKind, Target, + CandidatePool, DiscardSource, Effect, EffectKind, SelectionKind, Target, }; use crate::engine::{DispatchResult, EffectBuf}; use crate::entity::{Entity, EntityKind}; @@ -176,13 +176,7 @@ pub fn process_effect_turn_end_character( ..*e }); if let Some(amount) = stacks_thievery - && matches!( - e.kind, - EffectKind::DamagePhysical { - condition: DamageCondition::Always, - .. - } - ) + && matches!(e.kind, EffectKind::DamagePhysical { .. }) { buf_effects.push(Effect { kind: EffectKind::GoldSteal { amount }, diff --git a/src/ffi.rs b/src/ffi.rs index 11d9485e..94bfe6b0 100644 --- a/src/ffi.rs +++ b/src/ffi.rs @@ -11,7 +11,7 @@ use pyo3::prelude::*; use crate::action::Action as InternalAction; use crate::consts::{FACTOR_VULN, MAP_HEIGHT, MAX_MONSTERS}; use crate::effect::{ - CandidatePool as InternalCandidatePool, DamageCondition, Effect as InternalEffect, EffectKind, + CandidatePool as InternalCandidatePool, Effect as InternalEffect, EffectKind, SelectionKind, Target as InternalTarget, }; use crate::entity::{ @@ -500,10 +500,10 @@ impl Effect { ), }; match effect.kind { - EffectKind::DamagePhysical { amount, condition } => match condition { - DamageCondition::Always => Self::DamagePhysical { amount, target }, - DamageCondition::IfPoisoned => Self::DamagePhysicalIfPoisoned { amount, target }, - }, + EffectKind::DamagePhysical { amount } => Self::DamagePhysical { amount, target }, + EffectKind::DamagePhysicalIfPoisoned { amount } => { + Self::DamagePhysicalIfPoisoned { amount, target } + } EffectKind::HeelHookProc => Self::HeelHookProc { target }, EffectKind::EscapePlanCheck { block } => Self::EscapePlanCheck { block, target }, EffectKind::GlassKnifeDecay { delta } => Self::GlassKnifeDecay { delta, target }, diff --git a/src/monsters/cultist.rs b/src/monsters/cultist.rs index b1aceee0..87756cd1 100644 --- a/src/monsters/cultist.rs +++ b/src/monsters/cultist.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS}; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -7,10 +7,7 @@ use rand::Rng; static MOVE_DARK_STRIKE: Move = Move { name: "Dark Strike", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/fungi_beast.rs b/src/monsters/fungi_beast.rs index e2f3bf6d..5564cecf 100644 --- a/src/monsters/fungi_beast.rs +++ b/src/monsters/fungi_beast.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS, modifier_apply}; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -7,10 +7,7 @@ use rand::Rng; static MOVE_BITE: Move = Move { name: "Bite", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/gremlin_fat.rs b/src/monsters/gremlin_fat.rs index dc039075..411e71c3 100644 --- a/src/monsters/gremlin_fat.rs +++ b/src/monsters/gremlin_fat.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS}; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -8,10 +8,7 @@ static MOVE_SMASH_4_W1: Move = Move { name: "Smash", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 4, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 4 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -39,10 +36,7 @@ static MOVE_SMASH_5_W1: Move = Move { name: "Smash", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 5, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 5 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -70,10 +64,7 @@ static MOVE_SMASH_5_W1_F1: Move = Move { name: "Smash", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 5, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 5 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/gremlin_nob.rs b/src/monsters/gremlin_nob.rs index 70d82eff..65038ce6 100644 --- a/src/monsters/gremlin_nob.rs +++ b/src/monsters/gremlin_nob.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS}; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -37,10 +37,7 @@ static MOVE_BELLOW_3: Move = Move { static MOVE_BULL_RUSH_14: Move = Move { name: "Bull Rush", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 14, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 14 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -55,10 +52,7 @@ static MOVE_BULL_RUSH_14: Move = Move { static MOVE_BULL_RUSH_16: Move = Move { name: "Bull Rush", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 16, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 16 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -74,10 +68,7 @@ static MOVE_SKULL_BASH_6: Move = Move { name: "Skull Bash", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -105,10 +96,7 @@ static MOVE_SKULL_BASH_8: Move = Move { name: "Skull Bash", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/gremlin_thief.rs b/src/monsters/gremlin_thief.rs index cd141879..74307df3 100644 --- a/src/monsters/gremlin_thief.rs +++ b/src/monsters/gremlin_thief.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::ZERO_MODIFIERS; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -7,10 +7,7 @@ use rand::Rng; static MOVE_PUNCTURE_9: Move = Move { name: "Puncture", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 9, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 9 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -25,10 +22,7 @@ static MOVE_PUNCTURE_9: Move = Move { static MOVE_PUNCTURE_10: Move = Move { name: "Puncture", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 10, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 10 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/gremlin_tsundere.rs b/src/monsters/gremlin_tsundere.rs index 89d32807..d9ee373f 100644 --- a/src/monsters/gremlin_tsundere.rs +++ b/src/monsters/gremlin_tsundere.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::ZERO_MODIFIERS; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -43,10 +43,7 @@ static MOVE_PROTECT_11: Move = Move { static MOVE_BASH_6: Move = Move { name: "Shield Bash", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -61,10 +58,7 @@ static MOVE_BASH_6: Move = Move { static MOVE_BASH_8: Move = Move { name: "Shield Bash", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/gremlin_warrior.rs b/src/monsters/gremlin_warrior.rs index 846a3915..c599fbcf 100644 --- a/src/monsters/gremlin_warrior.rs +++ b/src/monsters/gremlin_warrior.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS, modifier_apply}; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -7,10 +7,7 @@ use rand::Rng; static MOVE_SCRATCH_4: Move = Move { name: "Scratch", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 4, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 4 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -25,10 +22,7 @@ static MOVE_SCRATCH_4: Move = Move { static MOVE_SCRATCH_5: Move = Move { name: "Scratch", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 5, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 5 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/gremlin_wizard.rs b/src/monsters/gremlin_wizard.rs index 78627bec..9741d329 100644 --- a/src/monsters/gremlin_wizard.rs +++ b/src/monsters/gremlin_wizard.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::ZERO_MODIFIERS; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -12,10 +12,7 @@ static MOVE_CHARGE: Move = Move { static MOVE_ULTIMATE_BLAST_25: Move = Move { name: "Ultimate Blast", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 25, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 25 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -30,10 +27,7 @@ static MOVE_ULTIMATE_BLAST_25: Move = Move { static MOVE_ULTIMATE_BLAST_30: Move = Move { name: "Ultimate Blast", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 30, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 30 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/hexaghost.rs b/src/monsters/hexaghost.rs index 4bdb5fc7..52c5d5d5 100644 --- a/src/monsters/hexaghost.rs +++ b/src/monsters/hexaghost.rs @@ -1,5 +1,5 @@ use crate::consts::HEXAGHOST_DIVIDER_HITS; -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS}; use crate::types::{CardName, MonsterKind, MonsterName, Vitals}; @@ -34,10 +34,7 @@ static MOVE_SEAR_BURN_1_NORMAL: Move = Move { name: "Sear", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -63,10 +60,7 @@ static MOVE_SEAR_BURN_1_UPGRADED: Move = Move { name: "Sear", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -92,10 +86,7 @@ static MOVE_SEAR_BURN_2_NORMAL: Move = Move { name: "Sear", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -121,10 +112,7 @@ static MOVE_SEAR_BURN_2_UPGRADED: Move = Move { name: "Sear", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -151,10 +139,7 @@ static MOVE_TACKLE_5: Move = Move { name: "Tackle", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 5, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 5 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -162,10 +147,7 @@ static MOVE_TACKLE_5: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 5, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 5 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -182,10 +164,7 @@ static MOVE_TACKLE_6: Move = Move { name: "Tackle", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -193,10 +172,7 @@ static MOVE_TACKLE_6: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -266,10 +242,7 @@ static MOVE_INFERNO_2: Move = Move { name: "Inferno", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 2, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 2 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -277,10 +250,7 @@ static MOVE_INFERNO_2: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 2, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 2 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -288,10 +258,7 @@ static MOVE_INFERNO_2: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 2, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 2 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -299,10 +266,7 @@ static MOVE_INFERNO_2: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 2, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 2 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -310,10 +274,7 @@ static MOVE_INFERNO_2: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 2, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 2 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -321,10 +282,7 @@ static MOVE_INFERNO_2: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 2, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 2 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -346,10 +304,7 @@ static MOVE_INFERNO_3: Move = Move { name: "Inferno", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 3, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 3 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -357,10 +312,7 @@ static MOVE_INFERNO_3: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 3, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 3 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -368,10 +320,7 @@ static MOVE_INFERNO_3: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 3, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 3 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -379,10 +328,7 @@ static MOVE_INFERNO_3: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 3, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 3 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -390,10 +336,7 @@ static MOVE_INFERNO_3: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 3, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 3 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -401,10 +344,7 @@ static MOVE_INFERNO_3: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 3, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 3 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/jaw_worm.rs b/src/monsters/jaw_worm.rs index 5e0bb6d1..61cdf9c5 100644 --- a/src/monsters/jaw_worm.rs +++ b/src/monsters/jaw_worm.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS}; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -7,10 +7,7 @@ use rand::Rng; static MOVE_CHOMP_11: Move = Move { name: "Chomp", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 11, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 11 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -25,10 +22,7 @@ static MOVE_CHOMP_11: Move = Move { static MOVE_CHOMP_12: Move = Move { name: "Chomp", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 12, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 12 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -44,10 +38,7 @@ static MOVE_THRASH: Move = Move { name: "Thrash", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 7, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 7 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/lagavulin.rs b/src/monsters/lagavulin.rs index 73d9a5d9..5e6b1360 100644 --- a/src/monsters/lagavulin.rs +++ b/src/monsters/lagavulin.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, Modifiers, ZERO_MODIFIERS, modifier_apply, modifier_has}; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -43,10 +43,7 @@ static MOVE_STUNNED: Move = Move { static MOVE_ATTACK_18: Move = Move { name: "Attack", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 18, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 18 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -61,10 +58,7 @@ static MOVE_ATTACK_18: Move = Move { static MOVE_ATTACK_20: Move = Move { name: "Attack", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 20, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 20 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/looter.rs b/src/monsters/looter.rs index 77cfe1b2..b1a895dc 100644 --- a/src/monsters/looter.rs +++ b/src/monsters/looter.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS, modifier_apply}; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -7,10 +7,7 @@ use rand::Rng; static MOVE_MUG_10: Move = Move { name: "Mug", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 10, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 10 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -25,10 +22,7 @@ static MOVE_MUG_10: Move = Move { static MOVE_MUG_11: Move = Move { name: "Mug", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 11, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 11 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -43,10 +37,7 @@ static MOVE_MUG_11: Move = Move { static MOVE_LUNGE_12: Move = Move { name: "Lunge", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 12, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 12 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -61,10 +52,7 @@ static MOVE_LUNGE_12: Move = Move { static MOVE_LUNGE_14: Move = Move { name: "Lunge", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 14, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 14 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/louse_green.rs b/src/monsters/louse_green.rs index f5c32244..8259c11f 100644 --- a/src/monsters/louse_green.rs +++ b/src/monsters/louse_green.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS, modifier_apply}; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -7,10 +7,7 @@ use rand::Rng; static MOVE_BITE_5: Move = Move { name: "Bite", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 5, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 5 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -25,10 +22,7 @@ static MOVE_BITE_5: Move = Move { static MOVE_BITE_6: Move = Move { name: "Bite", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -43,10 +37,7 @@ static MOVE_BITE_6: Move = Move { static MOVE_BITE_7: Move = Move { name: "Bite", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 7, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 7 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -61,10 +52,7 @@ static MOVE_BITE_7: Move = Move { static MOVE_BITE_8: Move = Move { name: "Bite", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/louse_red.rs b/src/monsters/louse_red.rs index 4d898c06..7b5f463f 100644 --- a/src/monsters/louse_red.rs +++ b/src/monsters/louse_red.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS, modifier_apply}; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -7,10 +7,7 @@ use rand::Rng; static MOVE_BITE_5: Move = Move { name: "Bite", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 5, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 5 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -25,10 +22,7 @@ static MOVE_BITE_5: Move = Move { static MOVE_BITE_6: Move = Move { name: "Bite", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -43,10 +37,7 @@ static MOVE_BITE_6: Move = Move { static MOVE_BITE_7: Move = Move { name: "Bite", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 7, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 7 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -61,10 +52,7 @@ static MOVE_BITE_7: Move = Move { static MOVE_BITE_8: Move = Move { name: "Bite", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/sentry.rs b/src/monsters/sentry.rs index 5f9ce0e9..7660cabc 100644 --- a/src/monsters/sentry.rs +++ b/src/monsters/sentry.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS, modifier_apply}; use crate::types::{CardName, MonsterKind, MonsterName, Vitals}; @@ -7,10 +7,7 @@ use rand::Rng; static MOVE_BEAM_9: Move = Move { name: "Beam", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 9, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 9 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -25,10 +22,7 @@ static MOVE_BEAM_9: Move = Move { static MOVE_BEAM_10: Move = Move { name: "Beam", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 10, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 10 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/slaver_blue.rs b/src/monsters/slaver_blue.rs index d561d4f4..4d6ec4ec 100644 --- a/src/monsters/slaver_blue.rs +++ b/src/monsters/slaver_blue.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS}; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -7,10 +7,7 @@ use rand::Rng; static MOVE_STAB_12: Move = Move { name: "Stab", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 12, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 12 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -25,10 +22,7 @@ static MOVE_STAB_12: Move = Move { static MOVE_STAB_13: Move = Move { name: "Stab", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 13, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 13 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -44,10 +38,7 @@ static MOVE_RAKE_7_W1: Move = Move { name: "Rake", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 7, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 7 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -75,10 +66,7 @@ static MOVE_RAKE_8_W1: Move = Move { name: "Rake", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -106,10 +94,7 @@ static MOVE_RAKE_8_W2: Move = Move { name: "Rake", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/slaver_red.rs b/src/monsters/slaver_red.rs index c6f10019..66d9b430 100644 --- a/src/monsters/slaver_red.rs +++ b/src/monsters/slaver_red.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS}; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -7,10 +7,7 @@ use rand::Rng; static MOVE_STAB_13: Move = Move { name: "Stab", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 13, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 13 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -25,10 +22,7 @@ static MOVE_STAB_13: Move = Move { static MOVE_STAB_14: Move = Move { name: "Stab", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 14, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 14 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -59,10 +53,7 @@ static MOVE_SCRAPE_8_VULN_1: Move = Move { name: "Scrape", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -90,10 +81,7 @@ static MOVE_SCRAPE_9_VULN_1: Move = Move { name: "Scrape", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 9, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 9 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -121,10 +109,7 @@ static MOVE_SCRAPE_9_VULN_2: Move = Move { name: "Scrape", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 9, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 9 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/slime_acid_large.rs b/src/monsters/slime_acid_large.rs index 032862c7..5d41627c 100644 --- a/src/monsters/slime_acid_large.rs +++ b/src/monsters/slime_acid_large.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS, modifier_apply}; use crate::types::{CardName, MonsterKind, MonsterName, Vitals}; @@ -8,10 +8,7 @@ static MOVE_SLIME_TACKLE_11: Move = Move { name: "Corrosive Spit", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 11, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 11 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -37,10 +34,7 @@ static MOVE_SLIME_TACKLE_12: Move = Move { name: "Corrosive Spit", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 12, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 12 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -65,10 +59,7 @@ static MOVE_SLIME_TACKLE_12: Move = Move { static MOVE_HEAVY_TACKLE_16: Move = Move { name: "Tackle", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 16, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 16 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -83,10 +74,7 @@ static MOVE_HEAVY_TACKLE_16: Move = Move { static MOVE_HEAVY_TACKLE_18: Move = Move { name: "Tackle", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 18, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 18 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/slime_acid_medium.rs b/src/monsters/slime_acid_medium.rs index e4bd7f97..f02767c9 100644 --- a/src/monsters/slime_acid_medium.rs +++ b/src/monsters/slime_acid_medium.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS}; use crate::types::{CardName, MonsterKind, MonsterName, Vitals}; @@ -8,10 +8,7 @@ static MOVE_WOUND_TACKLE_7: Move = Move { name: "Corrosive Spit", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 7, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 7 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -37,10 +34,7 @@ static MOVE_WOUND_TACKLE_8: Move = Move { name: "Corrosive Spit", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -65,10 +59,7 @@ static MOVE_WOUND_TACKLE_8: Move = Move { static MOVE_HEAVY_TACKLE_10: Move = Move { name: "Tackle", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 10, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 10 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -83,10 +74,7 @@ static MOVE_HEAVY_TACKLE_10: Move = Move { static MOVE_HEAVY_TACKLE_12: Move = Move { name: "Tackle", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 12, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 12 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/slime_acid_small.rs b/src/monsters/slime_acid_small.rs index 7952710d..5e5e4a50 100644 --- a/src/monsters/slime_acid_small.rs +++ b/src/monsters/slime_acid_small.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS}; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -7,10 +7,7 @@ use rand::Rng; static MOVE_TACKLE_3: Move = Move { name: "Tackle", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 3, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 3 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -25,10 +22,7 @@ static MOVE_TACKLE_3: Move = Move { static MOVE_TACKLE_4: Move = Move { name: "Tackle", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 4, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 4 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/slime_boss.rs b/src/monsters/slime_boss.rs index 74bec737..563fd261 100644 --- a/src/monsters/slime_boss.rs +++ b/src/monsters/slime_boss.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS, modifier_apply}; use crate::types::{CardName, MonsterKind, MonsterName, Vitals}; @@ -37,10 +37,7 @@ static MOVE_PREPARING: Move = Move { static MOVE_SLAM_35: Move = Move { name: "Slam", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 35, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 35 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -55,10 +52,7 @@ static MOVE_SLAM_35: Move = Move { static MOVE_SLAM_38: Move = Move { name: "Slam", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 38, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 38 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/slime_spike_large.rs b/src/monsters/slime_spike_large.rs index 3489f398..8215b741 100644 --- a/src/monsters/slime_spike_large.rs +++ b/src/monsters/slime_spike_large.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS, modifier_apply}; use crate::types::{CardName, MonsterKind, MonsterName, Vitals}; @@ -8,10 +8,7 @@ static MOVE_FLAME_TACKLE_16: Move = Move { name: "Flame Tackle", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 16, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 16 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -37,10 +34,7 @@ static MOVE_FLAME_TACKLE_18: Move = Move { name: "Flame Tackle", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 18, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 18 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/slime_spike_medium.rs b/src/monsters/slime_spike_medium.rs index 25f4574a..6784d53c 100644 --- a/src/monsters/slime_spike_medium.rs +++ b/src/monsters/slime_spike_medium.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, ZERO_MODIFIERS}; use crate::types::{CardName, MonsterKind, MonsterName, Vitals}; @@ -8,10 +8,7 @@ static MOVE_FLAME_TACKLE_8: Move = Move { name: "Flame Tackle", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -37,10 +34,7 @@ static MOVE_FLAME_TACKLE_10: Move = Move { name: "Flame Tackle", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 10, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 10 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/slime_spike_small.rs b/src/monsters/slime_spike_small.rs index 51f4240f..49ed54c1 100644 --- a/src/monsters/slime_spike_small.rs +++ b/src/monsters/slime_spike_small.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::ZERO_MODIFIERS; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -7,10 +7,7 @@ use rand::Rng; static MOVE_TACKLE_5: Move = Move { name: "Tackle", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 5, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 5 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -25,10 +22,7 @@ static MOVE_TACKLE_5: Move = Move { static MOVE_TACKLE_6: Move = Move { name: "Tackle", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 6, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 6 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, diff --git a/src/monsters/the_guardian.rs b/src/monsters/the_guardian.rs index 7a938671..d34004f9 100644 --- a/src/monsters/the_guardian.rs +++ b/src/monsters/the_guardian.rs @@ -1,4 +1,4 @@ -use crate::effect::{CandidatePool, DamageCondition, Effect, EffectKind, SelectionKind, Target}; +use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{Entity, Intent, Move, make_entity_monster}; use crate::modifier::{ModifierKind, Modifiers, ZERO_MODIFIERS, modifier_apply, modifier_has}; use crate::types::{MonsterKind, MonsterName, Vitals}; @@ -22,10 +22,7 @@ static MOVE_CHARGING_UP: Move = Move { static MOVE_FIERCE_BASH_32: Move = Move { name: "Fierce Bash", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 32, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 32 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -40,10 +37,7 @@ static MOVE_FIERCE_BASH_32: Move = Move { static MOVE_FIERCE_BASH_36: Move = Move { name: "Fierce Bash", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 36, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 36 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -87,10 +81,7 @@ static MOVE_WHIRLWIND: Move = Move { name: "Whirlwind", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 5, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 5 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -98,10 +89,7 @@ static MOVE_WHIRLWIND: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 5, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 5 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -109,10 +97,7 @@ static MOVE_WHIRLWIND: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 5, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 5 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -120,10 +105,7 @@ static MOVE_WHIRLWIND: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 5, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 5 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -169,10 +151,7 @@ static MOVE_DEFENSIVE_MODE_4: Move = Move { static MOVE_ROLL_ATTACK_9: Move = Move { name: "Roll Attack", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 9, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 9 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -187,10 +166,7 @@ static MOVE_ROLL_ATTACK_9: Move = Move { static MOVE_ROLL_ATTACK_10: Move = Move { name: "Roll Attack", effects: &[Effect { - kind: EffectKind::DamagePhysical { - amount: 10, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 10 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -206,10 +182,7 @@ static MOVE_TWIN_SLAM_30: Move = Move { name: "Twin Slam", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -217,10 +190,7 @@ static MOVE_TWIN_SLAM_30: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -258,10 +228,7 @@ static MOVE_TWIN_SLAM_35: Move = Move { name: "Twin Slam", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -269,10 +236,7 @@ static MOVE_TWIN_SLAM_35: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -310,10 +274,7 @@ static MOVE_TWIN_SLAM_40: Move = Move { name: "Twin Slam", effects: &[ Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, @@ -321,10 +282,7 @@ static MOVE_TWIN_SLAM_40: Move = Move { }, }, Effect { - kind: EffectKind::DamagePhysical { - amount: 8, - condition: DamageCondition::Always, - }, + kind: EffectKind::DamagePhysical { amount: 8 }, id_source: None, target: Target::Resolve { candidates: CandidatePool::Character, From 444dbc516249f413499833db725a28c88d8af0a0 Mon Sep 17 00:00:00 2001 From: Guillermo Etchebarne Date: Mon, 4 May 2026 21:07:46 -0300 Subject: [PATCH 4/4] Add Tags --- python/slai/__init__.py | 2 ++ src/cards/a_thousand_cuts.rs | 1 + src/cards/accuracy.rs | 1 + src/cards/acrobatics.rs | 1 + src/cards/adrenaline.rs | 1 + src/cards/after_image.rs | 1 + src/cards/all_out_attack.rs | 3 ++- src/cards/backflip.rs | 1 + src/cards/backstab.rs | 1 + src/cards/bane.rs | 3 ++- src/cards/blade_dance.rs | 3 ++- src/cards/blur.rs | 1 + src/cards/bouncing_flask.rs | 3 ++- src/cards/bullet_time.rs | 1 + src/cards/burn.rs | 2 ++ src/cards/burst.rs | 1 + src/cards/calculated_gamble.rs | 3 ++- src/cards/caltrops.rs | 1 + src/cards/catalyst.rs | 3 ++- src/cards/choke.rs | 1 + src/cards/cloak_and_dagger.rs | 3 ++- src/cards/concentrate.rs | 3 ++- src/cards/corpse_explosion.rs | 3 ++- src/cards/crippling_poison.rs | 3 ++- src/cards/dagger_spray.rs | 1 + src/cards/dagger_throw.rs | 3 ++- src/cards/dash.rs | 1 + src/cards/dazed.rs | 1 + src/cards/deadly_poison.rs | 3 ++- src/cards/defend.rs | 1 + src/cards/deflect.rs | 1 + src/cards/die_die_die.rs | 1 + src/cards/distraction.rs | 1 + src/cards/dodge_and_roll.rs | 1 + src/cards/doppelganger.rs | 1 + src/cards/endless_agony.rs | 1 + src/cards/envenom.rs | 3 ++- src/cards/escape_plan.rs | 1 + src/cards/eviscerate.rs | 3 ++- src/cards/expertise.rs | 1 + src/cards/finisher.rs | 1 + src/cards/flechettes.rs | 1 + src/cards/flying_knee.rs | 1 + src/cards/footwork.rs | 1 + src/cards/glass_knife.rs | 1 + src/cards/grand_finale.rs | 1 + src/cards/heel_hook.rs | 1 + src/cards/infinite_blades.rs | 3 ++- src/cards/leg_sweep.rs | 1 + src/cards/malaise.rs | 1 + src/cards/masterful_stab.rs | 1 + src/cards/neutralize.rs | 1 + src/cards/nightmare.rs | 1 + src/cards/noxious_fumes.rs | 3 ++- src/cards/outmaneuver.rs | 1 + src/cards/phantasmal_killer.rs | 1 + src/cards/piercing_wail.rs | 1 + src/cards/poisoned_stab.rs | 3 ++- src/cards/predator.rs | 1 + src/cards/prepared.rs | 1 + src/cards/quick_slash.rs | 1 + src/cards/reflex.rs | 3 ++- src/cards/riddle_with_holes.rs | 1 + src/cards/setup.rs | 1 + src/cards/shiv.rs | 3 ++- src/cards/skewer.rs | 1 + src/cards/slice.rs | 1 + src/cards/slimed.rs | 1 + src/cards/sneaky_strike.rs | 3 ++- src/cards/storm_of_steel.rs | 3 ++- src/cards/strike.rs | 1 + src/cards/sucker_punch.rs | 1 + src/cards/survivor.rs | 3 ++- src/cards/tactician.rs | 3 ++- src/cards/terror.rs | 1 + src/cards/tools_of_the_trade.rs | 1 + src/cards/unload.rs | 3 ++- src/cards/well_laid_plans.rs | 1 + src/cards/wraith_form.rs | 1 + src/entity.rs | 7 ++++++- src/ffi.rs | 23 ++++++++++++++++++++++- src/lib.rs | 1 + src/types.rs | 7 +++++++ 83 files changed, 141 insertions(+), 26 deletions(-) diff --git a/python/slai/__init__.py b/python/slai/__init__.py index 4063565b..3b7af387 100644 --- a/python/slai/__init__.py +++ b/python/slai/__init__.py @@ -17,6 +17,7 @@ CardColor, CardRarity, CardCostKind, + Tag, ModifierKind, CandidatePool, RoomKind, @@ -46,6 +47,7 @@ "CardColor", "CardRarity", "CardCostKind", + "Tag", "ModifierKind", "CandidatePool", "RoomKind", diff --git a/src/cards/a_thousand_cuts.rs b/src/cards/a_thousand_cuts.rs index f77542ea..8092f05e 100644 --- a/src/cards/a_thousand_cuts.rs +++ b/src/cards/a_thousand_cuts.rs @@ -29,6 +29,7 @@ pub static A_THOUSAND_CUTS: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static A_THOUSAND_CUTS_PLUS: Entity = Entity { diff --git a/src/cards/accuracy.rs b/src/cards/accuracy.rs index 6159ef66..6201504c 100644 --- a/src/cards/accuracy.rs +++ b/src/cards/accuracy.rs @@ -29,6 +29,7 @@ pub static ACCURACY: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static ACCURACY_PLUS: Entity = Entity { diff --git a/src/cards/acrobatics.rs b/src/cards/acrobatics.rs index 312f2fc7..88721062 100644 --- a/src/cards/acrobatics.rs +++ b/src/cards/acrobatics.rs @@ -34,6 +34,7 @@ pub static ACROBATICS: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static ACROBATICS_PLUS: Entity = Entity { diff --git a/src/cards/adrenaline.rs b/src/cards/adrenaline.rs index f4bc8580..fa05248f 100644 --- a/src/cards/adrenaline.rs +++ b/src/cards/adrenaline.rs @@ -29,6 +29,7 @@ pub static ADRENALINE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static ADRENALINE_PLUS: Entity = Entity { diff --git a/src/cards/after_image.rs b/src/cards/after_image.rs index 15f74ace..af9736b3 100644 --- a/src/cards/after_image.rs +++ b/src/cards/after_image.rs @@ -29,6 +29,7 @@ pub static AFTER_IMAGE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static AFTER_IMAGE_PLUS: Entity = Entity { diff --git a/src/cards/all_out_attack.rs b/src/cards/all_out_attack.rs index 04964a03..0fe19b96 100644 --- a/src/cards/all_out_attack.rs +++ b/src/cards/all_out_attack.rs @@ -2,7 +2,7 @@ use crate::effect::{ CandidatePool, DiscardSource, Effect, EffectKind, SelectionKind, Target, }; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static ALL_OUT_ATTACK: Entity = make_entity_card( CardName::AllOutAttack, @@ -39,6 +39,7 @@ pub static ALL_OUT_ATTACK: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Discard], ); // Upgraded pub static ALL_OUT_ATTACK_PLUS: Entity = Entity { diff --git a/src/cards/backflip.rs b/src/cards/backflip.rs index 675aa634..042d53c1 100644 --- a/src/cards/backflip.rs +++ b/src/cards/backflip.rs @@ -32,6 +32,7 @@ pub static BACKFLIP: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static BACKFLIP_PLUS: Entity = Entity { diff --git a/src/cards/backstab.rs b/src/cards/backstab.rs index cc7cb4cb..f0cb728d 100644 --- a/src/cards/backstab.rs +++ b/src/cards/backstab.rs @@ -25,6 +25,7 @@ pub static BACKSTAB: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static BACKSTAB_PLUS: Entity = Entity { diff --git a/src/cards/bane.rs b/src/cards/bane.rs index ac6b657a..834dda49 100644 --- a/src/cards/bane.rs +++ b/src/cards/bane.rs @@ -1,6 +1,6 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static BANE: Entity = make_entity_card( CardName::Bane, @@ -35,6 +35,7 @@ pub static BANE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Poison], ); // Upgraded pub static BANE_PLUS: Entity = Entity { diff --git a/src/cards/blade_dance.rs b/src/cards/blade_dance.rs index 88e67e79..0bc18582 100644 --- a/src/cards/blade_dance.rs +++ b/src/cards/blade_dance.rs @@ -1,6 +1,6 @@ use crate::effect::{Effect, EffectKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static BLADE_DANCE: Entity = make_entity_card( CardName::BladeDance, @@ -25,6 +25,7 @@ pub static BLADE_DANCE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Shiv], ); // Upgraded pub static BLADE_DANCE_PLUS: Entity = Entity { diff --git a/src/cards/blur.rs b/src/cards/blur.rs index 653b1208..ea070ae4 100644 --- a/src/cards/blur.rs +++ b/src/cards/blur.rs @@ -39,6 +39,7 @@ pub static BLUR: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static BLUR_PLUS: Entity = Entity { diff --git a/src/cards/bouncing_flask.rs b/src/cards/bouncing_flask.rs index 75609ab4..48a2d79f 100644 --- a/src/cards/bouncing_flask.rs +++ b/src/cards/bouncing_flask.rs @@ -1,7 +1,7 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; const BOUNCE: Effect = Effect { kind: EffectKind::ModifierGain { @@ -31,6 +31,7 @@ pub static BOUNCING_FLASK: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Poison], ); // Upgraded: one more bounce pub static BOUNCING_FLASK_PLUS: Entity = Entity { diff --git a/src/cards/bullet_time.rs b/src/cards/bullet_time.rs index f5ca4e3a..ae7a6a30 100644 --- a/src/cards/bullet_time.rs +++ b/src/cards/bullet_time.rs @@ -36,6 +36,7 @@ pub static BULLET_TIME: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static BULLET_TIME_PLUS: Entity = Entity { diff --git a/src/cards/burn.rs b/src/cards/burn.rs index 545701f7..f102b2a7 100644 --- a/src/cards/burn.rs +++ b/src/cards/burn.rs @@ -17,6 +17,7 @@ pub static BURN: Entity = make_entity_card( &[], &[], PlayRestriction::Never, + &[], ); pub static BURN_UPGRADED: Entity = make_entity_card( @@ -35,4 +36,5 @@ pub static BURN_UPGRADED: Entity = make_entity_card( &[], &[], PlayRestriction::Never, + &[], ); diff --git a/src/cards/burst.rs b/src/cards/burst.rs index d3aa9cfe..ba6f3f8c 100644 --- a/src/cards/burst.rs +++ b/src/cards/burst.rs @@ -29,6 +29,7 @@ pub static BURST: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static BURST_PLUS: Entity = Entity { diff --git a/src/cards/calculated_gamble.rs b/src/cards/calculated_gamble.rs index 9e54611b..140c9ed4 100644 --- a/src/cards/calculated_gamble.rs +++ b/src/cards/calculated_gamble.rs @@ -1,6 +1,6 @@ use crate::effect::{Effect, EffectKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static CALCULATED_GAMBLE: Entity = make_entity_card( CardName::CalculatedGamble, @@ -22,6 +22,7 @@ pub static CALCULATED_GAMBLE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Discard], ); // Upgraded pub static CALCULATED_GAMBLE_PLUS: Entity = Entity { diff --git a/src/cards/caltrops.rs b/src/cards/caltrops.rs index 6e805777..18b8b811 100644 --- a/src/cards/caltrops.rs +++ b/src/cards/caltrops.rs @@ -29,6 +29,7 @@ pub static CALTROPS: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static CALTROPS_PLUS: Entity = Entity { diff --git a/src/cards/catalyst.rs b/src/cards/catalyst.rs index 283fe6bc..4f3d281e 100644 --- a/src/cards/catalyst.rs +++ b/src/cards/catalyst.rs @@ -1,7 +1,7 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static CATALYST: Entity = make_entity_card( CardName::Catalyst, @@ -29,6 +29,7 @@ pub static CATALYST: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Poison], ); // Upgraded: triples instead of doubles pub static CATALYST_PLUS: Entity = Entity { diff --git a/src/cards/choke.rs b/src/cards/choke.rs index 703f34f2..7a3f6a37 100644 --- a/src/cards/choke.rs +++ b/src/cards/choke.rs @@ -39,6 +39,7 @@ pub static CHOKE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static CHOKE_PLUS: Entity = Entity { diff --git a/src/cards/cloak_and_dagger.rs b/src/cards/cloak_and_dagger.rs index 33ab6976..0c3ffb38 100644 --- a/src/cards/cloak_and_dagger.rs +++ b/src/cards/cloak_and_dagger.rs @@ -1,6 +1,6 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static CLOAK_AND_DAGGER: Entity = make_entity_card( CardName::CloakAndDagger, @@ -35,6 +35,7 @@ pub static CLOAK_AND_DAGGER: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Shiv], ); // Upgraded pub static CLOAK_AND_DAGGER_PLUS: Entity = Entity { diff --git a/src/cards/concentrate.rs b/src/cards/concentrate.rs index 0d66c1e3..52e748a6 100644 --- a/src/cards/concentrate.rs +++ b/src/cards/concentrate.rs @@ -1,6 +1,6 @@ use crate::effect::{CandidatePool, DiscardSource, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static CONCENTRATE: Entity = make_entity_card( CardName::Concentrate, @@ -34,6 +34,7 @@ pub static CONCENTRATE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Discard], ); // Upgraded pub static CONCENTRATE_PLUS: Entity = Entity { diff --git a/src/cards/corpse_explosion.rs b/src/cards/corpse_explosion.rs index 5d2f2897..218825b0 100644 --- a/src/cards/corpse_explosion.rs +++ b/src/cards/corpse_explosion.rs @@ -1,7 +1,7 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static CORPSE_EXPLOSION: Entity = make_entity_card( CardName::CorpseExplosion, @@ -42,6 +42,7 @@ pub static CORPSE_EXPLOSION: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Poison], ); // Upgraded pub static CORPSE_EXPLOSION_PLUS: Entity = Entity { diff --git a/src/cards/crippling_poison.rs b/src/cards/crippling_poison.rs index 86c3e197..4ace2501 100644 --- a/src/cards/crippling_poison.rs +++ b/src/cards/crippling_poison.rs @@ -1,7 +1,7 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static CRIPPLING_POISON: Entity = make_entity_card( CardName::CripplingPoison, @@ -42,6 +42,7 @@ pub static CRIPPLING_POISON: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Poison], ); // Upgraded pub static CRIPPLING_POISON_PLUS: Entity = Entity { diff --git a/src/cards/dagger_spray.rs b/src/cards/dagger_spray.rs index 5cc59517..4f0262f1 100644 --- a/src/cards/dagger_spray.rs +++ b/src/cards/dagger_spray.rs @@ -35,6 +35,7 @@ pub static DAGGER_SPRAY: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static DAGGER_SPRAY_PLUS: Entity = Entity { diff --git a/src/cards/dagger_throw.rs b/src/cards/dagger_throw.rs index 3bcae62f..098fca9c 100644 --- a/src/cards/dagger_throw.rs +++ b/src/cards/dagger_throw.rs @@ -2,7 +2,7 @@ use crate::effect::{ CandidatePool, DiscardSource, Effect, EffectKind, SelectionKind, Target, }; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static DAGGER_THROW: Entity = make_entity_card( CardName::DaggerThrow, @@ -44,6 +44,7 @@ pub static DAGGER_THROW: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Discard], ); // Upgraded pub static DAGGER_THROW_PLUS: Entity = Entity { diff --git a/src/cards/dash.rs b/src/cards/dash.rs index 2c786fa3..09f69511 100644 --- a/src/cards/dash.rs +++ b/src/cards/dash.rs @@ -35,6 +35,7 @@ pub static DASH: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static DASH_PLUS: Entity = Entity { diff --git a/src/cards/dazed.rs b/src/cards/dazed.rs index ac7bda02..43b4e98b 100644 --- a/src/cards/dazed.rs +++ b/src/cards/dazed.rs @@ -17,4 +17,5 @@ pub static DAZED: Entity = make_entity_card( &[], &[], PlayRestriction::Never, // Unplayable + &[], ); diff --git a/src/cards/deadly_poison.rs b/src/cards/deadly_poison.rs index 635d784c..1f98ee8e 100644 --- a/src/cards/deadly_poison.rs +++ b/src/cards/deadly_poison.rs @@ -1,7 +1,7 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static DEADLY_POISON: Entity = make_entity_card( CardName::DeadlyPoison, @@ -29,6 +29,7 @@ pub static DEADLY_POISON: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Poison], ); // Upgraded pub static DEADLY_POISON_PLUS: Entity = Entity { diff --git a/src/cards/defend.rs b/src/cards/defend.rs index 57eed74c..16144165 100644 --- a/src/cards/defend.rs +++ b/src/cards/defend.rs @@ -25,6 +25,7 @@ pub static DEFEND: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static DEFEND_PLUS: Entity = Entity { diff --git a/src/cards/deflect.rs b/src/cards/deflect.rs index 7cec8575..a5351ac2 100644 --- a/src/cards/deflect.rs +++ b/src/cards/deflect.rs @@ -25,6 +25,7 @@ pub static DEFLECT: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static DEFLECT_PLUS: Entity = Entity { diff --git a/src/cards/die_die_die.rs b/src/cards/die_die_die.rs index ac906b61..10aec2e1 100644 --- a/src/cards/die_die_die.rs +++ b/src/cards/die_die_die.rs @@ -25,6 +25,7 @@ pub static DIE_DIE_DIE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static DIE_DIE_DIE_PLUS: Entity = Entity { diff --git a/src/cards/distraction.rs b/src/cards/distraction.rs index 76a0ffb0..6dc13c8c 100644 --- a/src/cards/distraction.rs +++ b/src/cards/distraction.rs @@ -22,6 +22,7 @@ pub static DISTRACTION: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static DISTRACTION_PLUS: Entity = Entity { diff --git a/src/cards/dodge_and_roll.rs b/src/cards/dodge_and_roll.rs index 497d542c..957523d7 100644 --- a/src/cards/dodge_and_roll.rs +++ b/src/cards/dodge_and_roll.rs @@ -39,6 +39,7 @@ pub static DODGE_AND_ROLL: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static DODGE_AND_ROLL_PLUS: Entity = Entity { diff --git a/src/cards/doppelganger.rs b/src/cards/doppelganger.rs index fe3f9495..70dbbbe3 100644 --- a/src/cards/doppelganger.rs +++ b/src/cards/doppelganger.rs @@ -42,6 +42,7 @@ pub static DOPPELGANGER: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static DOPPELGANGER_PLUS: Entity = Entity { diff --git a/src/cards/endless_agony.rs b/src/cards/endless_agony.rs index cb126aa6..43cc17ad 100644 --- a/src/cards/endless_agony.rs +++ b/src/cards/endless_agony.rs @@ -36,6 +36,7 @@ pub static ENDLESS_AGONY: Entity = make_entity_card( &[], ENDLESS_AGONY_ON_DRAW, PlayRestriction::Always, + &[], ); // Upgraded pub static ENDLESS_AGONY_PLUS: Entity = Entity { diff --git a/src/cards/envenom.rs b/src/cards/envenom.rs index 5ef21031..d26601aa 100644 --- a/src/cards/envenom.rs +++ b/src/cards/envenom.rs @@ -1,7 +1,7 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static ENVENOM: Entity = make_entity_card( CardName::Envenom, @@ -29,6 +29,7 @@ pub static ENVENOM: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Poison], ); // Upgraded pub static ENVENOM_PLUS: Entity = Entity { diff --git a/src/cards/escape_plan.rs b/src/cards/escape_plan.rs index 44eed7f7..d446861e 100644 --- a/src/cards/escape_plan.rs +++ b/src/cards/escape_plan.rs @@ -32,6 +32,7 @@ pub static ESCAPE_PLAN: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static ESCAPE_PLAN_PLUS: Entity = Entity { diff --git a/src/cards/eviscerate.rs b/src/cards/eviscerate.rs index b2319486..4a64c38b 100644 --- a/src/cards/eviscerate.rs +++ b/src/cards/eviscerate.rs @@ -1,6 +1,6 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static EVISCERATE: Entity = make_entity_card( CardName::Eviscerate, @@ -43,6 +43,7 @@ pub static EVISCERATE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Discard], ); // Upgraded pub static EVISCERATE_PLUS: Entity = Entity { diff --git a/src/cards/expertise.rs b/src/cards/expertise.rs index ba81b979..fbfe8bdd 100644 --- a/src/cards/expertise.rs +++ b/src/cards/expertise.rs @@ -22,6 +22,7 @@ pub static EXPERTISE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static EXPERTISE_PLUS: Entity = Entity { diff --git a/src/cards/finisher.rs b/src/cards/finisher.rs index bdf80ac3..b3137584 100644 --- a/src/cards/finisher.rs +++ b/src/cards/finisher.rs @@ -25,6 +25,7 @@ pub static FINISHER: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static FINISHER_PLUS: Entity = Entity { diff --git a/src/cards/flechettes.rs b/src/cards/flechettes.rs index e37a8272..17ae9206 100644 --- a/src/cards/flechettes.rs +++ b/src/cards/flechettes.rs @@ -25,6 +25,7 @@ pub static FLECHETTES: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static FLECHETTES_PLUS: Entity = Entity { diff --git a/src/cards/flying_knee.rs b/src/cards/flying_knee.rs index 0df7ef4e..2257e184 100644 --- a/src/cards/flying_knee.rs +++ b/src/cards/flying_knee.rs @@ -39,6 +39,7 @@ pub static FLYING_KNEE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static FLYING_KNEE_PLUS: Entity = Entity { diff --git a/src/cards/footwork.rs b/src/cards/footwork.rs index f78ca36e..c3e2e2c6 100644 --- a/src/cards/footwork.rs +++ b/src/cards/footwork.rs @@ -29,6 +29,7 @@ pub static FOOTWORK: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static FOOTWORK_PLUS: Entity = Entity { diff --git a/src/cards/glass_knife.rs b/src/cards/glass_knife.rs index 1d8bafac..0ce291f6 100644 --- a/src/cards/glass_knife.rs +++ b/src/cards/glass_knife.rs @@ -40,6 +40,7 @@ pub static GLASS_KNIFE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static GLASS_KNIFE_PLUS: Entity = Entity { diff --git a/src/cards/grand_finale.rs b/src/cards/grand_finale.rs index 65acf591..c921e68d 100644 --- a/src/cards/grand_finale.rs +++ b/src/cards/grand_finale.rs @@ -25,6 +25,7 @@ pub static GRAND_FINALE: Entity = make_entity_card( &[], &[], PlayRestriction::DrawPileEmpty, + &[], ); // Upgraded pub static GRAND_FINALE_PLUS: Entity = Entity { diff --git a/src/cards/heel_hook.rs b/src/cards/heel_hook.rs index 62bf4b30..bbdc2175 100644 --- a/src/cards/heel_hook.rs +++ b/src/cards/heel_hook.rs @@ -35,6 +35,7 @@ pub static HEEL_HOOK: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static HEEL_HOOK_PLUS: Entity = Entity { diff --git a/src/cards/infinite_blades.rs b/src/cards/infinite_blades.rs index 334a749e..dbc7fc0b 100644 --- a/src/cards/infinite_blades.rs +++ b/src/cards/infinite_blades.rs @@ -1,7 +1,7 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static INFINITE_BLADES: Entity = make_entity_card( CardName::InfiniteBlades, @@ -29,6 +29,7 @@ pub static INFINITE_BLADES: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Shiv], ); // Upgraded pub static INFINITE_BLADES_PLUS: Entity = Entity { diff --git a/src/cards/leg_sweep.rs b/src/cards/leg_sweep.rs index 4b2b45a8..ba186d3e 100644 --- a/src/cards/leg_sweep.rs +++ b/src/cards/leg_sweep.rs @@ -39,6 +39,7 @@ pub static LEG_SWEEP: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static LEG_SWEEP_PLUS: Entity = Entity { diff --git a/src/cards/malaise.rs b/src/cards/malaise.rs index bc8b1548..b223eedd 100644 --- a/src/cards/malaise.rs +++ b/src/cards/malaise.rs @@ -42,6 +42,7 @@ pub static MALAISE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static MALAISE_PLUS: Entity = Entity { diff --git a/src/cards/masterful_stab.rs b/src/cards/masterful_stab.rs index 1eea1d5d..234ba3e7 100644 --- a/src/cards/masterful_stab.rs +++ b/src/cards/masterful_stab.rs @@ -25,6 +25,7 @@ pub static MASTERFUL_STAB: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static MASTERFUL_STAB_PLUS: Entity = Entity { diff --git a/src/cards/neutralize.rs b/src/cards/neutralize.rs index 5c2f4850..eb9f8e2a 100644 --- a/src/cards/neutralize.rs +++ b/src/cards/neutralize.rs @@ -39,6 +39,7 @@ pub static NEUTRALIZE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static NEUTRALIZE_PLUS: Entity = Entity { diff --git a/src/cards/nightmare.rs b/src/cards/nightmare.rs index b52fb42e..36cf2e57 100644 --- a/src/cards/nightmare.rs +++ b/src/cards/nightmare.rs @@ -25,6 +25,7 @@ pub static NIGHTMARE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static NIGHTMARE_PLUS: Entity = Entity { diff --git a/src/cards/noxious_fumes.rs b/src/cards/noxious_fumes.rs index f855076b..5c912876 100644 --- a/src/cards/noxious_fumes.rs +++ b/src/cards/noxious_fumes.rs @@ -1,7 +1,7 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static NOXIOUS_FUMES: Entity = make_entity_card( CardName::NoxiousFumes, @@ -29,6 +29,7 @@ pub static NOXIOUS_FUMES: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Poison], ); // Upgraded pub static NOXIOUS_FUMES_PLUS: Entity = Entity { diff --git a/src/cards/outmaneuver.rs b/src/cards/outmaneuver.rs index c54d9397..b75b667f 100644 --- a/src/cards/outmaneuver.rs +++ b/src/cards/outmaneuver.rs @@ -29,6 +29,7 @@ pub static OUTMANEUVER: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static OUTMANEUVER_PLUS: Entity = Entity { diff --git a/src/cards/phantasmal_killer.rs b/src/cards/phantasmal_killer.rs index 5dbf9874..01e8f4eb 100644 --- a/src/cards/phantasmal_killer.rs +++ b/src/cards/phantasmal_killer.rs @@ -29,6 +29,7 @@ pub static PHANTASMAL_KILLER: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static PHANTASMAL_KILLER_PLUS: Entity = Entity { diff --git a/src/cards/piercing_wail.rs b/src/cards/piercing_wail.rs index 83a901a4..36ff3f03 100644 --- a/src/cards/piercing_wail.rs +++ b/src/cards/piercing_wail.rs @@ -42,6 +42,7 @@ pub static PIERCING_WAIL: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static PIERCING_WAIL_PLUS: Entity = Entity { diff --git a/src/cards/poisoned_stab.rs b/src/cards/poisoned_stab.rs index 51e7dae3..cff2d45e 100644 --- a/src/cards/poisoned_stab.rs +++ b/src/cards/poisoned_stab.rs @@ -1,7 +1,7 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; use crate::modifier::ModifierKind; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static POISONED_STAB: Entity = make_entity_card( CardName::PoisonedStab, @@ -39,6 +39,7 @@ pub static POISONED_STAB: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Poison], ); // Upgraded: +2 damage, +1 poison pub static POISONED_STAB_PLUS: Entity = Entity { diff --git a/src/cards/predator.rs b/src/cards/predator.rs index d64105c2..6269c763 100644 --- a/src/cards/predator.rs +++ b/src/cards/predator.rs @@ -39,6 +39,7 @@ pub static PREDATOR: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static PREDATOR_PLUS: Entity = Entity { diff --git a/src/cards/prepared.rs b/src/cards/prepared.rs index 0ce27c3d..c8e507ac 100644 --- a/src/cards/prepared.rs +++ b/src/cards/prepared.rs @@ -34,6 +34,7 @@ pub static PREPARED: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static PREPARED_PLUS: Entity = Entity { diff --git a/src/cards/quick_slash.rs b/src/cards/quick_slash.rs index c06acda5..70908186 100644 --- a/src/cards/quick_slash.rs +++ b/src/cards/quick_slash.rs @@ -32,6 +32,7 @@ pub static QUICK_SLASH: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static QUICK_SLASH_PLUS: Entity = Entity { diff --git a/src/cards/reflex.rs b/src/cards/reflex.rs index acf598cb..ca8f5c52 100644 --- a/src/cards/reflex.rs +++ b/src/cards/reflex.rs @@ -1,6 +1,6 @@ use crate::effect::{Effect, EffectKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; const ON_DISCARD: &[Effect] = &[Effect { kind: EffectKind::CardDraw { count: 2 }, @@ -29,6 +29,7 @@ pub static REFLEX: Entity = make_entity_card( ON_DISCARD, &[], PlayRestriction::Never, + &[Tag::Discard], ); // Upgraded pub static REFLEX_PLUS: Entity = Entity { diff --git a/src/cards/riddle_with_holes.rs b/src/cards/riddle_with_holes.rs index 95ef57b1..74d9f4d4 100644 --- a/src/cards/riddle_with_holes.rs +++ b/src/cards/riddle_with_holes.rs @@ -35,6 +35,7 @@ pub static RIDDLE_WITH_HOLES: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static RIDDLE_WITH_HOLES_PLUS: Entity = Entity { diff --git a/src/cards/setup.rs b/src/cards/setup.rs index 1a26a91e..a72989c2 100644 --- a/src/cards/setup.rs +++ b/src/cards/setup.rs @@ -25,6 +25,7 @@ pub static SETUP: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static SETUP_PLUS: Entity = Entity { diff --git a/src/cards/shiv.rs b/src/cards/shiv.rs index 4286f3b9..0d0b257b 100644 --- a/src/cards/shiv.rs +++ b/src/cards/shiv.rs @@ -1,6 +1,6 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static SHIV: Entity = make_entity_card( CardName::Shiv, @@ -25,6 +25,7 @@ pub static SHIV: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Shiv], ); // Upgraded pub static SHIV_PLUS: Entity = Entity { diff --git a/src/cards/skewer.rs b/src/cards/skewer.rs index ad0b3b1b..86d7305c 100644 --- a/src/cards/skewer.rs +++ b/src/cards/skewer.rs @@ -25,6 +25,7 @@ pub static SKEWER: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static SKEWER_PLUS: Entity = Entity { diff --git a/src/cards/slice.rs b/src/cards/slice.rs index 0dd51294..5666135f 100644 --- a/src/cards/slice.rs +++ b/src/cards/slice.rs @@ -25,6 +25,7 @@ pub static SLICE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static SLICE_PLUS: Entity = Entity { diff --git a/src/cards/slimed.rs b/src/cards/slimed.rs index 110932c6..6c017b8f 100644 --- a/src/cards/slimed.rs +++ b/src/cards/slimed.rs @@ -17,4 +17,5 @@ pub static SLIMED: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); diff --git a/src/cards/sneaky_strike.rs b/src/cards/sneaky_strike.rs index ef6a4bb1..52aaa4b7 100644 --- a/src/cards/sneaky_strike.rs +++ b/src/cards/sneaky_strike.rs @@ -1,6 +1,6 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static SNEAKY_STRIKE: Entity = make_entity_card( CardName::SneakyStrike, @@ -32,6 +32,7 @@ pub static SNEAKY_STRIKE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Discard], ); // Upgraded pub static SNEAKY_STRIKE_PLUS: Entity = Entity { diff --git a/src/cards/storm_of_steel.rs b/src/cards/storm_of_steel.rs index a57dc082..c92a9312 100644 --- a/src/cards/storm_of_steel.rs +++ b/src/cards/storm_of_steel.rs @@ -1,6 +1,6 @@ use crate::effect::{Effect, EffectKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static STORM_OF_STEEL: Entity = make_entity_card( CardName::StormOfSteel, @@ -22,6 +22,7 @@ pub static STORM_OF_STEEL: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Shiv, Tag::Discard], ); // Upgraded pub static STORM_OF_STEEL_PLUS: Entity = Entity { diff --git a/src/cards/strike.rs b/src/cards/strike.rs index 7fe5953b..bb26562f 100644 --- a/src/cards/strike.rs +++ b/src/cards/strike.rs @@ -25,6 +25,7 @@ pub static STRIKE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static STRIKE_PLUS: Entity = Entity { diff --git a/src/cards/sucker_punch.rs b/src/cards/sucker_punch.rs index b2d91e04..d73c7b5e 100644 --- a/src/cards/sucker_punch.rs +++ b/src/cards/sucker_punch.rs @@ -39,6 +39,7 @@ pub static SUCKER_PUNCH: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static SUCKER_PUNCH_PLUS: Entity = Entity { diff --git a/src/cards/survivor.rs b/src/cards/survivor.rs index 229d00ea..f138fe81 100644 --- a/src/cards/survivor.rs +++ b/src/cards/survivor.rs @@ -1,6 +1,6 @@ use crate::effect::{CandidatePool, DiscardSource, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static SURVIVOR: Entity = make_entity_card( CardName::Survivor, @@ -37,6 +37,7 @@ pub static SURVIVOR: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Discard], ); // Upgraded pub static SURVIVOR_PLUS: Entity = Entity { diff --git a/src/cards/tactician.rs b/src/cards/tactician.rs index 3ea502e0..c543f1bb 100644 --- a/src/cards/tactician.rs +++ b/src/cards/tactician.rs @@ -1,6 +1,6 @@ use crate::effect::{Effect, EffectKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; const ON_DISCARD: &[Effect] = &[Effect { kind: EffectKind::EnergyGain { amount: 1 }, @@ -29,6 +29,7 @@ pub static TACTICIAN: Entity = make_entity_card( ON_DISCARD, &[], PlayRestriction::Never, + &[Tag::Discard], ); pub static TACTICIAN_PLUS: Entity = Entity { card_upgraded: true, diff --git a/src/cards/terror.rs b/src/cards/terror.rs index 91270bf2..b2fd79e9 100644 --- a/src/cards/terror.rs +++ b/src/cards/terror.rs @@ -31,6 +31,7 @@ pub static TERROR: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static TERROR_PLUS: Entity = Entity { diff --git a/src/cards/tools_of_the_trade.rs b/src/cards/tools_of_the_trade.rs index c182de2f..dbb1d129 100644 --- a/src/cards/tools_of_the_trade.rs +++ b/src/cards/tools_of_the_trade.rs @@ -29,6 +29,7 @@ pub static TOOLS_OF_THE_TRADE: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static TOOLS_OF_THE_TRADE_PLUS: Entity = Entity { diff --git a/src/cards/unload.rs b/src/cards/unload.rs index 22ef272e..6f61a74a 100644 --- a/src/cards/unload.rs +++ b/src/cards/unload.rs @@ -1,6 +1,6 @@ use crate::effect::{CandidatePool, Effect, EffectKind, SelectionKind, Target}; use crate::entity::{CardCostKind, Entity, PlayRestriction, make_entity_card}; -use crate::types::{CardColor, CardKind, CardName, CardRarity}; +use crate::types::{CardColor, CardKind, CardName, CardRarity, Tag}; pub static UNLOAD: Entity = make_entity_card( CardName::Unload, @@ -32,6 +32,7 @@ pub static UNLOAD: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[Tag::Discard], ); // Upgraded pub static UNLOAD_PLUS: Entity = Entity { diff --git a/src/cards/well_laid_plans.rs b/src/cards/well_laid_plans.rs index 1acbcd80..f56b3480 100644 --- a/src/cards/well_laid_plans.rs +++ b/src/cards/well_laid_plans.rs @@ -29,6 +29,7 @@ pub static WELL_LAID_PLANS: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static WELL_LAID_PLANS_PLUS: Entity = Entity { diff --git a/src/cards/wraith_form.rs b/src/cards/wraith_form.rs index db4dec51..edb26a26 100644 --- a/src/cards/wraith_form.rs +++ b/src/cards/wraith_form.rs @@ -42,6 +42,7 @@ pub static WRAITH_FORM: Entity = make_entity_card( &[], &[], PlayRestriction::Always, + &[], ); // Upgraded pub static WRAITH_FORM_PLUS: Entity = Entity { diff --git a/src/entity.rs b/src/entity.rs index 15118319..cb2177f5 100644 --- a/src/entity.rs +++ b/src/entity.rs @@ -14,7 +14,7 @@ use crate::modifier::{Modifiers, ZERO_MODIFIERS}; // with practical caps, etc.). Bump when a card legitimately exceeds it pub const MAX_EFFECTS_PER_CARD: usize = 8; use crate::types::{ - CardColor, CardKind, CardName, CardRarity, MonsterKind, MonsterName, RoomKind, Vitals, + CardColor, CardKind, CardName, CardRarity, MonsterKind, MonsterName, RoomKind, Tag, Vitals, ZERO_VITALS, }; @@ -115,6 +115,8 @@ pub struct Entity { pub card_on_discard_effects: &'static [Effect], // Fires AFTER the CardDraw loop completes, whether the card landed in hand or discard pub card_on_draw_effects: &'static [Effect], + // ML-facing archetype tags (Poison, Shiv, Discard). Engine ignores them + pub card_tags: &'static [Tag], // Room-only pub room_y: usize, @@ -160,6 +162,7 @@ const ZERO_ENTITY: Entity = Entity { card_effects_len: 0, card_on_discard_effects: &[], card_on_draw_effects: &[], + card_tags: &[], room_y: 0, room_x: 0, room_kind: RoomKind::CombatBoss, @@ -218,6 +221,7 @@ pub const fn make_entity_card( on_discard_effects: &'static [Effect], on_draw_effects: &'static [Effect], play_restriction: PlayRestriction, + tags: &'static [Tag], ) -> Entity { assert!( effects.len() <= MAX_EFFECTS_PER_CARD, @@ -247,6 +251,7 @@ pub const fn make_entity_card( card_effects_len: effects.len() as u8, card_on_discard_effects: on_discard_effects, card_on_draw_effects: on_draw_effects, + card_tags: tags, ..ZERO_ENTITY } } diff --git a/src/ffi.rs b/src/ffi.rs index 94bfe6b0..40945e33 100644 --- a/src/ffi.rs +++ b/src/ffi.rs @@ -25,7 +25,7 @@ use crate::modifier::{ use crate::game::{GameState as InternalGameState, Location}; use crate::types::{ CardColor as InternalCardColor, CardKind as InternalCardKind, CardRarity as InternalCardRarity, - Phase as InternalPhase, RoomKind as InternalRoomKind, + Phase as InternalPhase, RoomKind as InternalRoomKind, Tag as InternalTag, }; use crate::utils::fill_alive_monster_ids; @@ -95,6 +95,24 @@ impl From for CardRarity { } } +#[pyclass(eq, eq_int, hash, frozen, name = "Tag")] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum Tag { + Poison, + Shiv, + Discard, +} + +impl From for Tag { + fn from(t: InternalTag) -> Self { + match t { + InternalTag::Poison => Self::Poison, + InternalTag::Shiv => Self::Shiv, + InternalTag::Discard => Self::Discard, + } + } +} + #[pyclass(eq, hash, frozen, name = "CardCostKind")] #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum CardCostKind { @@ -593,6 +611,8 @@ pub struct Card { /// `card.cost <= energy.current` before offering it as a legal action. pub playable: bool, pub effects: Vec, + /// ML-facing archetype tags (Poison, Shiv, Discard). + pub tags: Vec, } #[pyclass(frozen, get_all)] @@ -856,6 +876,7 @@ fn build_view_card_template( .iter() .map(Effect::from_internal) .collect(), + tags: card.card_tags.iter().copied().map(Into::into).collect(), } } diff --git a/src/lib.rs b/src/lib.rs index 53139a2a..4ca8f384 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -87,6 +87,7 @@ fn slai(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_class::()?; m.add_class::()?; m.add_class::()?; + m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; diff --git a/src/types.rs b/src/types.rs index a25d18ad..7b013eb6 100644 --- a/src/types.rs +++ b/src/types.rs @@ -210,6 +210,13 @@ pub enum CardRarity { Curse, } +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum Tag { + Poison, + Shiv, + Discard, +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum MonsterName { Cultist,