Feature d2datadict charstats (#339)

* main, d2common: load Magic/Rare/Unique Affix
* d2common: item affixes only
removed Rare/Unique Prefix/Suffix as those are related to monsters, not items.
* removed debug print from item_affix.go
* changed item affix type names for clarity, removed debug print from data_dictionary
* d2common: item affix datadict and records
Item Affixes are defined in `/data/global/excel/Magic{Prefix,Suffix}.txt`
Rare and Unique Pre/Suffixes seem to be for monsters, not items.
d2common: item affixes only
removed Rare/Unique Prefix/Suffix as those are related to monsters, not items.
removed debug print from item_affix.go
changed item affix type names for clarity, removed debug print from data_dictionary
* reverting to pre-allocating memory for parsing txt lines
* removing the rest of the rare/unique definitions
* removing the rest of the rare/unique definitions
* adding charstats datadict loader
This commit is contained in:
dk 2020-06-18 19:42:38 -07:00 committed by GitHub
parent f06d4b2c68
commit be498ee869
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 191 additions and 0 deletions

View File

@ -0,0 +1,190 @@
package d2datadict
import (
"log"
"github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
)
type CharStatsRecord struct {
Class d2enum.Hero
// the initial stats at character level 1
InitStr int
InitDex int
InitVit int
InitEne int
InitStamina int
ManaRegen int // number of seconds to regen mana completely
ToHitFactor int // added to basic AR of character class
VelocityWalk int
VelocityRun int
StaminaRunDrain int // rate of stamina loss, lower is longer drain time
// NOTE: Each point of Life/Mana/Stamina is divided by 256 for precision.
LifePerLevel int // value is in fourths, lowest possible is 64/256
ManaPerLevel int
StaminaPerLevel int
LifePerVit int // life per point of vitality
ManaPerEne int // mana per point of energy
StaminaPerVit int
StatPerLevel int // stat points per level
BlockFactor int // added to base shield block% in armor.txt (display & calc)
// appears on starting weapon
StartSkillBonus string
// The skills the character class starts with (always available)
BaseSkill [10]string
// string for bonus to class skills (ex: +1 to all Amazon skills).
SkillStrAll string
SkillStrTab [3]string // string for bonus per skill tabs
SkillStrClassOnly string // string for class-exclusive skills
BaseWeaponClass d2enum.WeaponClass // controls animation when unarmed
StartItem [10]string
StartItemLocation [10]string
StartItemCount [10]int
}
var CharStats map[d2enum.Hero]*CharStatsRecord
var charStringMap map[string]d2enum.Hero
var weaponTokenMap map[string]d2enum.WeaponClass
func LoadCharStats(file []byte) {
charStringMap = 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,
}
weaponTokenMap = map[string]d2enum.WeaponClass{
"": d2enum.WeaponClassNone,
"hth": d2enum.WeaponClassHandToHand,
"bow": d2enum.WeaponClassBow,
"1hs": d2enum.WeaponClassOneHandSwing,
"1ht": d2enum.WeaponClassOneHandThrust,
"stf": d2enum.WeaponClassStaff,
"2hs": d2enum.WeaponClassTwoHandSwing,
"2ht": d2enum.WeaponClassTwoHandThrust,
"xbw": d2enum.WeaponClassCrossbow,
"1js": d2enum.WeaponClassLeftJabRightSwing,
"1jt": d2enum.WeaponClassLeftJabRightThrust,
"1ss": d2enum.WeaponClassLeftSwingRightSwing,
"1st": d2enum.WeaponClassLeftSwingRightThrust,
"ht1": d2enum.WeaponClassOneHandToHand,
"ht2": d2enum.WeaponClassTwoHandToHand,
}
d := d2common.LoadDataDictionary(string(file))
CharStats = make(map[d2enum.Hero]*CharStatsRecord, len(d.Data))
for idx, _ := range d.Data {
record := &CharStatsRecord{
Class: charStringMap[d.GetString("class", idx)],
InitStr: d.GetNumber("str", idx),
InitDex: d.GetNumber("dex", idx),
InitVit: d.GetNumber("int", idx),
InitEne: d.GetNumber("vit", idx),
InitStamina: d.GetNumber("stamina", idx),
ManaRegen: d.GetNumber("ManaRegen", idx),
ToHitFactor: d.GetNumber("ToHitFactor", idx),
VelocityWalk: d.GetNumber("WalkVelocity", idx),
VelocityRun: d.GetNumber("RunVelocity", idx),
StaminaRunDrain: d.GetNumber("RunDrain", idx),
LifePerLevel: d.GetNumber("LifePerLevel", idx),
ManaPerLevel: d.GetNumber("ManaPerLevel", idx),
StaminaPerLevel: d.GetNumber("StaminaPerLevel", idx),
LifePerVit: d.GetNumber("LifePerVitality", idx),
ManaPerEne: d.GetNumber("ManaPerMagic", idx),
StaminaPerVit: d.GetNumber("StaminaPerVitality", idx),
StatPerLevel: d.GetNumber("StatPerLevel", idx),
BlockFactor: d.GetNumber("BlockFactor", idx),
StartSkillBonus: d.GetString("StartSkill", idx),
SkillStrAll: d.GetString("StrAllSkills", idx),
SkillStrClassOnly: d.GetString("StrClassOnly", idx),
BaseSkill: [10]string{
d.GetString("Skill 1", idx),
d.GetString("Skill 2", idx),
d.GetString("Skill 3", idx),
d.GetString("Skill 4", idx),
d.GetString("Skill 5", idx),
d.GetString("Skill 6", idx),
d.GetString("Skill 7", idx),
d.GetString("Skill 8", idx),
d.GetString("Skill 9", idx),
d.GetString("Skill 10", idx),
},
SkillStrTab: [3]string{
d.GetString("StrSkillTab1", idx),
d.GetString("StrSkillTab2", idx),
d.GetString("StrSkillTab3", idx),
},
BaseWeaponClass: weaponTokenMap[d.GetString("baseWClass", idx)],
StartItem: [10]string{
d.GetString("item1", idx),
d.GetString("item2", idx),
d.GetString("item3", idx),
d.GetString("item4", idx),
d.GetString("item5", idx),
d.GetString("item6", idx),
d.GetString("item7", idx),
d.GetString("item8", idx),
d.GetString("item9", idx),
d.GetString("item10", idx),
},
StartItemLocation: [10]string{
d.GetString("item1loc", idx),
d.GetString("item2loc", idx),
d.GetString("item3loc", idx),
d.GetString("item4loc", idx),
d.GetString("item5loc", idx),
d.GetString("item6loc", idx),
d.GetString("item7loc", idx),
d.GetString("item8loc", idx),
d.GetString("item9loc", idx),
d.GetString("item10loc", idx),
},
StartItemCount: [10]int{
d.GetNumber("item1count", idx),
d.GetNumber("item2count", idx),
d.GetNumber("item3count", idx),
d.GetNumber("item4count", idx),
d.GetNumber("item5count", idx),
d.GetNumber("item6count", idx),
d.GetNumber("item7count", idx),
d.GetNumber("item8count", idx),
d.GetNumber("item9count", idx),
d.GetNumber("item10count", idx),
},
}
CharStats[record.Class] = record
}
log.Printf("Loaded %d CharStats records", len(CharStats))
}

View File

@ -396,6 +396,7 @@ func loadDataDict() error {
{d2resource.MagicPrefix, d2datadict.LoadMagicPrefix},
{d2resource.MagicSuffix, d2datadict.LoadMagicSuffix},
{d2resource.ItemStatCost, d2datadict.LoadItemStatCosts},
{d2resource.CharStats, d2datadict.LoadCharStats},
}
for _, entry := range entries {