Builder ranking.
Combines count + box ranking (1:1). This balances quantity and quality, somewhat.
This commit is contained in:
parent
708ff344a5
commit
bab1a538eb
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +1,2 @@
|
||||
itb-ranking
|
||||
*.json
|
||||
|
99
main.go
99
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()
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user