package play import ( "sakura/engine" "sakura/engine/card" "sakura/engine/card/predicate" ) func Card(g *engine.Game, p *engine.Player, anyCard engine.IsCard) { switch c := anyCard.(type) { case card.IsAttack: Attack(g, p, c) } g.Stack = append(g.Stack, anyCard) } func Attack(g *engine.Game, p *engine.Player, a card.IsAttack) { att := a.Attack() opp := p.Opponent(g) if !att.Unreactable && opp.Hand.Contains(predicate.ReactionApplicable) { reactions := opp.Hand.Filter(predicate.ReactionApplicable) acs := make([]engine.Action, len(reactions), len(reactions)) for i, r := range reactions { acs[i] = &engine.PlayCard{ BaseAction: &engine.BaseAction{ User: p, BaseSource: r, Description: "Execute this unknown attack", }, } } g.May = engine.Interactions(acs...) } switch { case att.AuraDamage == card.Unselectable: opp.Life.Subtract(att.LifeDamage.Value()) case att.LifeDamage == card.Unselectable: opp.Aura.Subtract(att.AuraDamage.Value()) case att.AuraDamage.Value() > opp.Aura.Value: opp.Life.Subtract(att.LifeDamage.Value()) default: g.Actions = engine.Interactions(&engine.DesignateDamage{ Attacker: p, Defender: opp, SourceCard: a.Attack().Card, }) } } func Vigor(g *engine.Game, p *engine.Player, a engine.VigorAction) { a.From(p).Subtract(1) a.To(p).Add(1) }