OpenDiablo2/d2common/d2data/d2datadict/monster_unique_modifiers.go

120 lines
3.2 KiB
Go
Raw Normal View History

2020-07-31 01:49:29 +00:00
package d2datadict
import (
"log"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2txt"
2020-07-31 01:49:29 +00:00
)
const (
numModifierConstants = 34
)
// MonsterUniqueModifierRecord represents a single line in monumod.txt
// Information gathered from [https://d2mods.info/forum/kb/viewarticle?a=161]
2020-07-31 01:49:29 +00:00
type MonsterUniqueModifierRecord struct {
// Name of modifer, not used by other files
2020-07-31 01:49:29 +00:00
Name string
// ID of the modifier,
// the Mod fields of SuperUniqueRecord refer to these ID's
2020-07-31 01:49:29 +00:00
ID int
// Enabled boolean for whether this modifier can be applied
2020-07-31 01:49:29 +00:00
Enabled bool
// ExpansionOnly boolean for whether this modifier can only be applied in an expansion game.
// In the file, the value 100 represents expansion only
2020-07-31 01:49:29 +00:00
ExpansionOnly bool
// If true, "Minion" will be displayed below the life bar of minions of
// the monster with this modifier
2020-07-31 01:49:29 +00:00
Xfer bool
// Champion boolean, only usable by champion monsters
2020-07-31 01:49:29 +00:00
Champion bool
// FPick Unknown
2020-07-31 01:49:29 +00:00
FPick int
// Exclude1 monster type code that cannot have this modifier
2020-07-31 01:49:29 +00:00
Exclude1 string
// Exclude2 monster type code that cannot have this modifier
2020-07-31 01:49:29 +00:00
Exclude2 string
PickFrequencies struct {
Normal *pickFreq
Nightmare *pickFreq
Hell *pickFreq
}
}
2020-07-31 01:49:29 +00:00
type pickFreq struct {
// Champion pick frequency
Champion int
2020-07-31 01:49:29 +00:00
// Unique pick frequency
Unique int
2020-07-31 01:49:29 +00:00
}
// MonsterUniqueModifiers stores the MonsterUniqueModifierRecords
2020-07-31 01:49:29 +00:00
var MonsterUniqueModifiers map[string]*MonsterUniqueModifierRecord //nolint:gochecknoglobals // Currently global by design
// MonsterUniqueModifierConstants contains constants from monumod.txt,
// can be accessed with indices from d2enum.MonUModConstIndex
var MonsterUniqueModifierConstants []int //nolint:gochecknoglobals // currently global by design
// See [https://d2mods.info/forum/kb/viewarticle?a=161] for more info
2020-07-31 01:49:29 +00:00
// LoadMonsterUniqueModifiers loads MonsterUniqueModifierRecords into MonsterUniqueModifiers
2020-07-31 01:49:29 +00:00
func LoadMonsterUniqueModifiers(file []byte) {
MonsterUniqueModifiers = make(map[string]*MonsterUniqueModifierRecord)
MonsterUniqueModifierConstants = make([]int, 0, numModifierConstants)
2020-07-31 01:49:29 +00:00
d := d2txt.LoadDataDictionary(file)
2020-07-31 01:49:29 +00:00
for d.Next() {
record := &MonsterUniqueModifierRecord{
Name: d.String("uniquemod"),
ID: d.Number("id"),
Enabled: d.Bool("enabled"),
ExpansionOnly: d.Number("version") == expansionCode,
Xfer: d.Bool("xfer"),
Champion: d.Bool("champion"),
FPick: d.Number("fpick"),
Exclude1: d.String("exclude1"),
Exclude2: d.String("exclude2"),
PickFrequencies: struct {
Normal *pickFreq
Nightmare *pickFreq
Hell *pickFreq
}{
Normal: &pickFreq{
Champion: d.Number("cpick"),
Unique: d.Number("upick"),
},
Nightmare: &pickFreq{
Champion: d.Number("cpick (N)"),
Unique: d.Number("upick (N)"),
},
Hell: &pickFreq{
Champion: d.Number("cpick (H)"),
Unique: d.Number("upick (H)"),
},
},
2020-07-31 01:49:29 +00:00
}
2020-07-31 01:49:29 +00:00
MonsterUniqueModifiers[record.Name] = record
if len(MonsterUniqueModifierConstants) < numModifierConstants {
MonsterUniqueModifierConstants = append(MonsterUniqueModifierConstants, d.Number("constants"))
2020-07-31 01:49:29 +00:00
}
}
if d.Err != nil {
panic(d.Err)
}
log.Printf("Loaded %d MonsterUniqueModifier records", len(MonsterUniqueModifiers))
}