package engine type BaseAction struct { User *Player BaseSource IsCard } func (b *BaseAction) Actor() *Player { return b.User } func (b *BaseAction) Source() IsCard { return b.BaseSource } func (b *BaseAction) Then(g *Game) { } type Action interface { Actor() *Player Source() IsCard Then(g *Game) } func Interactions(a ...Action) map[InteractionID]Action { m := make(map[InteractionID]Action, len(a)) for i, ac := range a { m[InteractionID(i)] = ac } return m } type DamageDecision bool var ( Aura DamageDecision = true Life DamageDecision = false ) type DesignateDamage struct { Attacker *Player Defender *Player SourceCard *Card } func (d *DesignateDamage) Actor() *Player { return d.Defender } func (d *DesignateDamage) Instigator() *Player { return d.Attacker } func (d *DesignateDamage) Then(g *Game) { } func (d *DesignateDamage) Source() IsCard { return d.SourceCard } type PlayCard struct { *BaseAction }