Files
GaCy-GO/internal/common/currency_wars_traits.go
T

75 lines
2.0 KiB
Go

package common
import (
"encoding/json"
"fmt"
)
type CurrencyWarsTrait struct {
ID uint32 `json:"id"`
Name string `json:"name"`
Thresholds []uint32 `json:"thresholds"`
ActivationType uint32 `json:"activation_type"`
TraitType uint32 `json:"trait_type"`
SeasonID uint32 `json:"season_id"`
}
type CurrencyWarsTraitsCatalog struct {
FormatVersion uint32 `json:"format_version"`
TargetClientVersion string `json:"target_client_version"`
TargetAssemblySHA256 string `json:"target_assembly_sha256"`
Traits []CurrencyWarsTrait `json:"traits"`
Effects map[string]int32 `json:"effects"`
Constants map[string]interface{} `json:"constants"`
byID map[uint32]CurrencyWarsTrait
}
func LoadCurrencyWarsTraits(catalog *CurrencyWarsCatalog) (*CurrencyWarsTraitsCatalog, error) {
raw, err := ReadResourceFile("resources/CurrencyWarsTraits.json")
if err != nil {
return nil, err
}
var out CurrencyWarsTraitsCatalog
if err = json.Unmarshal(raw, &out); err != nil {
return nil, err
}
if catalog != nil {
if out.FormatVersion != 1 || out.TargetClientVersion != catalog.ClientVersion || out.TargetAssemblySHA256 != catalog.Provenance.GameAssemblySHA256 {
return nil, fmt.Errorf("CW traits revision differs from catalog")
}
}
out.byID = make(map[uint32]CurrencyWarsTrait, len(out.Traits))
for _, t := range out.Traits {
out.byID[t.ID] = t
}
return &out, nil
}
func (c *CurrencyWarsTraitsCatalog) Trait(id uint32) (CurrencyWarsTrait, bool) {
if c == nil || c.byID == nil {
return CurrencyWarsTrait{}, false
}
t, ok := c.byID[id]
return t, ok
}
func (c *CurrencyWarsTraitsCatalog) ActiveLayer(traitID, count uint32) uint32 {
t, ok := c.Trait(traitID)
if !ok {
return 0
}
exact := t.ActivationType == 3
var layer uint32
for _, need := range t.Thresholds {
valid := count >= need
if exact {
valid = count == need
}
if valid && need > layer {
layer = need
}
}
return layer
}