From 543f556fc2ae52f4f47f6241fa4fab33bec8d9fc Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 7 Mar 2018 23:35:48 +0100 Subject: Initial commit. --- shuffle/main.go | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 shuffle/main.go (limited to 'shuffle/main.go') diff --git a/shuffle/main.go b/shuffle/main.go new file mode 100644 index 0000000..fb178b6 --- /dev/null +++ b/shuffle/main.go @@ -0,0 +1,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 "" + +} -- cgit v1.2.3