summaryrefslogtreecommitdiff
path: root/engine/play
diff options
context:
space:
mode:
authorewy <ewy0@protonmail.com>2026-09-14 19:48:36 +0200
committerewy <ewy0@protonmail.com>2026-09-14 19:48:36 +0200
commit899ef7448222f0d087c194b3379b702f8dd2ff8c (patch)
tree8c2b508bb4d01236c7f582e4eee91fd178d09670 /engine/play
parentc69e6c0770359e2febafcf487eb21c4aa608c3e9 (diff)
add server and websocket comms
Diffstat (limited to 'engine/play')
-rw-r--r--engine/play/play.go52
1 files changed, 52 insertions, 0 deletions
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)
+}