-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathitem.go
127 lines (115 loc) · 2.52 KB
/
item.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
package main
import (
"fmt"
"math/rand"
)
// ItemType
const (
KEY ItemType = iota // 0 // NOTE: the effect for a key is how many chests it can open
ARMOR ItemType = iota // 1
HEALTH ItemType = iota // 2
INSTANT_DAMAGE ItemType = iota // 3
)
type ItemType int8
type Item struct {
id int64
iType ItemType
effect float64
}
var itemIDCounter int64
func getGenetateableItemsWithChance() (chances map[ItemType]float64) {
chances = make(map[ItemType]float64, INSTANT_DAMAGE+1)
chances[KEY] = 0.45 // THIS MUST REMAIN ABOVE OR EQUAL TO chestLockedChance SO ALL CHESTS CAN BE OPENED
chances[ARMOR] = 0.15
chances[HEALTH] = 0.25
chances[INSTANT_DAMAGE] = 0.15
return
}
func NewItem(iType ItemType, effect float64) *Item {
item := new(Item)
item.id = itemIDCounter
itemIDCounter++
item.iType = iType
item.effect = effect
return item
}
func getStringFromItemType(iType ItemType) string {
switch iType {
case KEY:
return "Key"
case ARMOR:
return "Armor"
case HEALTH:
return "Health"
case INSTANT_DAMAGE:
return "Damage" // TODO determine if name shoule be instant damage or just damage
default:
return "INVALID"
}
}
func (item *Item) print() {
fmt.Printf("Item: Type=%-7s Effect=%7.3f\n", getStringFromItemType(item.iType), item.effect)
}
func createItemWithType(iType ItemType) *Item {
var effect float64
switch iType {
case KEY:
chanceNeeded := rand.Float64()
switch {
case .6 > chanceNeeded:
effect = 1
case .6+.3 > chanceNeeded:
effect = 2
case .6+.3+.1 > chanceNeeded:
effect = 3
default:
effect = 1
}
case ARMOR:
chanceNeeded := rand.Float64()
switch {
case .4 > chanceNeeded:
effect = 1
case .4+.3 > chanceNeeded:
effect = 2
case .4+.3+.2 > chanceNeeded:
effect = 3
case .4+.3+.2+.1 > chanceNeeded:
effect = 4
default:
effect = 1
}
case HEALTH:
chanceNeeded := rand.Float64()
switch {
case .5 > chanceNeeded:
effect = 20
case .5+.35 > chanceNeeded:
effect = 50
case .5+.35+.1 > chanceNeeded:
effect = 100
case .5+.35+.1+.05 > chanceNeeded:
effect = 200
default:
effect = 1
}
case INSTANT_DAMAGE:
chanceNeeded := rand.Float64()
switch {
case .525 > chanceNeeded:
effect = 20
case .525+.375 > chanceNeeded:
effect = 50
case .525+.375+.075 > chanceNeeded:
effect = 100
case .525+.375+.075+.025 > chanceNeeded:
effect = 200
default:
effect = 1
}
default:
fmt.Println("IMPOSSIBLE CASE: default case in generated item type", iType)
}
item := NewItem(iType, effect)
return item
}