package game type effect interface { apply(*LocalState) end(*LocalState) } type dynamicEffect struct { _apply func(*LocalState) _end func(*LocalState) } func (e *dynamicEffect) apply(s *LocalState) { e._apply(s) } func (e *dynamicEffect) end(s *LocalState) { e._end(s) } func newAdjustmentEffect(adjust func(Permanent, int), u *Unit, delta int) effect { apply := func(*LocalState) { adjust(u, delta) } end := func(*LocalState) { adjust(u, -delta) } return &dynamicEffect{apply, end} } func newMeleeModificationEffect(u *Unit, delta int) effect { return newAdjustmentEffect(adjustMelee, u, delta) } func newAttackModificationEffect(u *Unit, delta int) effect { return newAdjustmentEffect(adjustAttack, u, delta) } func newMovementModificationEffect(u *Unit, delta int) effect { return newAdjustmentEffect(adjustMovement, u, delta) } func newHealthModificationEffect(u *Unit, delta int) effect { return newAdjustmentEffect(adjustHealth, u, delta) } func newTmpEffect(p Permanent, effect string) effect { apply := func(*LocalState) { p.addTmpEffect(effect) } end := func(*LocalState) { p.removeTmpEffect(effect) } return &dynamicEffect{apply, end} }