OpenDiablo2/d2common/d2data/d2datadict/item_ratio.go

92 lines
2.5 KiB
Go

package d2datadict
import (
"log"
"strconv"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2txt"
)
// A helper type for item drop calculation
type dropRatioInfo struct {
frequency int
divisor int
divisorMin int
}
// ItemRatioRecord encapsulates information found in ItemRatio.txt, it specifies drop ratios
// for various types of items
// The information has been gathered from [https://d2mods.info/forum/kb/viewarticle?a=387]
type ItemRatioRecord struct {
Function string
// 0 for classic, 1 for LoD
Version bool
// 0 for normal, 1 for exceptional
Uber bool
ClassSpecific bool
// All following fields are used in item drop calculation
UniqueDropInfo dropRatioInfo
RareDropInfo dropRatioInfo
SetDropInfo dropRatioInfo
MagicDropInfo dropRatioInfo
HiQualityDropInfo dropRatioInfo
NormalDropInfo dropRatioInfo
}
// ItemRatios holds all of the ItemRatioRecords from ItemRatio.txt
var ItemRatios map[string]*ItemRatioRecord //nolint:gochecknoglobals // Currently global by design
// LoadItemRatios loads all of the ItemRatioRecords from ItemRatio.txt
func LoadItemRatios(file []byte) {
ItemRatios = make(map[string]*ItemRatioRecord)
d := d2txt.LoadDataDictionary(file)
for d.Next() {
record := &ItemRatioRecord{
Function: d.String("Function"),
Version: d.Bool("Version"),
Uber: d.Bool("Uber"),
ClassSpecific: d.Bool("Class Specific"),
UniqueDropInfo: dropRatioInfo{
frequency: d.Number("Unique"),
divisor: d.Number("UniqueDivisor"),
divisorMin: d.Number("UniqueMin"),
},
RareDropInfo: dropRatioInfo{
frequency: d.Number("Rare"),
divisor: d.Number("RareDivisor"),
divisorMin: d.Number("RareMin"),
},
SetDropInfo: dropRatioInfo{
frequency: d.Number("Set"),
divisor: d.Number("SetDivisor"),
divisorMin: d.Number("SetMin"),
},
MagicDropInfo: dropRatioInfo{
frequency: d.Number("Magic"),
divisor: d.Number("MagicDivisor"),
divisorMin: d.Number("MagicMin"),
},
HiQualityDropInfo: dropRatioInfo{
frequency: d.Number("HiQuality"),
divisor: d.Number("HiQualityDivisor"),
divisorMin: 0,
},
NormalDropInfo: dropRatioInfo{
frequency: d.Number("Normal"),
divisor: d.Number("NormalDivisor"),
divisorMin: 0,
},
}
ItemRatios[record.Function+strconv.FormatBool(record.Version)] = record
}
if d.Err != nil {
panic(d.Err)
}
log.Printf("Loaded %d ItemRatio records", len(ItemRatios))
}