94 lines
2.2 KiB
Go

package arn
import (
"errors"
)
// DefaultInventorySlotCount tells you how many slots are available by default in an inventory.
const DefaultInventorySlotCount = 24
// Inventory has inventory slots that store shop item IDs and their quantity.
type Inventory struct {
UserID UserID `json:"userId" primary:"true"`
Slots []*InventorySlot `json:"slots"`
}
// AddItem adds a given item to the inventory.
func (inventory *Inventory) AddItem(itemID string, quantity uint) error {
if itemID == "" {
return nil
}
// Find the slot with the item
for _, slot := range inventory.Slots {
if slot.ItemID == itemID {
slot.Quantity += quantity
return nil
}
}
// If the item doesn't exist in the inventory yet, add it to the first free slot
for _, slot := range inventory.Slots {
if slot.ItemID == "" {
slot.ItemID = itemID
slot.Quantity = quantity
return nil
}
}
// If there is no free slot, return an error
return errors.New("Inventory is full")
}
// ContainsItem checks if the inventory contains the item ID already.
func (inventory *Inventory) ContainsItem(itemID string) bool {
for _, slot := range inventory.Slots {
if slot.ItemID == itemID {
return true
}
}
return false
}
// SwapSlots swaps the slots with the given indices.
func (inventory *Inventory) SwapSlots(a, b int) error {
if a < 0 || b < 0 || a >= len(inventory.Slots) || b >= len(inventory.Slots) {
return errors.New("Inventory slot index out of bounds")
}
// Swap
inventory.Slots[a], inventory.Slots[b] = inventory.Slots[b], inventory.Slots[a]
return nil
}
// GetID returns the ID.
func (inventory *Inventory) GetID() string {
return inventory.UserID
}
// NewInventory creates a new inventory with the default number of slots.
func NewInventory(userID UserID) *Inventory {
inventory := &Inventory{
UserID: userID,
Slots: make([]*InventorySlot, DefaultInventorySlotCount),
}
for i := 0; i < len(inventory.Slots); i++ {
inventory.Slots[i] = &InventorySlot{}
}
return inventory
}
// GetInventory ...
func GetInventory(userID UserID) (*Inventory, error) {
obj, err := DB.Get("Inventory", userID)
if err != nil {
return nil, err
}
return obj.(*Inventory), nil
}