Add data structures, it requires tons of refactor but it's more or less working
This commit is contained in:
115
pkg/data/npc.go
Normal file
115
pkg/data/npc.go
Normal file
@@ -0,0 +1,115 @@
|
||||
package game
|
||||
|
||||
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.Stat]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
|
||||
}
|
||||
Reference in New Issue
Block a user