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