// ItemGrid.h // Declares the cItemGrid class representing a storage for items in a XY grid (chests, dispensers, inventory etc.) #pragma once #include "Item.h" // tolua_begin class cItemGrid { public: // tolua_end cItemGrid(int a_Width, int a_Height); ~cItemGrid(); // tolua_begin int GetWidth (void) const { return m_Width; } int GetHeight (void) const { return m_Height; } int GetNumSlots(void) const { return m_NumSlots; } /// Converts XY coords into slot number; returns -1 on invalid coords int GetSlotNum(int a_X, int a_Y) const; // tolua_end /// Converts slot number into XY coords; sets coords to -1 on invalid slot number. Exported in ManualBindings.cpp void GetSlotCoords(int a_SlotNum, int & a_X, int & a_Y) const; // tolua_begin // Retrieve slots by coords or slot number; Logs warning and returns the first slot on invalid coords / slotnum const cItem & GetSlot(int a_X, int a_Y) const; cItem & GetSlot(int a_X, int a_Y); const cItem & GetSlot(int a_SlotNum) const; cItem & GetSlot(int a_SlotNum); // Set slot by coords or slot number; Logs warning and doesn't set on invalid coords / slotnum void SetSlot(int a_X, int a_Y, const cItem & a_Item); void SetSlot(int a_X, int a_Y, short a_ItemType, char a_ItemCount, short a_ItemDamage); void SetSlot(int a_SlotNum, const cItem & a_Item); void SetSlot(int a_SlotNum, short a_ItemType, char a_ItemCount, short a_ItemDamage); /// Sets all items as empty void Clear(void); /// Returns number of items out of a_ItemStack that can fit in the storage int HowManyCanFit(const cItem & a_ItemStack); /// Adds as many items out of a_ItemStack as can fit; the rest is left in a_ItemStack; returns true if any items fit. bool AddItem(cItem & a_ItemStack); /// Same as AddItem, but works on an entire list of item stacks bool AddItems(cItems & a_ItemStackList); /// Returns the index of the first empty slot; -1 if all full int GetFirstEmptySlot(void) const; /// Returns the index of the last empty slot; -1 if all full int GetLastEmptySlot(void) const; /// Returns the index of the first empty slot following a_StartFrom (a_StartFrom is not checked) int GetNextEmptySlot(int a_StartFrom) const; /// Copies the contents into a cItems object void CopyToItems(cItems & a_Items) const; // tolua_end /** Generates random loot from the specified loot probability table, with a chance of enchanted books added. A total of a_NumSlots are taken by the loot. Cannot export to Lua due to raw array a_LootProbabs. */ void GenerateRandomLootWithBooks(const cLootProbab * a_LootProbabs, int a_CountLootProbabs, int a_NumSlots, int a_Seed); // tolua_begin protected: int m_Width; int m_Height; int m_NumSlots; // m_Width * m_Height, for easier validity checking in the access functions cItem * m_Slots; // x + m_Width * y } ; // tolua_end