From 899ef7448222f0d087c194b3379b702f8dd2ff8c Mon Sep 17 00:00:00 2001 From: ewy Date: Mon, 14 Sep 2026 19:48:36 +0200 Subject: add server and websocket comms --- engine/play/play.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 engine/play/play.go (limited to 'engine/play') diff --git a/engine/play/play.go b/engine/play/play.go new file mode 100644 index 0000000..42d9fa3 --- /dev/null +++ b/engine/play/play.go @@ -0,0 +1,52 @@ +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, + }, + } + } + 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) +} -- cgit v1.3.1