diff --git a/.gitignore b/.gitignore index 895d68a..e01a407 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ itb-ranking +*.json diff --git a/main.go b/main.go index c711d6a..fe400c1 100644 --- a/main.go +++ b/main.go @@ -89,6 +89,17 @@ type Player struct { } var players []Player +type Builder struct { + player_id int + name string + combined float64 + box_count int + box_count_rank float64 + box_rank_avg float64 + box_rank_avg_rank float64 +} +var builders []Builder + func main() { if len(os.Args) < 1 { log.Fatal("Not enough arguments: sqlite_file") @@ -537,6 +548,94 @@ func main() { of.Write(j) of.Close(); + // + // BUILDER RANKING + // + for i := range boxes { + found := false + for b := range builders { + if builders[b].name == boxes[i].builder { + found = true + s := builders[b].box_rank_avg * float64(builders[b].box_count) + boxes[i].combined + builders[b].box_count += 1 + builders[b].box_rank_avg = s / float64(builders[b].box_count) + break + } + } + if found { + continue + } + + if (boxes[i].builder == "sofar") || (boxes[i].builder == "nore") { + continue + } + + var n Builder + n.name = boxes[i].builder + n.box_count = 1 + n.box_rank_avg = boxes[i].combined + + builders = append(builders, n) + } + + // rank box count + sort.Slice(builders, func (a, b int) bool { return builders[a].box_count > builders[b].box_count }) + step = 1.0 / float64(len(builders)) + lastrank = 1.0 + last = 0 + for i := range builders { + c := builders[i].box_count + if c == last { + builders[i].box_count_rank = lastrank + } else { + last = c + lastrank = 1.0 - step * float64(i) + builders[i].box_count_rank = lastrank + } + } + + // rank boxes scoring + sort.Slice(builders, func (a, b int) bool { return builders[a].box_rank_avg > builders[b].box_rank_avg }) + step = 1.0 / float64(len(builders)) + lastrank = 1.0 + lastf = .0 + for i := range builders { + c := builders[i].box_rank_avg + if c == lastf { + builders[i].box_rank_avg_rank = lastrank + } else { + lastf = c + lastrank = 1.0 - step * float64(i) + builders[i].box_rank_avg_rank = lastrank + } + } + + // combine + for i := range builders { + builders[i].combined = + builders[i].box_rank_avg_rank + + builders[i].box_count_rank + } + sort.Slice(builders, func (a, b int) bool { return builders[a].combined > builders[b].combined }) + var builder_topranks = make(map[string]string) + for i := range builders { + if i > 30 { + break + } + builder_topranks[fmt.Sprintf("%v", i + 1)] = fmt.Sprintf("%v", builders[i].name) + } + j, err = json.Marshal(builder_topranks) + if err != nil { + log.Fatal(err) + } + // write to disc! + of, err = os.Create("top_builders.json") + if err != nil { + log.Fatal(err) + } + of.Write(j) + of.Close(); + defer db.Close() } diff --git a/mod/init.lua b/mod/init.lua index d500ba3..8ddf285 100644 --- a/mod/init.lua +++ b/mod/init.lua @@ -4,6 +4,7 @@ ranks = {} ranks.player = {} ranks.boxes = {} +ranks.builder = {} local wp = minetest.get_worldpath() @@ -41,6 +42,7 @@ end ranks.fetch = function() ranks.player = fetch_file(wp .. "/top_players.json", "r") ranks.box = fetch_file(wp .. "/top_boxes.json", "r") + ranks.builder = fetch_file(wp .. "/top_builders.json", "r") minetest.after(300, ranks.fetch) end