mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-11-16 09:25:57 -05:00
186 lines
5.2 KiB
Go
186 lines
5.2 KiB
Go
package d2records
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2txt"
|
|
)
|
|
|
|
// LoadMonStats2 loads MonStat2Records from monstats2.txt
|
|
//nolint:funlen //just a big data loader
|
|
func monsterStats2Loader(r *RecordManager, d *d2txt.DataDictionary) error {
|
|
records := make(MonStats2)
|
|
|
|
for d.Next() {
|
|
resurrectMode, err := monsterAnimationModeFromString(d.String("ResurrectMode"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
record := &MonStat2Record{
|
|
Key: d.String("Id"),
|
|
Height: d.Number("Height"),
|
|
OverlayHeight: d.Number("OverlayHeight"),
|
|
PixelHeight: d.Number("pixHeight"),
|
|
SizeX: d.Number("SizeX"),
|
|
SizeY: d.Number("SizeY"),
|
|
SpawnMethod: d.Number("spawnCol"),
|
|
MeleeRng: d.Number("MeleeRng"),
|
|
BaseWeaponClass: d.String("BaseW"),
|
|
HitClass: d.Number("HitClass"),
|
|
EquipmentOptions: [16][]string{
|
|
d.List("HDv"),
|
|
d.List("TRv"),
|
|
d.List("LGv"),
|
|
d.List("Rav"),
|
|
d.List("Lav"),
|
|
d.List("RHv"),
|
|
d.List("LHv"),
|
|
d.List("SHv"),
|
|
d.List("S1v"),
|
|
d.List("S2v"),
|
|
d.List("S3v"),
|
|
d.List("S4v"),
|
|
d.List("S5v"),
|
|
d.List("S6v"),
|
|
d.List("S7v"),
|
|
d.List("S8v"),
|
|
},
|
|
HasComponent: [16]bool{
|
|
d.Bool("HD"),
|
|
d.Bool("TR"),
|
|
d.Bool("LG"),
|
|
d.Bool("RA"),
|
|
d.Bool("LA"),
|
|
d.Bool("RH"),
|
|
d.Bool("LH"),
|
|
d.Bool("SH"),
|
|
d.Bool("S1"),
|
|
d.Bool("S2"),
|
|
d.Bool("S3"),
|
|
d.Bool("S4"),
|
|
d.Bool("S5"),
|
|
d.Bool("S6"),
|
|
d.Bool("S7"),
|
|
d.Bool("S8"),
|
|
},
|
|
TotalPieces: d.Number("TotalPieces"),
|
|
HasAnimationMode: [16]bool{
|
|
d.Bool("mDT"),
|
|
d.Bool("mNU"),
|
|
d.Bool("mWL"),
|
|
d.Bool("mGH"),
|
|
d.Bool("mA1"),
|
|
d.Bool("mA2"),
|
|
d.Bool("mBL"),
|
|
d.Bool("mSC"),
|
|
d.Bool("mS1"),
|
|
d.Bool("mS2"),
|
|
d.Bool("mS3"),
|
|
d.Bool("mS4"),
|
|
d.Bool("mDD"),
|
|
d.Bool("mKB"),
|
|
d.Bool("mSQ"),
|
|
d.Bool("mRN"),
|
|
},
|
|
DirectionsPerMode: [16]int{
|
|
d.Number("dDT"),
|
|
d.Number("dNU"),
|
|
d.Number("dWL"),
|
|
d.Number("dGH"),
|
|
d.Number("dA1"),
|
|
d.Number("dA2"),
|
|
d.Number("dBL"),
|
|
d.Number("dSC"),
|
|
d.Number("dS1"),
|
|
d.Number("dS2"),
|
|
d.Number("dS3"),
|
|
d.Number("dS4"),
|
|
d.Number("dDD"),
|
|
d.Number("dKB"),
|
|
d.Number("dSQ"),
|
|
d.Number("dRN"),
|
|
},
|
|
A1mv: d.Bool("A1mv"),
|
|
A2mv: d.Bool("A2mv"),
|
|
SCmv: d.Bool("SCmv"),
|
|
S1mv: d.Bool("S1mv"),
|
|
S2mv: d.Bool("S2mv"),
|
|
S3mv: d.Bool("S3mv"),
|
|
S4mv: d.Bool("S4mv"),
|
|
NoGfxHitTest: d.Bool("noGfxHitTest"),
|
|
BoxTop: d.Number("htTop"),
|
|
BoxLeft: d.Number("htLeft"),
|
|
BoxWidth: d.Number("htWidth"),
|
|
BoxHeight: d.Number("htHeight"),
|
|
Restore: d.Number("restore"),
|
|
AutomapCel: d.Number("automapCel"),
|
|
NoMap: d.Bool("noMap"),
|
|
NoOvly: d.Bool("noOvly"),
|
|
IsSelectable: d.Bool("isSel"),
|
|
AllySelectable: d.Bool("alSel"),
|
|
shiftSel: d.Bool("shiftSel"),
|
|
NotSelectable: d.Bool("noSel"),
|
|
IsCorpseSelectable: d.Bool("corpseSel"),
|
|
IsAttackable: d.Bool("isAtt"),
|
|
IsRevivable: d.Bool("revive"),
|
|
IsCritter: d.Bool("critter"),
|
|
IsSmall: d.Bool("small"),
|
|
IsLarge: d.Bool("large"),
|
|
IsSoft: d.Bool("soft"),
|
|
IsInert: d.Bool("inert"),
|
|
objCol: d.Bool("objCol"),
|
|
IsCorpseCollidable: d.Bool("deadCol"),
|
|
IsCorpseWalkable: d.Bool("unflatDead"),
|
|
HasShadow: d.Bool("Shadow"),
|
|
NoUniqueShift: d.Bool("noUniqueShift"),
|
|
CompositeDeath: d.Bool("compositeDeath"),
|
|
LocalBlood: d.Number("localBlood"),
|
|
Bleed: d.Number("Bleed"),
|
|
Light: d.Number("Light"),
|
|
LightR: d.Number("light-r"),
|
|
LightG: d.Number("light-g"),
|
|
lightB: d.Number("light-b"),
|
|
NormalPalette: d.Number("Utrans"),
|
|
NightmarePalette: d.Number("Utrans(N)"),
|
|
HellPalatte: d.Number("Utrans(H)"),
|
|
Heart: d.String("Heart"),
|
|
BodyPart: d.String("BodyPart"),
|
|
InfernoLen: d.Number("InfernoLen"),
|
|
InfernoAnim: d.Number("InfernoAnim"),
|
|
InfernoRollback: d.Number("InfernoRollback"),
|
|
ResurrectMode: resurrectMode,
|
|
ResurrectSkill: d.String("ResurrectSkill"),
|
|
}
|
|
|
|
records[record.Key] = record
|
|
}
|
|
|
|
if d.Err != nil {
|
|
panic(d.Err)
|
|
}
|
|
|
|
r.Debugf("Loaded %d MonStat2 records", len(records))
|
|
|
|
r.Monster.Stats2 = records
|
|
|
|
return nil
|
|
}
|
|
|
|
//nolint:gochecknoglobals // better for lookup
|
|
var monsterAnimationModeLookup = map[string]d2enum.MonsterAnimationMode{
|
|
d2enum.MonsterAnimationModeNeutral.String(): d2enum.MonsterAnimationModeNeutral,
|
|
d2enum.MonsterAnimationModeSkill1.String(): d2enum.MonsterAnimationModeSkill1,
|
|
d2enum.MonsterAnimationModeSequence.String(): d2enum.MonsterAnimationModeSequence,
|
|
}
|
|
|
|
func monsterAnimationModeFromString(s string) (d2enum.MonsterAnimationMode, error) {
|
|
v, ok := monsterAnimationModeLookup[s]
|
|
if !ok {
|
|
return d2enum.MonsterAnimationModeNeutral, fmt.Errorf("unhandled MonsterAnimationMode %q", s)
|
|
}
|
|
|
|
return v, nil
|
|
}
|