mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2025-02-06 08:37:15 -05:00
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:
parent
f06d4b2c68
commit
be498ee869
190
d2common/d2data/d2datadict/charstats.go
Normal file
190
d2common/d2data/d2datadict/charstats.go
Normal 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))
|
||||
}
|
1
main.go
1
main.go
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user