diff --git a/internal/plugin/adventure_robbie.go b/internal/plugin/adventure_robbie.go index 50f9221..3221766 100644 --- a/internal/plugin/adventure_robbie.go +++ b/internal/plugin/adventure_robbie.go @@ -184,8 +184,10 @@ func (p *AdventurePlugin) robbieVisitPlayer(userID id.UserID, displayName string func robbieQualifyingItems(inv []AdvItem, equip map[EquipmentSlot]*AdvEquipment) []AdvItem { var result []AdvItem for _, item := range inv { - // Never touch Arena gear or cards - if item.Type == "ArenaGear" || item.Type == "card" { + // Never touch Arena gear, cards, or consumables. Consumables are a + // player-curated stockpile (crafted or dropped); selling them is an + // explicit decision the player must make themselves. + if item.Type == "ArenaGear" || item.Type == "card" || item.Type == "consumable" { continue } diff --git a/internal/plugin/adventure_shop.go b/internal/plugin/adventure_shop.go index 1fcaebd..4b15987 100644 --- a/internal/plugin/adventure_shop.go +++ b/internal/plugin/adventure_shop.go @@ -778,11 +778,16 @@ func (p *AdventurePlugin) advSellAll(userID id.UserID) string { var total float64 var sold int var keptSpecial int + var keptConsumable int for _, item := range items { if item.Type == "MasterworkGear" || item.Type == "ArenaGear" || item.Type == "card" { keptSpecial++ continue } + if item.Type == "consumable" { + keptConsumable++ + continue + } if err := removeAdvInventoryItem(item.ID); err != nil { continue } @@ -791,8 +796,13 @@ func (p *AdventurePlugin) advSellAll(userID id.UserID) string { } if sold == 0 { - if keptSpecial > 0 { + switch { + case keptSpecial > 0 && keptConsumable > 0: + return "Your inventory only contains special gear and consumables. The merchant won't touch any of it. Use `!adventure equip` for gear or `!adventure sell ` for individual consumables." + case keptSpecial > 0: return "Your inventory only contains Masterwork and Arena gear. The merchant doesn't deal in that. Use `!adventure equip` instead." + case keptConsumable > 0: + return "Your inventory only contains consumables. `sell all` won't touch them — use `!adventure sell ` to sell a specific consumable." } return "Your inventory is empty. There is nothing to sell. This is a metaphor for something but now is not the time." } @@ -811,6 +821,9 @@ func (p *AdventurePlugin) advSellAll(userID id.UserID) string { if keptSpecial > 0 { msg += fmt.Sprintf("\n\n(%d special gear items kept — the merchant knows better than to touch those.)", keptSpecial) } + if keptConsumable > 0 { + msg += fmt.Sprintf("\n(%d consumable(s) kept — `sell all` doesn't touch them. Sell explicitly with `!adventure sell `.)", keptConsumable) + } return msg }