Files
d2go/pkg/data/items.go
Arto Simonyan 09dfe3c65d Add more item flags (#69)
* Add more item flags

- Add more item flags
- Modify some of the stat strings

* fix ethereal

* Rename flag
2025-02-09 01:08:58 +02:00

141 lines
2.8 KiB
Go

package data
import (
"strings"
"github.com/hectorgimenez/d2go/pkg/data/item"
"github.com/hectorgimenez/d2go/pkg/data/stat"
)
type Inventory struct {
Belt Belt
AllItems []Item
Gold int
StashedGold [4]int
}
func (i Inventory) Find(name item.Name, locations ...item.LocationType) (Item, bool) {
for _, it := range i.AllItems {
if strings.EqualFold(string(it.Name), string(name)) {
// If no locations are specified, return the first item found
if len(locations) == 0 {
return it, true
}
for _, l := range locations {
if it.Location.LocationType == l {
return it, true
}
}
}
}
return Item{}, false
}
func (i Inventory) FindByID(unitID UnitID) (Item, bool) {
for _, it := range i.AllItems {
if it.UnitID == unitID {
return it, true
}
}
return Item{}, false
}
func (i Inventory) ByLocation(locations ...item.LocationType) []Item {
var items []Item
for _, it := range i.AllItems {
for _, l := range locations {
if it.Location.LocationType == l {
items = append(items, it)
}
}
}
return items
}
func (i Inventory) Matrix() [4][10]bool {
invMatrix := [4][10]bool{} // false = empty, true = occupied
for _, itm := range i.ByLocation(item.LocationInventory) {
for k := range itm.Desc().InventoryWidth {
for j := range itm.Desc().InventoryHeight {
invMatrix[itm.Position.Y+j][itm.Position.X+k] = true
}
}
}
return invMatrix
}
type UnitID int
type Item struct {
ID int
UnitID
Name item.Name
Quality item.Quality
Position Position
Location item.Location
Ethereal bool
IsHovered bool
BaseStats stat.Stats
Stats stat.Stats
Identified bool
IsRuneword bool
IsNamed bool
IsStartItem bool
IsEar bool
IsBroken bool
IsEquipped bool
HasSockets bool
InTradeOrStoreScreen bool
IsInSocket bool
}
type Drop struct {
Item Item
Rule string
RuleFile string
DropLocation string
}
func (i Item) Desc() item.Description {
return item.Desc[i.ID]
}
func (i Item) Type() item.Type {
return i.Desc().GetType()
}
func (i Item) IsPotion() bool {
return i.IsHealingPotion() || i.IsManaPotion() || i.IsRejuvPotion()
}
func (i Item) IsHealingPotion() bool {
return i.Type().IsType(item.TypeHealingPotion)
}
func (i Item) IsManaPotion() bool {
return i.Type().IsType(item.TypeManaPotion)
}
func (i Item) IsRejuvPotion() bool {
return i.Type().IsType(item.TypeRejuvPotion)
}
func (i Item) IsFromQuest() bool {
return i.Type().IsType(item.TypeQuest)
}
func (i Item) FindStat(id stat.ID, layer int) (stat.Data, bool) {
st, found := i.Stats.FindStat(id, layer)
if found {
return st, true
}
return i.BaseStats.FindStat(id, layer)
}