diff --git a/d2common/d2data/d2datadict/experience.go b/d2common/d2data/d2datadict/experience.go new file mode 100644 index 00000000..85d13946 --- /dev/null +++ b/d2common/d2data/d2datadict/experience.go @@ -0,0 +1,112 @@ +package d2datadict + +import ( + "log" + + "github.com/OpenDiablo2/OpenDiablo2/d2common" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" +) + +/* first column of experience.txt + Level + Amazon + Sorceress + Necromancer + Paladin + Barbarian + Druid + Assassin + ExpRatio + + second row is special case, shows max levels + + MaxLvl + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 10 +*/ + +type ExperienceBreakpointsRecord struct { + Level int + HeroBreakpoints map[d2enum.Hero]int + Ratio int +} + +var experienceStringMap map[string]d2enum.Hero +var experienceHeroMap map[d2enum.Hero]string + +var ExperienceBreakpoints []*ExperienceBreakpointsRecord +var maxLevels map[d2enum.Hero]int + +func GetMaxLevelByHero(heroType d2enum.Hero) int { + return maxLevels[heroType] +} + +func GetExperienceBreakpoint(heroType d2enum.Hero, level int) int { + return ExperienceBreakpoints[level].HeroBreakpoints[heroType] +} + +func LoadExperienceBreakpoints(file []byte) { + d := d2common.LoadDataDictionary(string(file)) + + experienceStringMap = map[string]d2enum.Hero{ + "Amazon": d2enum.HeroAmazon, + "Barbarian": d2enum.HeroBarbarian, + "Druid": d2enum.HeroDruid, + "Assassin": d2enum.HeroAssassin, + "Necromancer": d2enum.HeroNecromancer, + "Paladin": d2enum.HeroPaladin, + "Sorceress": d2enum.HeroSorceress, + } + + experienceHeroMap = map[d2enum.Hero]string{ + d2enum.HeroAmazon: "Amazon", + d2enum.HeroBarbarian: "Barbarian", + d2enum.HeroDruid: "Druid", + d2enum.HeroAssassin: "Assassin", + d2enum.HeroNecromancer: "Necromancer", + d2enum.HeroPaladin: "Paladin", + d2enum.HeroSorceress: "Sorceress", + } + + // we skip the second row because that describes max level of char classes + ExperienceBreakpoints = make([]*ExperienceBreakpointsRecord, len(d.Data)-1) + + for idx, _ := range d.Data { + if idx == 0 { + // max levels are a special case + maxLevels = map[d2enum.Hero]int{ + d2enum.HeroAmazon: d.GetNumber("Amazon", idx), + d2enum.HeroBarbarian: d.GetNumber("Barbarian", idx), + d2enum.HeroDruid: d.GetNumber("Druid", idx), + d2enum.HeroAssassin: d.GetNumber("Assassin", idx), + d2enum.HeroNecromancer: d.GetNumber("Necromancer", idx), + d2enum.HeroPaladin: d.GetNumber("Paladin", idx), + d2enum.HeroSorceress: d.GetNumber("Sorceress", idx), + } + continue + } + + record := &ExperienceBreakpointsRecord{ + Level: d.GetNumber("Level", idx), + HeroBreakpoints: map[d2enum.Hero]int{ + d2enum.HeroAmazon: d.GetNumber("Amazon", idx), + d2enum.HeroBarbarian: d.GetNumber("Barbarian", idx), + d2enum.HeroDruid: d.GetNumber("Druid", idx), + d2enum.HeroAssassin: d.GetNumber("Assassin", idx), + d2enum.HeroNecromancer: d.GetNumber("Necromancer", idx), + d2enum.HeroPaladin: d.GetNumber("Paladin", idx), + d2enum.HeroSorceress: d.GetNumber("Sorceress", idx), + }, + Ratio: d.GetNumber("ExpRatio", idx), + } + + ExperienceBreakpoints[record.Level] = record + } + log.Printf("Loaded %d ExperienceBreakpoint records", len(ExperienceBreakpoints)) +} diff --git a/main.go b/main.go index ecb59aa3..b89c939f 100644 --- a/main.go +++ b/main.go @@ -398,6 +398,7 @@ func loadDataDict() error { {d2resource.ItemStatCost, d2datadict.LoadItemStatCosts}, {d2resource.CharStats, d2datadict.LoadCharStats}, {d2resource.MonStats, d2datadict.LoadMonStats}, + {d2resource.Experience, d2datadict.LoadExperienceBreakpoints}, } for _, entry := range entries {