Cleande up the deserialization code
This commit is contained in:
@@ -41,6 +41,8 @@ public:
|
|||||||
virtual JQuadPtr getIcon(){return JQuadPtr();}
|
virtual JQuadPtr getIcon(){return JQuadPtr();}
|
||||||
|
|
||||||
bool parseLine(const string& s);
|
bool parseLine(const string& s);
|
||||||
|
|
||||||
|
friend ostream& operator<<(ostream& out, const Damageable& p);
|
||||||
};
|
};
|
||||||
|
|
||||||
class Damage: public Interruptible
|
class Damage: public Interruptible
|
||||||
@@ -71,8 +73,4 @@ class DamageStack : public GuiLayer, public Interruptible
|
|||||||
DamageStack(GameObserver *observer);
|
DamageStack(GameObserver *observer);
|
||||||
};
|
};
|
||||||
|
|
||||||
ostream& operator<<(ostream& out, const Damageable& p);
|
|
||||||
|
|
||||||
istream& operator>>(istream& in, Damageable& p);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -202,8 +202,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
ostream& operator<<(ostream&, const MTGGameZone&);
|
ostream& operator<<(ostream&, const MTGGameZone&);
|
||||||
istream& operator>>(istream&, MTGGameZone&);
|
|
||||||
ostream& operator<<(ostream&, const MTGPlayerCards&);
|
ostream& operator<<(ostream&, const MTGPlayerCards&);
|
||||||
istream& operator>>(istream&, MTGPlayerCards&);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -95,8 +95,6 @@ public:
|
|||||||
** Returns the path to the stats file of currently selected deck.
|
** Returns the path to the stats file of currently selected deck.
|
||||||
*/
|
*/
|
||||||
std::string GetCurrentDeckStatsFile();
|
std::string GetCurrentDeckStatsFile();
|
||||||
|
|
||||||
friend istream& operator>>(istream& in, Player& p);
|
|
||||||
bool parseLine(const string& s);
|
bool parseLine(const string& s);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -100,4 +100,19 @@ bool FileExists(const string & filename);
|
|||||||
std::string buildFilePath(const vector<string> & folders, const string & filename);
|
std::string buildFilePath(const vector<string> & folders, const string & filename);
|
||||||
std::string ensureFolder(const string & folderName);
|
std::string ensureFolder(const string & folderName);
|
||||||
|
|
||||||
|
template <class T> istream& operator>>(istream& in, T& p)
|
||||||
|
{
|
||||||
|
string s;
|
||||||
|
|
||||||
|
while(std::getline(in, s))
|
||||||
|
{
|
||||||
|
if(!p.parseLine(s))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return in;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -342,42 +342,3 @@ bool Damageable::parseLine(const string& s)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
istream& operator>>(istream& in, Damageable& p)
|
|
||||||
{
|
|
||||||
string s;
|
|
||||||
streampos pos = in.tellg();
|
|
||||||
while(std::getline(in, s))
|
|
||||||
{
|
|
||||||
size_t limiter = s.find("=");
|
|
||||||
if (limiter == string::npos) limiter = s.find(":");
|
|
||||||
string areaS;
|
|
||||||
if (limiter != string::npos)
|
|
||||||
{
|
|
||||||
areaS = s.substr(0, limiter);
|
|
||||||
if (areaS.compare("life") == 0)
|
|
||||||
{
|
|
||||||
p.life = atoi((s.substr(limiter + 1)).c_str());
|
|
||||||
}
|
|
||||||
else if (areaS.compare("poisoncount") == 0)
|
|
||||||
{
|
|
||||||
p.poisonCount = atoi((s.substr(limiter + 1)).c_str());
|
|
||||||
}
|
|
||||||
else if (areaS.compare("damagecount") == 0)
|
|
||||||
{
|
|
||||||
p.damageCount = atoi((s.substr(limiter + 1)).c_str());
|
|
||||||
}
|
|
||||||
else if (areaS.compare("preventable") == 0)
|
|
||||||
{
|
|
||||||
p.preventable = atoi((s.substr(limiter + 1)).c_str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
in.seekg(pos);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pos = in.tellg();
|
|
||||||
}
|
|
||||||
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -124,8 +124,6 @@ void MTGPlayerCards::OptimizedHand(Player * who,int amount, int lands, int creat
|
|||||||
{
|
{
|
||||||
//give the Ai hand adventage to insure a challanging match.
|
//give the Ai hand adventage to insure a challanging match.
|
||||||
GameObserver * game = who->getObserver();
|
GameObserver * game = who->getObserver();
|
||||||
game->currentPlayerId = game->currentPlayerId;
|
|
||||||
game->currentPlayer = game->currentPlayer;
|
|
||||||
|
|
||||||
if (!game->players[0]->isAI() && game->players[1]->isAI())
|
if (!game->players[0]->isAI() && game->players[1]->isAI())
|
||||||
{
|
{
|
||||||
@@ -1072,66 +1070,6 @@ bool MTGGameZone::parseLine(const string& ss)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
istream& operator>>(istream& in, MTGGameZone& z)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < z.nb_cards; i++)
|
|
||||||
{
|
|
||||||
SAFE_DELETE( z.cards[i] );
|
|
||||||
}
|
|
||||||
z.cards.clear();
|
|
||||||
z.cardsMap.clear();
|
|
||||||
|
|
||||||
string s;
|
|
||||||
while(std::getline(in, s))
|
|
||||||
{
|
|
||||||
while(s.size())
|
|
||||||
{
|
|
||||||
size_t limiter = s.find(",");
|
|
||||||
MTGCard * card = 0;
|
|
||||||
string toFind;
|
|
||||||
if (limiter != string::npos)
|
|
||||||
{
|
|
||||||
toFind = trim(s.substr(0, limiter));
|
|
||||||
s = s.substr(limiter + 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
toFind = trim(s);
|
|
||||||
s = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
card = MTGCollection()->getCardByName(toFind);
|
|
||||||
int id = Rules::getMTGId(toFind);
|
|
||||||
|
|
||||||
if (card)
|
|
||||||
{
|
|
||||||
/* For the moment we add the card directly in the final zone.
|
|
||||||
This is not the normal way and this prevents to resolve spells.
|
|
||||||
We'll need a fusion operation afterward to cast relevant spells */
|
|
||||||
MTGCardInstance * newCard = NEW MTGCardInstance(card, z.owner->game);
|
|
||||||
z.addCard(newCard);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(toFind == "*")
|
|
||||||
z.nb_cards++;
|
|
||||||
else if ( id < 0 )
|
|
||||||
{
|
|
||||||
// For the moment, we create a dummy Token to please the testsuite
|
|
||||||
Token* myToken = new Token(id);
|
|
||||||
z.addCard(myToken);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DebugTrace("Card unfound " << toFind << " " << id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MTGPlayerCards::parseLine(const string& s)
|
bool MTGPlayerCards::parseLine(const string& s)
|
||||||
{
|
{
|
||||||
size_t limiter = s.find("=");
|
size_t limiter = s.find("=");
|
||||||
@@ -1165,47 +1103,3 @@ bool MTGPlayerCards::parseLine(const string& s)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
istream& operator>>(istream& in, MTGPlayerCards& z)
|
|
||||||
{
|
|
||||||
string s;
|
|
||||||
streampos pos = in.tellg();
|
|
||||||
|
|
||||||
while(std::getline(in, s))
|
|
||||||
{
|
|
||||||
size_t limiter = s.find("=");
|
|
||||||
if (limiter == string::npos) limiter = s.find(":");
|
|
||||||
string areaS;
|
|
||||||
if (limiter != string::npos)
|
|
||||||
{
|
|
||||||
areaS = s.substr(0, limiter);
|
|
||||||
if (areaS.compare("graveyard") == 0)
|
|
||||||
{
|
|
||||||
istringstream stream(s.substr(limiter+1));
|
|
||||||
stream >> (*z.graveyard);
|
|
||||||
}
|
|
||||||
else if (areaS.compare("library") == 0)
|
|
||||||
{
|
|
||||||
istringstream stream(s.substr(limiter+1));
|
|
||||||
stream >> (*z.library);
|
|
||||||
}
|
|
||||||
else if (areaS.compare("hand") == 0)
|
|
||||||
{
|
|
||||||
istringstream stream(s.substr(limiter+1));
|
|
||||||
stream >> (*z.hand);
|
|
||||||
}
|
|
||||||
else if (areaS.compare("inplay") == 0 || areaS.compare("battlefield") == 0)
|
|
||||||
{
|
|
||||||
istringstream stream(s.substr(limiter+1));
|
|
||||||
stream >> (*z.battlefield);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
in.seekg(pos);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pos = in.tellg();
|
|
||||||
}
|
|
||||||
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -203,16 +203,10 @@ std::string Player::GetCurrentDeckStatsFile()
|
|||||||
return options.profileFile(filename.str());
|
return options.profileFile(filename.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ostream& operator<<(ostream& out, const Player& p)
|
|
||||||
{
|
|
||||||
return out << *(p.game);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Player::parseLine(const string& s)
|
bool Player::parseLine(const string& s)
|
||||||
{
|
{
|
||||||
if(((Damageable*)this)->parseLine(s))
|
if(((Damageable*)this)->parseLine(s))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
size_t limiter = s.find("=");
|
size_t limiter = s.find("=");
|
||||||
if (limiter == string::npos) limiter = s.find(":");
|
if (limiter == string::npos) limiter = s.find(":");
|
||||||
@@ -263,64 +257,7 @@ bool Player::parseLine(const string& s)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
istream& operator>>(istream& in, Player& p)
|
ostream& operator<<(ostream& out, const Player& p)
|
||||||
{
|
{
|
||||||
string s;
|
return out << *(p.game);
|
||||||
streampos pos = in.tellg();
|
|
||||||
|
|
||||||
in >> *((Damageable*)&p);
|
|
||||||
|
|
||||||
in.seekg(pos);
|
|
||||||
while(std::getline(in, s))
|
|
||||||
{
|
|
||||||
size_t limiter = s.find("=");
|
|
||||||
if (limiter == string::npos) limiter = s.find(":");
|
|
||||||
string areaS;
|
|
||||||
if (limiter != string::npos)
|
|
||||||
{
|
|
||||||
areaS = s.substr(0, limiter);
|
|
||||||
if (areaS.compare("manapool") == 0)
|
|
||||||
{
|
|
||||||
SAFE_DELETE(p.manaPool);
|
|
||||||
p.manaPool = new ManaPool(&p);
|
|
||||||
ManaCost::parseManaCost(s.substr(limiter + 1), p.manaPool);
|
|
||||||
}
|
|
||||||
else if (areaS.compare("avatar") == 0)
|
|
||||||
{ // We don't load directly for now
|
|
||||||
p.mAvatarName = s.substr(limiter + 1);
|
|
||||||
}
|
|
||||||
else if (areaS.compare("customphasering") == 0)
|
|
||||||
{
|
|
||||||
p.phaseRing = s.substr(limiter + 1);
|
|
||||||
}
|
|
||||||
else if (areaS.compare("offerinterruptonphase") == 0)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < Constants::NB_MTG_PHASES; i++)
|
|
||||||
{
|
|
||||||
string phaseStr = Constants::MTGPhaseCodeNames[i];
|
|
||||||
if (s.find(phaseStr) != string::npos)
|
|
||||||
{
|
|
||||||
p.offerInterruptOnPhase = PhaseRing::phaseStrToInt(phaseStr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
in.seekg(pos);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pos = in.tellg();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!p.game)
|
|
||||||
{
|
|
||||||
p.game = new MTGPlayerCards();
|
|
||||||
p.game->setOwner(&p);
|
|
||||||
}
|
|
||||||
|
|
||||||
in >> *(p.game);
|
|
||||||
|
|
||||||
return in;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user