-
Notifications
You must be signed in to change notification settings - Fork 0
/
DiceRoller.go
133 lines (97 loc) · 2.79 KB
/
DiceRoller.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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package engine
import (
"fmt"
"image"
"log"
"math/rand"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/ebitenutil"
"github.com/hajimehoshi/ebiten/v2/text"
"github.com/kenoyer130/wartgame/interfaces"
"github.com/kenoyer130/wartgame/models"
"github.com/kenoyer130/wartgame/ui"
)
type DiceRoller struct {
DieImage map[int]*ebiten.Image
Dice []int
msgs []string
}
func (re DiceRoller) PlaySound() {
PlaySound("Roll")
}
// rolls the indicated dice count and returns how many are equal to or greater then the target. Also returns each die result.
func (re DiceRoller) Roll(msg string, diceRollType interfaces.DiceRollType, onRoll func(die int) int) (int, []int) {
re.msgs = []string{}
re.msgs = append(re.msgs, msg)
re.msgs = append(re.msgs, fmt.Sprintf("Rolling %d to hit target %d", diceRollType.Dice, diceRollType.Target))
success := 0
results := []int{}
for i := 0; i < diceRollType.Dice; i++ {
die := rand.Intn(6) + 1
// allows application of abilities that need the raw roll
if onRoll != nil {
onRoll(die)
}
if diceRollType.AddToDice != 0 {
re.msgs = append(re.msgs, fmt.Sprintf("applying modifier of %d to die %d", diceRollType.AddToDice, die))
die = die + diceRollType.AddToDice
}
results = append(results, die)
if die >= diceRollType.Target {
success++
}
}
success, dice := re.diceRolled(results, success, diceRollType)
for _, msg := range re.msgs {
WriteMessage(msg)
}
return success, dice
}
func (re *DiceRoller) diceRolled(results []int, success int, diceRollType interfaces.DiceRollType) (int, []int) {
rolled := "Dice Rolled:"
for i := 0; i < len(results); i++ {
rolled += fmt.Sprintf(" %d", results[i])
}
re.msgs = append(re.msgs, rolled)
msg := fmt.Sprintf("%d successes out of %d", success, diceRollType.Dice)
re.msgs = append(re.msgs, msg)
models.Game().Dice = results
return success, results
}
type DiceRollerUI struct {
}
func (re DiceRoller) GetUIPanel(dice []int) *ebiten.Image {
panel := ebiten.NewImage(400, 125)
text.Draw(panel, "Dice", ui.GetFontBold(), ui.Margin, 25, ui.GetTextColor())
ui.DrawSelectorBox(ui.Rect{
X: 0,
Y: 0,
W: 399,
H: 299,
}, panel)
// r := 0
// c := 0
for _, die := range re.Dice {
re.loadDieImage(die)
// op := &ebiten.DrawImageOptions{}
// op.GeoM.Translate(float64(c*50), 10+float64(30+(r*25)))
// c++
// if c > 10 {
// r++
// }
// panel.DrawImage(DieImage[die], op)
}
return panel
}
func (re DiceRoller) loadDieImage(die int) {
if re.DieImage == nil {
re.DieImage = make(map[int]*ebiten.Image)
}
if re.DieImage[die] == nil {
img, _, err := ebitenutil.NewImageFromFile("./assets/graphics/dice.png")
if err != nil {
log.Fatal(err)
}
re.DieImage[die] = ebiten.NewImageFromImage(img.SubImage(image.Rect(4+(0*32), 5, 36, 37)))
}
}