package game type areaEffect interface { onEntering(Permanent) onLeaving(Permanent) } type dynamicAreaEffect struct { _onEntering func(Permanent) _onLeaving func(Permanent) } func newDynamicAreaEffect(enter func(Permanent), leave func(Permanent)) *dynamicAreaEffect { return &dynamicAreaEffect{enter, leave} } func (e *dynamicAreaEffect) onEntering(p Permanent) { if e._onEntering != nil { e._onEntering(p) } } func (e *dynamicAreaEffect) onLeaving(p Permanent) { if e._onLeaving != nil { e._onLeaving(p) } } func newCombinedAreaEffect(aoes []areaEffect) *dynamicAreaEffect { return &dynamicAreaEffect{ _onEntering: func(p Permanent) { for _, aoe := range aoes { aoe.onEntering(p) } }, _onLeaving: func(p Permanent) { for _, aoe := range aoes { aoe.onLeaving(p) } }, } } func newGrantFullActionEffect(cardPath string, f ActionFuncPrototype, desc, tag string, ) *dynamicAreaEffect { onEntering := func(p Permanent) { if cardPath != "*" && p.Card().Path() != cardPath { return } u := p.(*Unit) fa := newFullAction(u, f, desc) fa.tag = tag u.FullActions = append(u.FullActions, fa) } onLeaving := func(p Permanent) { if cardPath != "*" && p.Card().Path() != cardPath { return } u := p.(*Unit) u.removeFullAction(tag) } return newDynamicAreaEffect(onEntering, onLeaving) } func newAdjustmentAreaEffect(adjust func(Permanent, int), delta int) *dynamicAreaEffect { onEntering := func(p Permanent) { u := p.(*Unit) e := newAdjustmentEffect(adjust, u, delta) e.apply(u.controller.gameState) } onLeaving := func(p Permanent) { u := p.(*Unit) e := newAdjustmentEffect(adjust, u, delta) e.end(u.controller.gameState) } return newDynamicAreaEffect(onEntering, onLeaving) }