Loggest thine Stuff
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

118 lines
2.3 KiB

package items
import (
"git.aiterp.net/stufflog3/stufflog3/entities"
"git.aiterp.net/stufflog3/stufflog3/usecases/scopes"
"sort"
)
type Result struct {
entities.Item
Requirement *entities.Requirement `json:"requirement,omitempty"`
Stats []ResultStat `json:"stats"`
}
func (r *Result) Stat(statID int) *ResultStat {
for _, stat := range r.Stats {
if stat.ID == statID {
return &stat
}
}
return nil
}
func (r *Result) AddStat(scope scopes.Result, stat entities.ItemStat) {
for i, stat2 := range r.Stats {
if stat2.ID == stat.StatID {
if stat.Required <= 0 {
r.Stats = append(r.Stats[:i], r.Stats[i+1:]...)
} else {
r.Stats[i].Acquired = stat.Acquired
r.Stats[i].Required = stat.Required
}
return
}
}
if stat.Required <= 0 {
return
}
scopeStat := scope.Stat(stat.StatID)
if scopeStat == nil {
return
}
r.Stats = append(r.Stats, ResultStat{
ID: scopeStat.ID,
Name: scopeStat.Name,
Weight: scopeStat.Weight,
Acquired: stat.Acquired,
Required: stat.Required,
})
r.SortStats()
}
func (r *Result) SortStats() {
sort.Slice(r.Stats, func(i, j int) bool {
return r.Stats[i].Name < r.Stats[j].Name
})
}
func (r *Result) RemoveStat(id int) {
for i, stat := range r.Stats {
if stat.ID == id {
r.Stats = append(r.Stats[:i], r.Stats[i+1:]...)
}
}
}
type ResultStat struct {
ID int `json:"id"`
Name string `json:"name"`
Weight float64 `json:"weight"`
Acquired int `json:"acquired"`
Required int `json:"required"`
}
func generateResult(item entities.Item, scope scopes.Result, progresses []entities.ItemStat, requirements []entities.Requirement) Result {
res := Result{
Item: item,
Stats: make([]ResultStat, 0, 8),
}
if item.RequirementID != nil {
for _, req := range requirements {
if req.ID == *item.RequirementID {
res.Requirement = &req
}
}
}
for _, progress := range progresses {
if progress.ItemID != item.ID {
continue
}
for _, stat := range scope.Stats {
if stat.ID == progress.StatID {
res.Stats = append(res.Stats, ResultStat{
ID: stat.ID,
Name: stat.Name,
Weight: stat.Weight,
Acquired: progress.Acquired,
Required: progress.Required,
})
break
}
}
}
res.SortStats()
return res
}