aboutsummaryrefslogtreecommitdiff
path: root/go/game/effect.go
blob: 1fc6d5b051c72ed9f87973cc7ed5952e173fcd68 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package game

type effect interface {
	apply(*State)
	end(*State)
}

type dynamicEffect struct {
	_apply func(*State)
	_end   func(*State)
}

func (e *dynamicEffect) apply(s *State) {
	e._apply(s)
}

func (e *dynamicEffect) end(s *State) {
	e._end(s)
}

func newAdjustmentEffect(adjust func(Permanent, int), u *Unit, delta int) effect {
	apply := func(*State) { adjust(u, delta) }
	end := func(*State) { 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(*State) { p.addTmpEffect(effect) }
	end := func(*State) { p.removeTmpEffect(effect) }
	return &dynamicEffect{apply, end}
}