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 a979a824..fa2d7b08 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 a2e9d46c..5c1fcd40 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 3217800c..bcdbb7e5 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 9600e2b6..1019db67 100644 --- a/src/cards/endless_agony.rs +++ b/src/cards/endless_agony.rs @@ -29,6 +29,7 @@ pub static ENDLESS_AGONY: Entity = make_entity_card( target: Target::Direct(None), }], 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 70019501..2fbabf8c 100644 --- a/src/cards/glass_knife.rs +++ b/src/cards/glass_knife.rs @@ -43,6 +43,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 8a61cb1d..9e01ed72 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 fb62d9b2..1b725fa9 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}; pub static REFLEX: Entity = make_entity_card( CardName::Reflex, @@ -22,6 +22,7 @@ pub static REFLEX: Entity = make_entity_card( }], &[], 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 c6994e82..b8c2f055 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}; pub static TACTICIAN: Entity = make_entity_card( CardName::Tactician, @@ -22,6 +22,7 @@ pub static TACTICIAN: Entity = make_entity_card( }], &[], 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/engine/mod.rs b/src/engine/mod.rs index 2f45977b..13951c1d 100644 --- a/src/engine/mod.rs +++ b/src/engine/mod.rs @@ -568,6 +568,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_card_play.rs b/src/engine/process_effect_card_play.rs index d193c5dd..2a1baa95 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_escape_plan_check.rs b/src/engine/process_effect_escape_plan_check.rs index a9960de6..59f1782e 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, effect_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; } effect_queue.push_front(Effect { kind: EffectKind::BlockGain { amount: block }, - id_source: Some(id_character), + id_source, target: Target::Direct(Some(id_character)), }); DispatchResult::Continue diff --git a/src/entity.rs b/src/entity.rs index 64490d63..df5bd096 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, }; @@ -111,6 +111,8 @@ pub struct Entity { pub card_effects_len: u8, pub card_on_discard_effects: &'static [Effect], 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, @@ -156,6 +158,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, @@ -214,6 +217,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, @@ -243,6 +247,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 e1cd83d0..93fee185 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,