Skip to content
This repository has been archived by the owner on Nov 25, 2024. It is now read-only.

Commit

Permalink
Objective Chart Added
Browse files Browse the repository at this point in the history
  • Loading branch information
achhabra2 committed Mar 7, 2021
1 parent 4cd0209 commit ed78d89
Show file tree
Hide file tree
Showing 3 changed files with 152 additions and 25 deletions.
104 changes: 93 additions & 11 deletions stats/graphs.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,23 +24,27 @@ func PlotStats(data StatsJSON) image.Image {
WorkerDeaths := make(plotter.Values, 8)

counter := 0
for name, playerStats := range stats {
labels[counter] = name
// QueenKills = append(QueenKills, float64(playerStats["QueenKills"]))
QueenKills[counter] = float64(playerStats["QueenKills"])
WarriorKills[counter] = float64(playerStats["WarriorKills"])
WorkerKills[counter] = float64(playerStats["WorkerKills"])
WarriorDeaths[counter] = float64(playerStats["WarriorDeaths"])
WorkerDeaths[counter] = float64(playerStats["WorkerDeaths"])
counter++
for _, teamStats := range stats {
for name, playerStats := range teamStats {
labels[counter] = name
// QueenKills = append(QueenKills, float64(playerStats["QueenKills"]))
QueenKills[counter] = float64(playerStats["QueenKills"])
WarriorKills[counter] = float64(playerStats["WarriorKills"])
WorkerKills[counter] = float64(playerStats["WorkerKills"])
WarriorDeaths[counter] = float64(playerStats["WarriorDeaths"])
WorkerDeaths[counter] = float64(playerStats["WorkerDeaths"])
counter++
}
}

p, err := plot.New()
if err != nil {
panic(err)
}
p.Title.Text = "Advanced Stats"
p.Title.Text = "Military Stats"
p.Title.Font.Size = vg.Points(20)
p.Y.Label.Text = "Count"
p.Y.Label.Font.Size = vg.Points(16)

w := vg.Points(20)

Expand Down Expand Up @@ -90,10 +94,88 @@ func PlotStats(data StatsJSON) image.Image {
p.Legend.Add("Q/W-Deaths", barsD)
p.Legend.Add("WorkerDeaths", barsE)
p.Legend.Top = true
p.Legend.Font.Size = vg.Points(20)
p.NominalX(labels...)
p.X.Tick.Label.Font.Size = vg.Points(12)
p.Y.Tick.Label.Font.Size = vg.Points(16)
// Draw the plot to an in-memory image.
img := image.NewRGBA(image.Rect(0, 0, 16*dpi, 9*dpi))
c := vgimg.NewWith(vgimg.UseImage(img))
p.Draw(draw.New(c))

// if err := p.Save(16*vg.Inch, 8*vg.Inch, "barchart.png"); err != nil {
// panic(err)
// }

return c.Image()
}

func PlotObjectiveStats(data StatsJSON) image.Image {
stats := data.AdvancedStats()

labels := make([]string, 8)
BerriesDunked := make(plotter.Values, 8)
BerriesThrown := make(plotter.Values, 8)
Snail := make(plotter.Values, 8)

counter := 0
for _, teamStats := range stats {
for name, playerStats := range teamStats {
labels[counter] = name
// QueenKills = append(QueenKills, float64(playerStats["QueenKills"]))
BerriesDunked[counter] = float64(playerStats["BerryDunks"])
BerriesThrown[counter] = float64(playerStats["BerryThrows"])
Snail[counter] = float64(playerStats["Snail"]) / 50
counter++
}
}

p, err := plot.New()
if err != nil {
panic(err)
}
p.Title.Text = "Objective Stats"
p.Title.Font.Size = vg.Points(20)
p.Y.Label.Text = "Count"
p.Y.Label.Font.Size = vg.Points(16)

w := vg.Points(20)

barsA, err := plotter.NewBarChart(BerriesDunked, w)
if err != nil {
panic(err)
}
barsA.LineStyle.Width = vg.Length(0)
barsA.Color = plotutil.Color(0)
barsA.Offset = -w

barsB, err := plotter.NewBarChart(BerriesThrown, w)
if err != nil {
panic(err)
}
barsB.LineStyle.Width = vg.Length(0)
barsB.Color = plotutil.Color(1)

barsC, err := plotter.NewBarChart(Snail, w)
if err != nil {
panic(err)
}
barsC.LineStyle.Width = vg.Length(0)
barsC.Color = plotutil.Color(2)
barsC.Offset = w

p.Add(barsA, barsB, barsC)
p.Legend.Add("BerriesDunked", barsA)
p.Legend.Add("BerriesThrown", barsB)
p.Legend.Add("Snail/50", barsC)
p.Legend.Top = true
p.Legend.Font.Size = vg.Points(20)
p.NominalX(labels...)
p.X.Tick.Label.Font.Size = vg.Points(12)
p.Y.Tick.Label.Font.Size = vg.Points(16)

// Draw the plot to an in-memory image.
img := image.NewRGBA(image.Rect(0, 0, 16*dpi, 8*dpi))
img := image.NewRGBA(image.Rect(0, 0, 16*dpi, 9*dpi))
c := vgimg.NewWith(vgimg.UseImage(img))
p.Draw(draw.New(c))

Expand Down
44 changes: 36 additions & 8 deletions stats/json_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,21 +208,49 @@ func (statJson *StatsJSON) MapsWon() map[string]int {
return output
}

func (statJson *StatsJSON) AdvancedStats() map[string]map[string]int {
output := make(map[string]map[string]int)
func (statJson *StatsJSON) AdvancedStats() []map[string]map[string]int {
goldStats := make(map[string]map[string]int)
blueStats := make(map[string]map[string]int)

for _, player := range statJson.PlayerMatchStats {
playerMap := make(map[string]int)
output[player.Nickname] = playerMap
if player.Team == 1 {
goldStats[player.Nickname] = playerMap
} else {
blueStats[player.Nickname] = playerMap
}
}
for _, game := range statJson.Games {
for _, player := range game.PlayerStats {
output[player.Nickname]["QueenKills"] += player.TotalQueenKillCount
output[player.Nickname]["WarriorKills"] += player.TotalWarriorKillCount
output[player.Nickname]["WorkerKills"] += player.TotalWorkerKillCount
output[player.Nickname]["WarriorDeaths"] += player.WarriorAndQueenDeathCount
output[player.Nickname]["WorkerDeaths"] += player.WorkerDeathCount
if player.Team == 1 {
goldStats[player.Nickname]["QueenKills"] += player.TotalQueenKillCount
goldStats[player.Nickname]["WarriorKills"] += player.TotalWarriorKillCount
goldStats[player.Nickname]["WorkerKills"] += player.TotalWorkerKillCount
goldStats[player.Nickname]["WarriorDeaths"] += player.WarriorAndQueenDeathCount
goldStats[player.Nickname]["WorkerDeaths"] += player.WorkerDeathCount
goldStats[player.Nickname]["Team"] += player.Team
goldStats[player.Nickname]["WarriorUptime"] += int(player.TimeSpentAsWarriorSeconds)
goldStats[player.Nickname]["BerryDunks"] += (player.TotalBerryDeposits - player.TotalBerryThrowIns)
goldStats[player.Nickname]["BerryThrows"] += player.TotalBerryThrowIns
goldStats[player.Nickname]["EntityType"] += player.EntityType
goldStats[player.Nickname]["Snail"] += int(player.TotalSnailDistance)
} else {
blueStats[player.Nickname]["QueenKills"] += player.TotalQueenKillCount
blueStats[player.Nickname]["WarriorKills"] += player.TotalWarriorKillCount
blueStats[player.Nickname]["WorkerKills"] += player.TotalWorkerKillCount
blueStats[player.Nickname]["WarriorDeaths"] += player.WarriorAndQueenDeathCount
blueStats[player.Nickname]["WorkerDeaths"] += player.WorkerDeathCount
blueStats[player.Nickname]["Team"] += player.Team
blueStats[player.Nickname]["WarriorUptime"] += int(player.TimeSpentAsWarriorSeconds)
blueStats[player.Nickname]["BerryDunks"] += (player.TotalBerryDeposits - player.TotalBerryThrowIns)
blueStats[player.Nickname]["BerryThrows"] += player.TotalBerryThrowIns
blueStats[player.Nickname]["EntityType"] += player.EntityType
blueStats[player.Nickname]["Snail"] += int(player.TotalSnailDistance)
}
}
}
output := make([]map[string]map[string]int, 2)
output[0] = goldStats
output[1] = blueStats
return output
}
29 changes: 23 additions & 6 deletions ui.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,36 @@ package main
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
"github.com/achhabra2/kqb-json-viewer/stats"
)

func ShowAdvancedStats(app *fyne.App, data stats.StatsJSON) {
a := *app
w := a.NewWindow("Advanced Stats")

plot := stats.PlotStats(data)
advStatsPlot := stats.PlotStats(data)
objStatsPlot := stats.PlotObjectiveStats(data)
advStatsCanvas := canvas.NewImageFromImage(advStatsPlot)
objStatsCanvas := canvas.NewImageFromImage(objStatsPlot)

image := canvas.NewImageFromImage(plot)

image.FillMode = canvas.ImageFillOriginal

w.SetContent(image)
advStatsCanvas.FillMode = canvas.ImageFillOriginal
objStatsCanvas.FillMode = canvas.ImageFillOriginal
cont := container.NewVBox()
nextButton := widget.NewButtonWithIcon("Military", theme.MediaSkipNextIcon(), func() {
cont.Objects[0] = advStatsCanvas
cont.Refresh()
})
prevButton := widget.NewButtonWithIcon("Objective", theme.MediaSkipPreviousIcon(), func() {
cont.Objects[0] = objStatsCanvas
cont.Refresh()
})
controls := container.NewHBox(layout.NewSpacer(), prevButton, nextButton, layout.NewSpacer())
cont.Add(advStatsCanvas)
cont.Add(controls)
w.SetContent(cont)
w.Show()
}

0 comments on commit ed78d89

Please sign in to comment.