OpenDiablo2/d2core/d2records/object_details_loader.go

236 lines
6.0 KiB
Go

package d2records
import (
"log"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2txt"
)
//nolint:funlen // Makes no sense to split
func objectDetailsLoader(r *RecordManager, d *d2txt.DataDictionary) error {
records := make(ObjectDetails)
i := 0
for d.Next() {
record := &ObjectDetailsRecord{
Index: i,
Name: d.String("Name"),
Description: d.String("description - not loaded"),
id: d.Number("Id"),
token: d.String("Token"),
SpawnMax: d.Number("SpawnMax"),
Selectable: [8]bool{
d.Number("Selectable0") == 1,
d.Number("Selectable1") == 1,
d.Number("Selectable2") == 1,
d.Number("Selectable3") == 1,
d.Number("Selectable4") == 1,
d.Number("Selectable5") == 1,
d.Number("Selectable6") == 1,
d.Number("Selectable7") == 1,
},
TrapProbability: d.Number("TrapProb"),
SizeX: d.Number("SizeX"),
SizeY: d.Number("SizeY"),
NTgtFX: d.Number("nTgtFX"),
NTgtFY: d.Number("nTgtFY"),
NTgtBX: d.Number("nTgtBX"),
NTgtBY: d.Number("nTgtBY"),
FrameCount: [8]int{
d.Number("FrameCnt0"),
d.Number("FrameCnt1"),
d.Number("FrameCnt2"),
d.Number("FrameCnt3"),
d.Number("FrameCnt4"),
d.Number("FrameCnt5"),
d.Number("FrameCnt6"),
d.Number("FrameCnt7"),
},
FrameDelta: [8]int{
d.Number("FrameDelta0"),
d.Number("FrameDelta1"),
d.Number("FrameDelta2"),
d.Number("FrameDelta3"),
d.Number("FrameDelta4"),
d.Number("FrameDelta5"),
d.Number("FrameDelta6"),
d.Number("FrameDelta7"),
},
CycleAnimation: [8]bool{
d.Number("CycleAnim0") == 1,
d.Number("CycleAnim1") == 1,
d.Number("CycleAnim2") == 1,
d.Number("CycleAnim3") == 1,
d.Number("CycleAnim4") == 1,
d.Number("CycleAnim5") == 1,
d.Number("CycleAnim6") == 1,
d.Number("CycleAnim7") == 1,
},
LightDiameter: [8]int{
d.Number("Lit0"),
d.Number("Lit1"),
d.Number("Lit2"),
d.Number("Lit3"),
d.Number("Lit4"),
d.Number("Lit5"),
d.Number("Lit6"),
d.Number("Lit7"),
},
BlocksLight: [8]bool{
d.Number("BlocksLight0") == 1,
d.Number("BlocksLight1") == 1,
d.Number("BlocksLight2") == 1,
d.Number("BlocksLight3") == 1,
d.Number("BlocksLight4") == 1,
d.Number("BlocksLight5") == 1,
d.Number("BlocksLight6") == 1,
d.Number("BlocksLight7") == 1,
},
HasCollision: [8]bool{
d.Number("HasCollision0") == 1,
d.Number("HasCollision1") == 1,
d.Number("HasCollision2") == 1,
d.Number("HasCollision3") == 1,
d.Number("HasCollision4") == 1,
d.Number("HasCollision5") == 1,
d.Number("HasCollision6") == 1,
d.Number("HasCollision7") == 1,
},
IsAttackable: d.Number("IsAttackable0") == 1,
StartFrame: [8]int{
d.Number("Start0"),
d.Number("Start1"),
d.Number("Start2"),
d.Number("Start3"),
d.Number("Start4"),
d.Number("Start5"),
d.Number("Start6"),
d.Number("Start7"),
},
EnvEffect: d.Number("EnvEffect") == 1,
IsDoor: d.Number("IsDoor") == 1,
BlockVisibility: d.Number("BlocksVis") == 1,
Orientation: d.Number("Orientation"),
Trans: d.Number("Trans"),
OrderFlag: [8]int{
d.Number("OrderFlag0"),
d.Number("OrderFlag1"),
d.Number("OrderFlag2"),
d.Number("OrderFlag3"),
d.Number("OrderFlag4"),
d.Number("OrderFlag5"),
d.Number("OrderFlag6"),
d.Number("OrderFlag7"),
},
PreOperate: d.Number("PreOperate") == 1,
HasAnimationMode: [8]bool{
d.Number("Mode0") == 1,
d.Number("Mode1") == 1,
d.Number("Mode2") == 1,
d.Number("Mode3") == 1,
d.Number("Mode4") == 1,
d.Number("Mode5") == 1,
d.Number("Mode6") == 1,
d.Number("Mode7") == 1,
},
XOffset: d.Number("Yoffset"),
YOffset: d.Number("Xoffset"),
Draw: d.Number("Draw") == 1,
LightRed: uint8(d.Number("Red")),
LightGreen: uint8(d.Number("Green")),
LightBlue: uint8(d.Number("Blue")),
SelHD: d.Number("HD") == 1,
SelTR: d.Number("TR") == 1,
SelLG: d.Number("LG") == 1,
SelRA: d.Number("RA") == 1,
SelLA: d.Number("LA") == 1,
SelRH: d.Number("RH") == 1,
SelLH: d.Number("LH") == 1,
SelSH: d.Number("SH") == 1,
SelS: [8]bool{
d.Number("S1") == 1,
d.Number("S2") == 1,
d.Number("S3") == 1,
d.Number("S4") == 1,
d.Number("S5") == 1,
d.Number("S6") == 1,
d.Number("S7") == 1,
d.Number("S8") == 1,
},
TotalPieces: d.Number("TotalPieces"),
SubClass: d.Number("SubClass"),
XSpace: d.Number("Xspace"),
YSpace: d.Number("Yspace"),
NameOffset: d.Number("NameOffset"),
MonsterOk: uint8(d.Number("MonsterOK")) == 1,
OperateRange: d.Number("OperateRange"),
ShrineFunction: d.Number("ShrineFunction"),
Restore: uint8(d.Number("Restore")) == 1,
Parm: [8]int{
d.Number("Parm0"),
d.Number("Parm1"),
d.Number("Parm2"),
d.Number("Parm3"),
d.Number("Parm4"),
d.Number("Parm5"),
d.Number("Parm6"),
d.Number("Parm7"),
},
Act: d.Number("Act"),
Lockable: uint8(d.Number("Lockable")) == 1,
Gore: uint8(d.Number("Gore")) == 1,
Sync: uint8(d.Number("Sync")) == 1,
Flicker: uint8(d.Number("Flicker")) == 1,
Damage: d.Number("Damage"),
Beta: uint8(d.Number("Beta")) == 1,
Overlay: uint8(d.Number("Overlay")) == 1,
CollisionSubst: uint8(d.Number("CollisionSubst")) == 1,
Left: d.Number("Left"),
Top: d.Number("Top"),
Width: d.Number("Width"),
Height: d.Number("Height"),
OperateFn: d.Number("OperateFn"),
PopulateFn: d.Number("PopulateFn"),
InitFn: d.Number("InitFn"),
ClientFn: d.Number("ClientFn"),
RestoreVirgins: uint8(d.Number("RestoreVirgins")) == 1,
BlockMissile: uint8(d.Number("BlockMissile")) == 1,
DrawUnder: uint8(d.Number("DrawUnder")) == 1,
OpenWarp: uint8(d.Number("OpenWarp")) == 1,
AutoMap: d.Number("AutoMap"),
}
records[i] = record
i++
}
if d.Err != nil {
return d.Err
}
log.Printf("Loaded %d objects", len(records))
r.Object.Details = records
return nil
}