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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
package main
import (
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"log"
"math/rand"
"os"
"strings"
"time"
)
func main() {
cards_f := flag.String("c", "../cards.json", "Path to json file with all cards.")
d_sets_f := flag.String("d", "", "Disabled Sets. (comma separated)")
o_sets_f := flag.String("o", "", "Only play with this sets. (comma separated)")
list_f := flag.Bool("l", false, "List all available sets.")
expired_f := flag.Bool("v1", false, "Play with (officially removed) cards (from the first edition)")
flag.Parse()
d_sets := strings.Split(*d_sets_f, ",")
sets := strings.Split(*o_sets_f, ",")
raw, err := ioutil.ReadFile(*cards_f)
if err != nil {
log.Fatal(err)
}
var cards []Card
var bane_card_needed bool
var bane_card Card
picked := make(map[string]bool)
json.Unmarshal(raw, &cards)
if *list_f {
fmt.Println("List all available Editions:")
printed := make(map[string]bool)
for _, v := range cards {
if printed[v.Set_de] {
continue
}
fmt.Printf(" Name (en/de): '%s' / '%s'\n", v.Set, v.Set_de)
printed[v.Set_de] = true
}
return
}
for i := 0; i < 10; i++ {
v := get_card(cards, picked, sets, d_sets, *expired_f)
picked[v.Name] = true
if v.Name_de == "Junge Hexe" {
bane_card_needed = true
for {
bane_card = get_card(cards, picked, sets, d_sets, *expired_f)
if bane_card.Cost.Coin == 2 || bane_card.Cost.Coin == 3 {
picked[bane_card.Name] = true
break
}
}
}
fmt.Printf("'%s' aus '%s' | Kosten: %d Münzen, %d Tränke, %d Schulden\n", v.Name_de, v.Set_de, v.Cost.Coin, v.Cost.Potion, v.Cost.Debt)
if bane_card_needed {
fmt.Printf(" Bannkarte: '%s' aus '%s' | Kosten: %d Münzen, %d Tränke, %d Schulden\n", bane_card.Name_de, bane_card.Set_de, bane_card.Cost.Coin, bane_card.Cost.Potion, bane_card.Cost.Debt)
bane_card_needed = false
}
}
}
func get_card(cards []Card, picked map[string]bool, sets []string, d_sets []string, v1 bool) Card {
for {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
rndm := r.Int() % len(cards)
if !cards[rndm].IsKingdom {
continue
}
if v1 {
// play with removed cards from base v1
if cards[rndm].IsEdition2 {
continue
}
} else {
if cards[rndm].IsEdition1 {
continue
}
}
if picked[cards[rndm].Name] {
continue
}
if len(d_sets) > 0 && d_sets[0] != "" {
_set := setExists(d_sets, cards)
if "" != _set {
fmt.Println("Error: This set does not exists. (" + _set + ")")
os.Exit(1)
}
if stringInSlice(cards[rndm].Set, d_sets) || stringInSlice(cards[rndm].Set_de, d_sets) {
continue
} else {
return cards[rndm]
}
}
if len(sets) > 0 && sets[0] != "" {
_set := setExists(sets, cards)
if "" != _set {
fmt.Println("Error: This set does not exists. (" + _set + ")")
os.Exit(1)
}
if stringInSlice(cards[rndm].Set, sets) || stringInSlice(cards[rndm].Set_de, sets) {
return cards[rndm]
} else {
continue
}
}
return cards[rndm]
}
return Card{}
}
func stringInSlice(a string, list []string) bool {
a = strings.ToLower(a)
for _, b := range list {
b = strings.TrimSpace(strings.ToLower(b))
if b == a {
return true
}
}
return false
}
func setExists(sets []string, cards []Card) string {
matched := make(map[string]bool)
for _, set := range sets {
for _, v := range cards {
if strings.ToLower(set) == strings.ToLower(v.Set_de) || strings.ToLower(set) == strings.ToLower(v.Set) {
matched[set] = true
}
}
}
for _, set := range sets {
if !matched[set] {
return set
}
}
return ""
}
|