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
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
|
|
}
|