OpenDiablo2/d2common/d2data/d2datadict/monster_level.go

109 lines
2.8 KiB
Go
Raw Normal View History

2020-07-31 19:00:09 +00:00
package d2datadict
import (
"log"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2txt"
2020-07-31 19:00:09 +00:00
)
// MonsterLevelRecord represents a single row in monlvl.txt
2020-07-31 19:00:09 +00:00
type MonsterLevelRecord struct {
// The level
2020-07-31 19:00:09 +00:00
Level int
// Values for Battle.net
BattleNet monsterDifficultyLevels
2020-07-31 19:00:09 +00:00
// Values for ladder/single player/lan
Ladder monsterDifficultyLevels
}
type monsterDifficultyLevels struct {
Normal monsterLevelValues
Nightmare monsterLevelValues
Hell monsterLevelValues
2020-07-31 19:00:09 +00:00
}
type monsterLevelValues struct {
// DefenseRating AC is calcuated as (MonLvl.txt Ac * Monstats.txt AC) / 100)
DefenseRating int // also known as armor class
2020-07-31 19:00:09 +00:00
// ToHit influences ToHit values for both attacks
2020-07-31 19:00:09 +00:00
// (MonLvl.txt TH * Monstats.txt A1TH
// and MonLvl.txt TH * Monstats.txt A2TH) / 100
AttackRating int
2020-07-31 19:00:09 +00:00
// Hitpoints, influences both minimum and maximum HP
// (MonLvl.txt HP * Monstats.txt minHP) / 100
2020-07-31 19:00:09 +00:00
// and MonLvl.txt HP * Monstats.txt maxHP) / 100
Hitpoints int
2020-07-31 19:00:09 +00:00
// Damage, influences minimum and maximum damage for both attacks
// MonLvl.txt DM * Monstats.txt A1MinD) / 100
2020-07-31 19:00:09 +00:00
// and MonLvl.txt DM * Monstats.txt A1MaxD) / 100
// and MonLvl.txt DM * Monstats.txt A2MinD) / 100
// and MonLvl.txt DM * Monstats.txt A2MaxD) / 100
Damage int
// Experience points,
// the formula is (MonLvl.txt XP * Monstats.txt Exp) / 100
Experience int
2020-07-31 19:00:09 +00:00
}
// MonsterLevels stores the MonsterLevelRecords
var MonsterLevels map[int]*MonsterLevelRecord //nolint:gochecknoglobals // Currently global by design
2020-07-31 19:00:09 +00:00
// LoadMonsterLevels loads LoadMonsterLevelRecords into MonsterLevels
2020-07-31 19:00:09 +00:00
func LoadMonsterLevels(file []byte) {
MonsterLevels = make(map[int]*MonsterLevelRecord)
d := d2txt.LoadDataDictionary(file)
2020-07-31 19:00:09 +00:00
for d.Next() {
record := &MonsterLevelRecord{
Level: d.Number("Level"),
BattleNet: monsterDifficultyLevels{
Normal: monsterLevelValues{
Hitpoints: d.Number("HP"),
Damage: d.Number("DM"),
Experience: d.Number("XP"),
},
Nightmare: monsterLevelValues{
Hitpoints: d.Number("HP(N)"),
Damage: d.Number("DM(N)"),
Experience: d.Number("XP(N)"),
},
Hell: monsterLevelValues{
Hitpoints: d.Number("HP(H)"),
Damage: d.Number("DM(H)"),
Experience: d.Number("XP(H)"),
},
2020-07-31 19:00:09 +00:00
},
Ladder: monsterDifficultyLevels{
Normal: monsterLevelValues{
Hitpoints: d.Number("L-HP"),
Damage: d.Number("L-DM"),
Experience: d.Number("L-XP"),
},
Nightmare: monsterLevelValues{
Hitpoints: d.Number("L-HP(N)"),
Damage: d.Number("L-DM(N)"),
Experience: d.Number("L-XP(N)"),
},
Hell: monsterLevelValues{
Hitpoints: d.Number("L-HP(H)"),
Damage: d.Number("L-DM(H)"),
Experience: d.Number("L-XP(H)"),
},
2020-07-31 19:00:09 +00:00
},
}
MonsterLevels[record.Level] = record
}
if d.Err != nil {
panic(d.Err)
}
log.Printf("Loaded %d MonsterLevel records", len(MonsterLevels))
}