summaryrefslogtreecommitdiffstats
path: root/source/ItemGrid.h
blob: ed4d5e58d759db8149245dc5ee2f47e09a716ac0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94

// 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