/
stats.go
82 lines (73 loc) · 1.68 KB
/
stats.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
package game
import (
"errors"
"math/rand"
)
type stats struct {
Charisma uint32
Constitution uint32
Dexterity uint32
Intelligence uint32
Strength uint32
Wisdom uint32
}
// Total returns the sum of the each stat.
func (s stats) Total() uint64 {
return uint64(s.Charisma) + uint64(s.Constitution) + uint64(s.Dexterity) + uint64(s.Intelligence) + uint64(s.Strength) + uint64(s.Wisdom)
}
func (s *stats) IncreaseRandomStat() {
var statIndex int
// There is a 50% chance of picking a random stat to increase
if rand.Intn(1) == 0 {
statIndex = rand.Intn(6)
} else {
var sum int64
for i := 0; i < 6; i++ {
if v, err := s.statByIndex(i); err == nil {
sum += int64(*v) * int64(*v)
}
}
i := -1
for sum = rand.Int63n(sum); sum > 0; i++ {
if v, err := s.statByIndex(i); err == nil {
sum -= int64(*v) * int64(*v)
}
}
statIndex = i
}
if stat, err := s.statByIndex(statIndex); err == nil {
*stat++
}
}
func generateInitialStats() stats {
return stats{
Charisma: generateRandomStat(),
Constitution: generateRandomStat(),
Dexterity: generateRandomStat(),
Intelligence: generateRandomStat(),
Strength: generateRandomStat(),
Wisdom: generateRandomStat(),
}
}
func generateRandomStat() uint32 {
const baseValue = 3
r := rand.Uint32()%6 + rand.Uint32()%6 + rand.Uint32()%6
return 3 + r
}
func (s *stats) statByIndex(i int) (*uint32, error) {
switch i {
case 0:
return &s.Charisma, nil
case 1:
return &s.Constitution, nil
case 2:
return &s.Dexterity, nil
case 3:
return &s.Intelligence, nil
case 4:
return &s.Strength, nil
case 5:
return &s.Wisdom, nil
}
return nil, errors.New("index not in stat range")
}