Add InventoryList width property & allow custom crafting grids.

This commit is contained in:
Ilya Zhuravlev 2012-08-20 01:29:56 +04:00 committed by Perttu Ahola
parent 43ebec2be1
commit 6a16075912
7 changed files with 69 additions and 8 deletions

View File

@ -1118,6 +1118,8 @@ methods:
- is_empty(listname): return true if list is empty - is_empty(listname): return true if list is empty
- get_size(listname): get size of a list - get_size(listname): get size of a list
- set_size(listname, size): set size of a list - set_size(listname, size): set size of a list
- get_width(listname): get width of a list
- set_width(listname, width): set width of list; currently used for crafting
- get_stack(listname, i): get a copy of stack index i in list - get_stack(listname, i): get a copy of stack index i in list
- set_stack(listname, i, stack): copy stack to index i in list - set_stack(listname, i, stack): copy stack to index i in list
- get_list(listname): return full list - get_list(listname): return full list

View File

@ -431,6 +431,7 @@ InventoryList::InventoryList(std::string name, u32 size, IItemDefManager *itemde
{ {
m_name = name; m_name = name;
m_size = size; m_size = size;
m_width = 0;
m_itemdef = itemdef; m_itemdef = itemdef;
clearItems(); clearItems();
//m_dirty = false; //m_dirty = false;
@ -459,6 +460,11 @@ void InventoryList::setSize(u32 newsize)
m_size = newsize; m_size = newsize;
} }
void InventoryList::setWidth(u32 newwidth)
{
m_width = newwidth;
}
void InventoryList::setName(const std::string &name) void InventoryList::setName(const std::string &name)
{ {
m_name = name; m_name = name;
@ -468,6 +474,8 @@ void InventoryList::serialize(std::ostream &os) const
{ {
//os.imbue(std::locale("C")); //os.imbue(std::locale("C"));
os<<"Width "<<m_width<<"\n";
for(u32 i=0; i<m_items.size(); i++) for(u32 i=0; i<m_items.size(); i++)
{ {
const ItemStack &item = m_items[i]; const ItemStack &item = m_items[i];
@ -492,6 +500,7 @@ void InventoryList::deSerialize(std::istream &is)
clearItems(); clearItems();
u32 item_i = 0; u32 item_i = 0;
m_width = 0;
for(;;) for(;;)
{ {
@ -513,6 +522,12 @@ void InventoryList::deSerialize(std::istream &is)
{ {
break; break;
} }
else if(name == "Width")
{
iss >> m_width;
if (iss.fail())
throw SerializationError("incorrect width property");
}
else if(name == "Item") else if(name == "Item")
{ {
if(item_i > getSize() - 1) if(item_i > getSize() - 1)
@ -543,6 +558,7 @@ InventoryList & InventoryList::operator = (const InventoryList &other)
{ {
m_items = other.m_items; m_items = other.m_items;
m_size = other.m_size; m_size = other.m_size;
m_width = other.m_width;
m_name = other.m_name; m_name = other.m_name;
m_itemdef = other.m_itemdef; m_itemdef = other.m_itemdef;
//setDirty(true); //setDirty(true);
@ -560,6 +576,11 @@ u32 InventoryList::getSize() const
return m_items.size(); return m_items.size();
} }
u32 InventoryList::getWidth() const
{
return m_width;
}
u32 InventoryList::getUsedSlots() const u32 InventoryList::getUsedSlots() const
{ {
u32 num = 0; u32 num = 0;

View File

@ -176,6 +176,7 @@ public:
~InventoryList(); ~InventoryList();
void clearItems(); void clearItems();
void setSize(u32 newsize); void setSize(u32 newsize);
void setWidth(u32 newWidth);
void setName(const std::string &name); void setName(const std::string &name);
void serialize(std::ostream &os) const; void serialize(std::ostream &os) const;
void deSerialize(std::istream &is); void deSerialize(std::istream &is);
@ -185,6 +186,7 @@ public:
const std::string &getName() const; const std::string &getName() const;
u32 getSize() const; u32 getSize() const;
u32 getWidth() const;
// Count used slots // Count used slots
u32 getUsedSlots() const; u32 getUsedSlots() const;
u32 getFreeSlots() const; u32 getFreeSlots() const;
@ -240,7 +242,7 @@ public:
private: private:
std::vector<ItemStack> m_items; std::vector<ItemStack> m_items;
u32 m_size; u32 m_size, m_width;
std::string m_name; std::string m_name;
IItemDefManager *m_itemdef; IItemDefManager *m_itemdef;
}; };

View File

@ -769,18 +769,16 @@ bool getCraftingResult(Inventory *inv, ItemStack& result,
result.clear(); result.clear();
// TODO: Allow different sizes of crafting grids
// Get the InventoryList in which we will operate // Get the InventoryList in which we will operate
InventoryList *clist = inv->getList("craft"); InventoryList *clist = inv->getList("craft");
if(!clist || clist->getSize() != 9) if(!clist)
return false; return false;
// Mangle crafting grid to an another format // Mangle crafting grid to an another format
CraftInput ci; CraftInput ci;
ci.method = CRAFT_METHOD_NORMAL; ci.method = CRAFT_METHOD_NORMAL;
ci.width = 3; ci.width = clist->getWidth() ? clist->getWidth() : 3;
for(u16 i=0; i<9; i++) for(u16 i=0; i<clist->getSize(); i++)
ci.items.push_back(clist->getItem(i)); ci.items.push_back(clist->getItem(i));
// Find out what is crafted and add it to result item slot // Find out what is crafted and add it to result item slot
@ -793,7 +791,7 @@ bool getCraftingResult(Inventory *inv, ItemStack& result,
if(found && decrementInput) if(found && decrementInput)
{ {
// CraftInput has been changed, apply changes in clist // CraftInput has been changed, apply changes in clist
for(u16 i=0; i<9; i++) for(u16 i=0; i<clist->getSize(); i++)
{ {
clist->changeItem(i, ci.items[i]); clist->changeItem(i, ci.items[i]);
} }

View File

@ -45,7 +45,8 @@ Player::Player(IGameDef *gamedef):
updateName("<not set>"); updateName("<not set>");
inventory.clear(); inventory.clear();
inventory.addList("main", PLAYER_INVENTORY_SIZE); inventory.addList("main", PLAYER_INVENTORY_SIZE);
inventory.addList("craft", 9); InventoryList *craft = inventory.addList("craft", 9);
craft->setWidth(3);
inventory.addList("craftpreview", 1); inventory.addList("craftpreview", 1);
inventory.addList("craftresult", 1); inventory.addList("craftresult", 1);

View File

@ -1847,6 +1847,20 @@ private:
return 1; return 1;
} }
// get_width(self, listname)
static int l_get_width(lua_State *L)
{
InvRef *ref = checkobject(L, 1);
const char *listname = luaL_checkstring(L, 2);
InventoryList *list = getlist(L, ref, listname);
if(list){
lua_pushinteger(L, list->getWidth());
} else {
lua_pushinteger(L, 0);
}
return 1;
}
// set_size(self, listname, size) // set_size(self, listname, size)
static int l_set_size(lua_State *L) static int l_set_size(lua_State *L)
{ {
@ -1869,6 +1883,23 @@ private:
return 0; return 0;
} }
// set_width(self, listname, size)
static int l_set_width(lua_State *L)
{
InvRef *ref = checkobject(L, 1);
const char *listname = luaL_checkstring(L, 2);
int newwidth = luaL_checknumber(L, 3);
Inventory *inv = getinv(L, ref);
InventoryList *list = inv->getList(listname);
if(list){
list->setWidth(newwidth);
} else {
return 0;
}
reportInventoryChange(L, ref);
return 0;
}
// get_stack(self, listname, i) -> itemstack // get_stack(self, listname, i) -> itemstack
static int l_get_stack(lua_State *L) static int l_get_stack(lua_State *L)
{ {
@ -2062,6 +2093,8 @@ const luaL_reg InvRef::methods[] = {
method(InvRef, is_empty), method(InvRef, is_empty),
method(InvRef, get_size), method(InvRef, get_size),
method(InvRef, set_size), method(InvRef, set_size),
method(InvRef, get_width),
method(InvRef, set_width),
method(InvRef, get_stack), method(InvRef, get_stack),
method(InvRef, set_stack), method(InvRef, set_stack),
method(InvRef, get_list), method(InvRef, get_list),

View File

@ -698,6 +698,7 @@ struct TestInventory: public TestBase
{ {
std::string serialized_inventory = std::string serialized_inventory =
"List 0 32\n" "List 0 32\n"
"Width 3\n"
"Empty\n" "Empty\n"
"Empty\n" "Empty\n"
"Empty\n" "Empty\n"
@ -735,6 +736,7 @@ struct TestInventory: public TestBase
std::string serialized_inventory_2 = std::string serialized_inventory_2 =
"List main 32\n" "List main 32\n"
"Width 5\n"
"Empty\n" "Empty\n"
"Empty\n" "Empty\n"
"Empty\n" "Empty\n"
@ -778,6 +780,8 @@ struct TestInventory: public TestBase
inv.getList("0")->setName("main"); inv.getList("0")->setName("main");
UASSERT(!inv.getList("0")); UASSERT(!inv.getList("0"));
UASSERT(inv.getList("main")); UASSERT(inv.getList("main"));
UASSERT(inv.getList("main")->getWidth() == 3);
inv.getList("main")->setWidth(5);
std::ostringstream inv_os(std::ios::binary); std::ostringstream inv_os(std::ios::binary);
inv.serialize(inv_os); inv.serialize(inv_os);
UASSERT(inv_os.str() == serialized_inventory_2); UASSERT(inv_os.str() == serialized_inventory_2);