mirror of
https://github.com/Walter-Sparrow/lunar-tear.git
synced 2026-07-02 13:53:41 +03:00
91 lines
2.4 KiB
Go
91 lines
2.4 KiB
Go
package masterdata
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
|
|
"lunar-tear/server/internal/utils"
|
|
)
|
|
|
|
type ExploreRow struct {
|
|
ExploreId int32 `json:"ExploreId"`
|
|
ConsumeItemCount int32 `json:"ConsumeItemCount"`
|
|
RewardLotteryCount int32 `json:"RewardLotteryCount"`
|
|
}
|
|
|
|
type ExploreGradeScoreRow struct {
|
|
ExploreId int32 `json:"ExploreId"`
|
|
NecessaryScore int32 `json:"NecessaryScore"`
|
|
ExploreGradeId int32 `json:"ExploreGradeId"`
|
|
}
|
|
|
|
type ExploreGradeAssetRow struct {
|
|
ExploreGradeId int32 `json:"ExploreGradeId"`
|
|
AssetGradeIconId int32 `json:"AssetGradeIconId"`
|
|
}
|
|
|
|
type ExploreCatalog struct {
|
|
Explores map[int32]ExploreRow
|
|
GradeScores map[int32][]ExploreGradeScoreRow // keyed by ExploreId, sorted desc by NecessaryScore
|
|
GradeAssets map[int32]int32 // gradeId -> assetGradeIconId
|
|
}
|
|
|
|
func LoadExploreCatalog() (*ExploreCatalog, error) {
|
|
explores, err := utils.ReadJSON[ExploreRow]("EntityMExploreTable.json")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("load explore table: %w", err)
|
|
}
|
|
|
|
gradeScores, err := utils.ReadJSON[ExploreGradeScoreRow]("EntityMExploreGradeScoreTable.json")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("load explore grade score table: %w", err)
|
|
}
|
|
|
|
gradeAssets, err := utils.ReadJSON[ExploreGradeAssetRow]("EntityMExploreGradeAssetTable.json")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("load explore grade asset table: %w", err)
|
|
}
|
|
|
|
catalog := &ExploreCatalog{
|
|
Explores: make(map[int32]ExploreRow, len(explores)),
|
|
GradeScores: make(map[int32][]ExploreGradeScoreRow),
|
|
GradeAssets: make(map[int32]int32, len(gradeAssets)),
|
|
}
|
|
|
|
for _, e := range explores {
|
|
catalog.Explores[e.ExploreId] = e
|
|
}
|
|
|
|
for _, gs := range gradeScores {
|
|
catalog.GradeScores[gs.ExploreId] = append(catalog.GradeScores[gs.ExploreId], gs)
|
|
}
|
|
for eid := range catalog.GradeScores {
|
|
rows := catalog.GradeScores[eid]
|
|
sort.Slice(rows, func(i, j int) bool {
|
|
return rows[i].NecessaryScore > rows[j].NecessaryScore
|
|
})
|
|
catalog.GradeScores[eid] = rows
|
|
}
|
|
|
|
for _, ga := range gradeAssets {
|
|
catalog.GradeAssets[ga.ExploreGradeId] = ga.AssetGradeIconId
|
|
}
|
|
|
|
return catalog, nil
|
|
}
|
|
|
|
// GradeForScore returns the AssetGradeIconId for the given explore and score.
|
|
// Returns 0 if no matching grade is found.
|
|
func (c *ExploreCatalog) GradeForScore(exploreId, score int32) int32 {
|
|
rows, ok := c.GradeScores[exploreId]
|
|
if !ok {
|
|
return 0
|
|
}
|
|
for _, r := range rows {
|
|
if score >= r.NecessaryScore {
|
|
return c.GradeAssets[r.ExploreGradeId]
|
|
}
|
|
}
|
|
return 0
|
|
}
|