OpenDiablo2/d2common/d2data/d2datadict/treasure_class.go

96 lines
2.2 KiB
Go

package d2datadict
import (
"fmt"
"log"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2txt"
)
const (
maxTreasuresPerRecord = 10
treasureItemFmt = "Item%d"
treasureProbFmt = "Prob%d"
)
// TreasureClassRecord represents a rule for item drops in diablo 2
type TreasureClassRecord struct {
Name string
Group int
Level int
NumPicks int
FreqUnique int
FreqSet int
FreqRare int
FreqMagic int
FreqNoDrop int
Treasures []*Treasure
}
// Treasure describes a treasure to drop
// the Name is either a reference to an item, or to another treasure class
type Treasure struct {
Code string
Probability int
}
// TreasureClass contains all of the TreasureClassRecords
var TreasureClass map[string]*TreasureClassRecord //nolint:gochecknoglobals // Currently global by design
// LoadTreasureClassRecords loads treasure class records from TreasureClassEx.txt
//nolint:funlen // Makes no sense to split
func LoadTreasureClassRecords(file []byte) {
TreasureClass = make(map[string]*TreasureClassRecord)
d := d2txt.LoadDataDictionary(file)
for d.Next() {
record := &TreasureClassRecord{
Name: d.String("Treasure Class"),
Group: d.Number("group"),
Level: d.Number("level"),
NumPicks: d.Number("Picks"),
FreqUnique: d.Number("Unique"),
FreqSet: d.Number("Set"),
FreqRare: d.Number("Rare"),
FreqMagic: d.Number("Magic"),
FreqNoDrop: d.Number("NoDrop"),
}
if record.Name == "" {
continue
}
for treasureIdx := 0; treasureIdx < maxTreasuresPerRecord; treasureIdx++ {
treasureColumnKey := fmt.Sprintf(treasureItemFmt, treasureIdx+1)
probColumnKey := fmt.Sprintf(treasureProbFmt, treasureIdx+1)
treasureName := d.String(treasureColumnKey)
if treasureName == "" {
continue
}
prob := d.Number(probColumnKey)
treasure := &Treasure{
Code: treasureName,
Probability: prob,
}
if record.Treasures == nil {
record.Treasures = []*Treasure{treasure}
} else {
record.Treasures = append(record.Treasures, treasure)
}
}
TreasureClass[record.Name] = record
}
if d.Err != nil {
panic(d.Err)
}
log.Printf("Loaded %d TreasureClass records", len(TreasureClass))
}