OpenDiablo2/d2common/d2data/d2datadict/monster_equipment.go

93 lines
2.2 KiB
Go

package d2datadict
import (
"fmt"
"log"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2txt"
)
const (
numMonEquippedItems = 3
fmtLocation = "loc%d"
fmtQuality = "mod%d"
fmtCode = "item%d"
)
// MonsterEquipmentRecord represents a single line in monequip.txt
// Information gathered from [https://d2mods.info/forum/kb/viewarticle?a=365]
type MonsterEquipmentRecord struct {
// Name of monster, pointer to MonStats.txt
Name string
// If true, monster is created by level, otherwise created by skill
OnInit bool
// Not written in description, only appear on monsters with OnInit false,
// Level of skill for which this equipment row can be used?
Level int
Equipment []*monEquip
}
type monEquip struct {
// Code of item, probably from ItemCommonRecords
Code string
// Location the body location of the item
Location string
// Quality of the item
Quality int
}
// MonsterEquipment stores the MonsterEquipmentRecords
var MonsterEquipment map[string][]*MonsterEquipmentRecord //nolint:gochecknoglobals // Currently global by design
// LoadMonsterEquipment loads MonsterEquipmentRecords into MonsterEquipment
func LoadMonsterEquipment(file []byte) {
MonsterEquipment = make(map[string][]*MonsterEquipmentRecord)
d := d2txt.LoadDataDictionary(file)
for d.Next() {
record := &MonsterEquipmentRecord{
Name: d.String("monster"),
OnInit: d.Bool("oninit"),
Level: d.Number("level"),
Equipment: make([]*monEquip, 0),
}
for idx := 0; idx < numMonEquippedItems; idx++ {
num := idx + 1
code := d.String(fmt.Sprintf(fmtCode, num))
location := d.String(fmt.Sprintf(fmtLocation, num))
quality := d.Number(fmt.Sprintf(fmtQuality, num))
if code == "" {
continue
}
equip := &monEquip{code, location, quality}
record.Equipment = append(record.Equipment, equip)
}
if _, ok := MonsterEquipment[record.Name]; !ok {
MonsterEquipment[record.Name] = make([]*MonsterEquipmentRecord, 0)
}
MonsterEquipment[record.Name] = append(MonsterEquipment[record.Name], record)
}
if d.Err != nil {
panic(d.Err)
}
length := 0
for k := range MonsterEquipment {
length += len(MonsterEquipment[k])
}
log.Printf("Loaded %d MonsterEquipment records", length)
}