package card import ( "log" "path" "strconv" "git.tuxpa.in/a/card_id/common/data" "lukechampine.com/frand" ) type Dealer struct { Brands map[string]*Brand TotalProbability float64 } func NewDealer() *Dealer { return &Dealer{ Brands: make(map[string]*Brand, 12), TotalProbability: 0, } } func (g *Dealer) CardNames() []string { out := map[string]struct{}{} for _, br := range g.Brands { for _, c := range br.RewardDeck.Cards { out[c.CleanName] = struct{}{} } if br.SpecialDeck != nil { for _, c := range br.SpecialDeck.Cards { out[c.CleanName] = struct{}{} } } } keys := make([]string, 0, len(out)) for k := range out { keys = append(keys, k) } return keys } func (g *Dealer) ReadFromRoot(datadir string) (*Dealer, error) { if datadir == "" { datadir = "./data" } grades, err := data.NewGradesFromFile(path.Join(datadir, "GradeInfo.yaml")) if err != nil { return nil, err } for _, v := range grades { lvl := &Brand{} lvl.Name = strconv.Itoa(v.Grade) g.Brands[lvl.Name] = lvl lvl.SelectionWeight = v.Rate g.TotalProbability = g.TotalProbability + v.Rate rres, err := data.NewResultsFromFile(path.Join(datadir, "ResultTable", lvl.Name+".yaml")) if err != nil { return nil, err } lvl.RewardDeck = NewDeck(rres) if v.SpecialRate > 0 { lvl.SpecialChance = v.SpecialRate sres, err := data.NewResultsFromFile(path.Join(datadir, "SpecialTable", lvl.Name+".yaml")) if err != nil { return nil, err } lvl.SpecialDeck = NewDeck(sres) } } return g, nil } func (g *Dealer) GetBrand() *Brand { selector := frand.Float64() * g.TotalProbability sofar := 0.0 if len(g.Brands) == 0 { return nil } for _, v := range g.Brands { sofar = sofar + v.SelectionWeight if sofar >= selector-0.000000001 { return v } } log.Println("BAD BAD BAD BAD BAD BAD PLEASE REPORT OH NO OH NO OH FISJAFIJNSAF") return g.GetBrand() }