Files
d2go/pkg/data/npc.go
2023-03-13 21:28:12 +09:00

116 lines
2.0 KiB
Go

package data
import (
"github.com/hectorgimenez/d2go/pkg/data/npc"
"github.com/hectorgimenez/d2go/pkg/data/stat"
)
type NPC struct {
ID npc.ID
Name string
Positions []Position
}
type MonsterType string
type Monster struct {
UnitID
Name npc.ID
IsHovered bool
Position Position
Stats map[stat.ID]int
Type MonsterType
}
type Monsters []Monster
type NPCs []NPC
func (n NPCs) FindOne(npcid npc.ID) (NPC, bool) {
for _, np := range n {
if np.ID == npcid {
return np, true
}
}
return NPC{}, false
}
func (m Monsters) FindOne(id npc.ID, t MonsterType) (Monster, bool) {
for _, monster := range m {
if monster.Name == id {
if t == MonsterTypeNone || t == monster.Type {
return monster, true
}
}
}
return Monster{}, false
}
func (m Monsters) Enemies(filters ...MonsterFilter) []Monster {
monsters := make([]Monster, 0)
for _, mo := range m {
if !mo.IsMerc() {
monsters = append(monsters, mo)
}
}
for _, f := range filters {
monsters = f(monsters)
}
return monsters
}
type MonsterFilter func(m Monsters) []Monster
func MonsterEliteFilter() MonsterFilter {
return func(m Monsters) []Monster {
var filteredMonsters []Monster
for _, mo := range m {
if mo.Type == MonsterTypeMinion || mo.Type == MonsterTypeUnique || mo.Type == MonsterTypeChampion || mo.Type == MonsterTypeSuperUnique {
filteredMonsters = append(filteredMonsters, mo)
}
}
return filteredMonsters
}
}
func MonsterAnyFilter() MonsterFilter {
return func(m Monsters) []Monster {
return m
}
}
func (m Monsters) FindByID(id UnitID) (Monster, bool) {
for _, monster := range m {
if monster.UnitID == id {
return monster, true
}
}
return Monster{}, false
}
func (m Monster) IsImmune(resist stat.Resist) bool {
for st, value := range m.Stats {
// We only want max resistance
if value < 100 {
continue
}
if resist == stat.ColdImmune && st == stat.ColdResist {
return true
}
}
return false
}
func (m Monster) IsMerc() bool {
if m.Name == npc.Guard {
return true
}
return false
}