diff --git a/pkg/data/data.go b/pkg/data/data.go index fb7da09..ab1976d 100644 --- a/pkg/data/data.go +++ b/pkg/data/data.go @@ -100,6 +100,13 @@ func (r Room) IsInside(p Position) bool { return false } +func (d Data) MercHPPercent() int { + if d.Mercenary.Found { + return d.Mercenary.HPPercent + } + return 0 +} + type RosterMember struct { Name string Area area.ID diff --git a/pkg/data/items.go b/pkg/data/items.go index e596812..dd2dc50 100644 --- a/pkg/data/items.go +++ b/pkg/data/items.go @@ -13,17 +13,21 @@ type Inventory struct { Gold int StashedGold [6]int // [0]=personal, [1..5]=shared stash pages SharedStashPages int // Number of shared stash units detected (3=non-DLC, 5+=DLC) + PlayerID UnitID // Number of shared stash units detected (3=non-DLC, 5+=DLC) } -func isPlayerItem(owner UnitID, it Item) bool { - if it.Location.LocationType != item.LocationMercenary && (owner == it.Owner || it.Owner == 1) { +func isMatchOwner(owner UnitID, it Item) bool { + if it.Location.LocationType == item.LocationGround { + return true + } + if it.Location.LocationType != item.LocationMercenary && it.Owner == 1 { return true } - return false + return owner == it.Owner } -func (i Inventory) Find(owner UnitID, name item.Name, locations ...item.LocationType) (Item, bool) { +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 @@ -32,7 +36,7 @@ func (i Inventory) Find(owner UnitID, name item.Name, locations ...item.Location } for _, l := range locations { - if it.Location.LocationType == l || it.Owner == owner { + if it.Location.LocationType == l && isMatchOwner(i.PlayerID, it) { return it, true } } @@ -42,9 +46,9 @@ func (i Inventory) Find(owner UnitID, name item.Name, locations ...item.Location return Item{}, false } -func (i Inventory) FindByID(owner UnitID, unitID UnitID) (Item, bool) { +func (i Inventory) FindByID(unitID UnitID) (Item, bool) { for _, it := range i.AllItems { - if it.UnitID == unitID || it.Owner == owner { + if it.UnitID == unitID && isMatchOwner(i.PlayerID, it) { return it, true } } @@ -52,12 +56,12 @@ func (i Inventory) FindByID(owner UnitID, unitID UnitID) (Item, bool) { return Item{}, false } -func (i Inventory) ByLocation(owner UnitID, locations ...item.LocationType) []Item { +func (i Inventory) ByOwnerLocation(owner UnitID, locations ...item.LocationType) []Item { var items []Item for _, it := range i.AllItems { for _, l := range locations { - if it.Location.LocationType == l || it.Owner == owner { + if it.Location.LocationType == l && isMatchOwner(owner, it) { items = append(items, it) } } @@ -66,9 +70,23 @@ func (i Inventory) ByLocation(owner UnitID, locations ...item.LocationType) []It return items } -func (i Inventory) Matrix(owner UnitID) [4][10]bool { +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 && isMatchOwner(i.PlayerID, it) { + 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(owner, item.LocationInventory) { + 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 diff --git a/pkg/memory/item.go b/pkg/memory/item.go index 7fca0ca..c75bf31 100644 --- a/pkg/memory/item.go +++ b/pkg/memory/item.go @@ -54,6 +54,7 @@ func (gd *GameReader) Inventory(rawPlayerUnits RawPlayerUnits, hover data.HoverD Gold: inventoryGold.Value, StashedGold: stashedGold, SharedStashPages: len(stashPlayerUnitOrder), + PlayerID: rawPlayerUnits.GetMainPlayer().UnitID, } belt := data.Belt{}