Improve item serialization

This commit is contained in:
Perttu Ahola 2011-11-16 22:47:37 +02:00
parent 564c3a9c96
commit 8dd3622c6d
4 changed files with 61 additions and 28 deletions

@ -79,9 +79,7 @@ InventoryItem* InventoryItem::deSerialize(std::istream &is, IGameDef *gamedef)
is>>count; is>>count;
// Convert old materials // Convert old materials
if(material <= 0xff) if(material <= 0xff)
{
material = content_translate_from_19_to_internal(material); material = content_translate_from_19_to_internal(material);
}
if(material > MAX_CONTENT) if(material > MAX_CONTENT)
throw SerializationError("Too large material number"); throw SerializationError("Too large material number");
return new MaterialItem(gamedef, material, count); return new MaterialItem(gamedef, material, count);
@ -96,13 +94,22 @@ InventoryItem* InventoryItem::deSerialize(std::istream &is, IGameDef *gamedef)
throw SerializationError("Too large material number"); throw SerializationError("Too large material number");
return new MaterialItem(gamedef, material, count); return new MaterialItem(gamedef, material, count);
} }
else if(name == "MaterialItem3") else if(name == "NodeItem" || name == "MaterialItem3")
{ {
std::string all; std::string all;
std::getline(is, all, '\n'); std::getline(is, all, '\n');
std::string nodename;
// First attempt to read inside ""
Strfnd fnd(all); Strfnd fnd(all);
fnd.next("\""); fnd.next("\"");
std::string nodename = fnd.next("\""); // If didn't skip to end, we have ""s
if(!fnd.atend()){
nodename = fnd.next("\"");
} else { // No luck, just read a word then
fnd.start(all);
nodename = fnd.next(" ");
}
fnd.skip_over(" ");
u16 count = stoi(trim(fnd.next(""))); u16 count = stoi(trim(fnd.next("")));
return new MaterialItem(gamedef, nodename, count); return new MaterialItem(gamedef, nodename, count);
} }
@ -114,18 +121,42 @@ InventoryItem* InventoryItem::deSerialize(std::istream &is, IGameDef *gamedef)
} }
else if(name == "CraftItem") else if(name == "CraftItem")
{ {
std::string all;
std::getline(is, all, '\n');
std::string subname; std::string subname;
std::getline(is, subname, ' '); // First attempt to read inside ""
u16 count; Strfnd fnd(all);
is>>count; fnd.next("\"");
// If didn't skip to end, we have ""s
if(!fnd.atend()){
subname = fnd.next("\"");
} else { // No luck, just read a word then
fnd.start(all);
subname = fnd.next(" ");
}
// Then read count
fnd.skip_over(" ");
u16 count = stoi(trim(fnd.next("")));
return new CraftItem(gamedef, subname, count); return new CraftItem(gamedef, subname, count);
} }
else if(name == "ToolItem") else if(name == "ToolItem")
{ {
std::string all;
std::getline(is, all, '\n');
std::string toolname; std::string toolname;
std::getline(is, toolname, ' '); // First attempt to read inside ""
u16 wear; Strfnd fnd(all);
is>>wear; fnd.next("\"");
// If didn't skip to end, we have ""s
if(!fnd.atend()){
toolname = fnd.next("\"");
} else { // No luck, just read a word then
fnd.start(all);
toolname = fnd.next(" ");
}
// Then read wear
fnd.skip_over(" ");
u16 wear = stoi(trim(fnd.next("")));
return new ToolItem(gamedef, toolname, wear); return new ToolItem(gamedef, toolname, wear);
} }
else else

@ -139,22 +139,11 @@ public:
} }
virtual void serialize(std::ostream &os) const virtual void serialize(std::ostream &os) const
{ {
std::string nodename = m_nodename; os<<"NodeItem";
if(nodename == "")
nodename = "unknown_block";
os<<"MaterialItem3";
os<<" \""; os<<" \"";
os<<nodename; os<<m_nodename;
os<<"\" "; os<<"\" ";
os<<m_count; os<<m_count;
// Old
/*os<<"MaterialItem2";
os<<" ";
os<<(unsigned int)m_content;
os<<" ";
os<<m_count;*/
} }
virtual InventoryItem* clone() virtual InventoryItem* clone()
{ {
@ -225,9 +214,9 @@ public:
virtual void serialize(std::ostream &os) const virtual void serialize(std::ostream &os) const
{ {
os<<getName(); os<<getName();
os<<" "; os<<" \"";
os<<m_subname; os<<m_subname;
os<<" "; os<<"\" ";
os<<m_count; os<<m_count;
} }
virtual InventoryItem* clone() virtual InventoryItem* clone()
@ -304,9 +293,9 @@ public:
virtual void serialize(std::ostream &os) const virtual void serialize(std::ostream &os) const
{ {
os<<getName(); os<<getName();
os<<" "; os<<" \"";
os<<m_toolname; os<<m_toolname;
os<<" "; os<<"\" ";
os<<m_wear; os<<m_wear;
} }
virtual InventoryItem* clone() virtual InventoryItem* clone()

@ -65,6 +65,19 @@ public:
//std::cout<<"palautus=\""<<palautus<<"\""<<std::endl; //std::cout<<"palautus=\""<<palautus<<"\""<<std::endl;
return palautus; return palautus;
} }
void skip_over(std::string chars){
while(p < tek.size()){
bool is = false;
for(unsigned int i=0; i<chars.size(); i++){
if(chars[i] == tek[p]){
is = true;
break;
}
}
if(!is) break;
p++;
}
}
bool atend(){ bool atend(){
if(p>=tek.size()) return true; if(p>=tek.size()) return true;
return false; return false;

@ -32,9 +32,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "common_irrlicht.h" #include "common_irrlicht.h"
#include "debug.h" #include "debug.h"
#include "strfnd.h"
#include "exceptions.h" #include "exceptions.h"
#include "porting.h" #include "porting.h"
#include "strfnd.h" // For trim()
extern const v3s16 g_6dirs[6]; extern const v3s16 g_6dirs[6];