diff --git a/d2common/d2data/d2datadict/monpreset.go b/d2common/d2data/d2datadict/monpreset.go new file mode 100644 index 00000000..baf558f3 --- /dev/null +++ b/d2common/d2data/d2datadict/monpreset.go @@ -0,0 +1,28 @@ +package d2datadict + +import ( + "log" + + "github.com/OpenDiablo2/OpenDiablo2/d2common" +) + +type MonPresetRecord struct { + Act int + Place string +} + +var MonPresets []MonPresetRecord + +func LoadMonPresets(file []byte) { + dict := d2common.LoadDataDictionary(string(file)) + numRecords := len(dict.Data) + MonPresets = make([]MonPresetRecord, numRecords) + for idx := range dict.Data { + record := MonPresetRecord{ + Act: dict.GetNumber("Act", idx), + Place: dict.GetString("Place", idx), + } + MonPresets[idx] = record + } + log.Printf("Loaded %d MonPreset records", len(MonPresets)) +} diff --git a/d2common/d2data/d2datadict/object_query.go b/d2common/d2data/d2datadict/object_query.go index 05f30038..eba7e303 100644 --- a/d2common/d2data/d2datadict/object_query.go +++ b/d2common/d2data/d2datadict/object_query.go @@ -15,6 +15,7 @@ type ObjectLookupRecord struct { Act int Type ObjectType Id int + Name string Description string ObjectsTxtId int MonstatsTxtId int diff --git a/d2common/d2fileformats/d2ds1/ds1.go b/d2common/d2fileformats/d2ds1/ds1.go index fcc8f9ac..26447116 100644 --- a/d2common/d2fileformats/d2ds1/ds1.go +++ b/d2common/d2fileformats/d2ds1/ds1.go @@ -122,6 +122,10 @@ func (ds1 *DS1) loadObjects(br *d2common.StreamReader) { newObject.Flags = int(br.GetInt32()) newObject.Lookup = d2datadict.LookupObject(int(ds1.Act), newObject.Type, newObject.Id) + if newObject.Lookup != nil && newObject.Type == 1 { + newObject.Lookup.Name = d2datadict.MonPresets[newObject.Id].Place + } + if newObject.Lookup != nil && newObject.Lookup.ObjectsTxtId != -1 { newObject.ObjectInfo = d2datadict.Objects[newObject.Lookup.ObjectsTxtId] } diff --git a/d2common/d2resource/resource_paths.go b/d2common/d2resource/resource_paths.go index 848903be..0311e792 100644 --- a/d2common/d2resource/resource_paths.go +++ b/d2common/d2resource/resource_paths.go @@ -279,6 +279,7 @@ const ( // --- Enemy Data --- MonStats = "/data/global/excel/monstats.txt" + MonPreset = "/data/global/excel/monpreset.txt" SuperUniques = "/data/global/excel/SuperUniques.txt" // --- Skill Data --- diff --git a/d2core/d2map/d2mapentity/npc.go b/d2core/d2map/d2mapentity/npc.go index 04af91aa..df60aa70 100644 --- a/d2core/d2map/d2mapentity/npc.go +++ b/d2core/d2map/d2mapentity/npc.go @@ -13,16 +13,17 @@ import ( type NPC struct { mapEntity - composite *d2asset.Composite - action int - HasPaths bool - Paths []d2common.Path - path int - isDone bool - repetitions int - direction int - objectLookup *d2datadict.ObjectLookupRecord - name string + composite *d2asset.Composite + action int + HasPaths bool + Paths []d2common.Path + path int + isDone bool + repetitions int + direction int + objectLookup *d2datadict.ObjectLookupRecord + monstatRecord *d2datadict.MonStatsRecord + name string } func CreateNPC(x, y int, object *d2datadict.ObjectLookupRecord, direction int) *NPC { @@ -39,25 +40,10 @@ func CreateNPC(x, y int, object *d2datadict.ObjectLookupRecord, direction int) * } result.SetMode(object.Mode, object.Class, direction) result.mapEntity.directioner = result.rotate + result.monstatRecord = d2datadict.MonStats[object.Name] - switch object.Act { - case 1: - switch object.Id { - case 0: - result.name = "Gheed" - case 1: - result.name = "Cain" - case 2: - result.name = "Akara" - case 5: - result.name = "Kashya" - case 7: - result.name = "Warriv" - case 8: - result.name = "Charsi" - case 9: - result.name = "Andariel" - } + if result.monstatRecord != nil && result.monstatRecord.IsInteractable { + result.name = d2common.TranslateString(result.monstatRecord.NameStringTableKey) } return result diff --git a/d2core/d2map/d2mapentity/object.go b/d2core/d2map/d2mapentity/object.go index 4b298477..c8d5faad 100644 --- a/d2core/d2map/d2mapentity/object.go +++ b/d2core/d2map/d2mapentity/object.go @@ -1,10 +1,13 @@ package d2mapentity import ( + "github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" + "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" ) // Object represents a composite of animations that can be projected onto the map. @@ -13,6 +16,7 @@ type Object struct { composite *d2asset.Composite direction int highlight bool + nameLabel d2ui.Label objectRecord *d2datadict.ObjectRecord objectLookup *d2datadict.ObjectLookupRecord } @@ -28,6 +32,7 @@ func CreateObject(x, y int, object *d2datadict.ObjectLookupRecord, palettePath s mapEntity: createMapEntity(x, y), composite: composite, objectLookup: object, + nameLabel: d2ui.CreateLabel(d2resource.FontFormal11, d2resource.PaletteStatic), } entity.mapEntity.directioner = entity.rotate entity.objectRecord = d2datadict.Objects[object.ObjectsTxtId] @@ -75,6 +80,9 @@ func (ob *Object) Render(target d2render.Surface) { ob.offsetY+int(((ob.subcellX+ob.subcellY)*8)-5), ) if ob.highlight { + ob.nameLabel.SetText(d2common.TranslateString(ob.objectRecord.Name)) + ob.nameLabel.SetPosition(-50, -50) + ob.nameLabel.Render(target) target.PushBrightness(2) defer target.Pop() } diff --git a/main.go b/main.go index fe350270..1dfd7070 100644 --- a/main.go +++ b/main.go @@ -427,11 +427,11 @@ func loadDataDict() error { {d2resource.SoundSettings, d2datadict.LoadSounds}, {d2resource.AnimationData, d2data.LoadAnimationData}, {d2resource.MonStats, d2datadict.LoadMonStats}, + {d2resource.MonPreset, d2datadict.LoadMonPresets}, {d2resource.MagicPrefix, d2datadict.LoadMagicPrefix}, {d2resource.MagicSuffix, d2datadict.LoadMagicSuffix}, {d2resource.ItemStatCost, d2datadict.LoadItemStatCosts}, {d2resource.CharStats, d2datadict.LoadCharStats}, - {d2resource.MonStats, d2datadict.LoadMonStats}, {d2resource.Hireling, d2datadict.LoadHireling}, {d2resource.Experience, d2datadict.LoadExperienceBreakpoints}, {d2resource.Gems, d2datadict.LoadGems},