/
movement.go
119 lines (99 loc) · 1.97 KB
/
movement.go
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package ospokemon
import (
"github.com/ospokemon/ospokemon/space"
"time"
)
const PARTmovement = "movement"
const PARTwalk = "walk"
var VECTup = &space.Vector{0, -1}
var VECTright = &space.Vector{1, 0}
var VECTleft = &space.Vector{-1, 0}
var VECTdown = &space.Vector{0, 1}
type Movement struct {
Lock bool
Left bool
Up bool
Right bool
Down bool
Target *space.Point
}
type Walk string
func (m *Movement) Part() string {
return PARTmovement
}
func (parts Parts) GetMovement() *Movement {
movement, _ := parts[PARTmovement].(*Movement)
return movement
}
func (w Walk) Part() string {
return PARTwalk
}
func (parts Parts) GetWalk() Walk {
walk, _ := parts[PARTwalk].(Walk)
return walk
}
func (m *Movement) Update(u *Universe, e *Entity, d time.Duration) {
if m.Lock {
return
}
var vector space.Vector
if m.Target != nil {
vector = space.Line{
e.Shape.Center(),
*m.Target,
}.Vector()
} else {
vector = m.makeWalkVector()
}
stats := e.GetStats()
speedStat := stats["speed"]
vector = vector.MakeUnit().Multiply(speedStat.Value)
e.Move(vector, u)
}
func (m *Movement) Snapshot() map[string]interface{} {
return nil
}
func (m *Movement) Walk(direction string) {
if direction == "up" {
m.Up = true
} else if direction == "right" {
m.Right = true
} else if direction == "left" {
m.Left = true
} else if direction == "down" {
m.Down = true
} else {
return
}
m.Target = nil
}
func (m *Movement) ClearWalk(direction string) {
if direction == "up" {
m.Up = false
} else if direction == "right" {
m.Right = false
} else if direction == "left" {
m.Left = false
} else if direction == "down" {
m.Down = false
} else {
return
}
m.Target = nil
}
func (m *Movement) makeWalkVector() space.Vector {
vector := space.Vector{}
if m.Left {
vector = vector.Add(*VECTleft)
}
if m.Up {
vector = vector.Add(*VECTup)
}
if m.Right {
vector = vector.Add(*VECTright)
}
if m.Down {
vector = vector.Add(*VECTdown)
}
return vector
}