package helpers import ( "mazeratsgen/internal/dice" "path" "runtime" ) func LocalFile(filepath string) string { _, thisFile, _, _ := runtime.Caller(1) return path.Join(path.Dir(thisFile), filepath) } type genFunc func([2]int) string func GenUniqueItems(total int, fn genFunc, seed int64) []string { roller := dice.NewRoller(seed) items := []string{} // Generate initial items for i := 0; i < total; i++ { items = append(items, fn(roller.TableRoll())) } // Walk items and check if they match any other item. If they do then replace // it with a fresh item. This doesn't guarantee unique items, but prevents // Denial of Service attacks (a bit) by only doing 5 passes. passes := 5 for p := 0; p <= passes; p++ { for i, _ := range items { for x := 0; x < len(items); x++ { if x == i { break } if items[x] == items[i] { items[i] = fn(roller.TableRoll()) break } } } } return items }