1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-01-24 03:47:18 +02:00

Add limiter serialization

This commit is contained in:
nordsoft 2023-09-15 23:00:33 +02:00
parent 4af2d917c0
commit 4f76eb3fce
3 changed files with 79 additions and 2 deletions

View File

@ -45,7 +45,6 @@ void CGPandoraBox::onHeroVisit(const CGHeroInstance * h) const
{
auto setText = [](MetaString & text, int tId, const CGHeroInstance * h)
{
text.clear();
text.appendLocalString(EMetaText::ADVOB_TXT, tId);
text.replaceRawString(h->getNameTranslated());
};
@ -124,7 +123,8 @@ void CGPandoraBox::onHeroVisit(const CGHeroInstance * h) const
txt.replaceRawString(h->getNameTranslated());
}
const_cast<MetaString&>(r.message) = txt;
if(r.message.empty())
const_cast<MetaString&>(r.message) = txt;
}
BlockingDialog bd (true, false);

View File

@ -111,6 +111,7 @@ void CRewardableObject::onHeroVisit(const CGHeroInstance *h) const
case Rewardable::SELECT_ALL: // give all rewards
for(auto i : rewards)
grantRewardWithMessage(i, i == rewards.size() - 1);
break;
}
break;
}

View File

@ -15,6 +15,8 @@
#include "../CPlayerState.h"
#include "../mapObjects/CGHeroInstance.h"
#include "../serializer/JsonSerializeFormat.h"
#include "../constants/StringConstants.h"
#include "../CSkillHandler.h"
VCMI_LIB_NAMESPACE_BEGIN
@ -122,7 +124,81 @@ bool Rewardable::Limiter::heroAllowed(const CGHeroInstance * hero) const
void Rewardable::Limiter::serializeJson(JsonSerializeFormat & handler)
{
handler.serializeInt("dayOfWeek", dayOfWeek);
handler.serializeInt("daysPassed", daysPassed);
resources.serializeJson(handler, "resources");
handler.serializeInt("manaPercentage", manaPercentage);
handler.serializeInt("heroExperience", heroExperience);
handler.serializeInt("heroLevel", heroLevel);
handler.serializeInt("manaPoints", manaPoints);
handler.serializeIdArray("artifacts", artifacts);
handler.enterArray("creatures").serializeStruct(creatures);
{
auto a = handler.enterArray("primary");
a.syncSize(primary);
for(int i = 0; i < primary.size(); ++i)
a.serializeInt(i, primary[i]);
}
{
auto a = handler.enterArray("secondary");
std::vector<std::pair<std::string, std::string>> fieldValue;
if(handler.saving)
{
for(auto & i : secondary)
{
auto key = VLC->skillh->encodeSkill(i.first);
auto value = NSecondarySkill::levels.at(i.second);
fieldValue.emplace_back(key, value);
}
}
a.syncSize(fieldValue);
for(int i = 0; i < fieldValue.size(); ++i)
{
auto e = a.enterStruct(i);
e->serializeString("skill", fieldValue[i].first);
e->serializeString("level", fieldValue[i].second);
}
if(!handler.saving)
{
for(auto & i : fieldValue)
{
const int skillId = VLC->skillh->decodeSkill(i.first);
if(skillId < 0)
{
logGlobal->error("Invalid secondary skill %s", i.first);
continue;
}
const int level = vstd::find_pos(NSecondarySkill::levels, i.second);
if(level < 0)
{
logGlobal->error("Invalid secondary skill level%s", i.second);
continue;
}
secondary[SecondarySkill(skillId)] = level;
}
}
}
//sublimiters
auto serializeSublimitersList = [&handler](const std::string & field, LimitersList & container)
{
auto a = handler.enterArray(field);
a.syncSize(container);
for(int i = 0; i < container.size(); ++i)
{
if(!handler.saving)
container[i] = std::make_shared<Rewardable::Limiter>();
auto e = a.enterStruct(i);
container[i]->serializeJson(handler);
}
};
serializeSublimitersList("allOf", allOf);
serializeSublimitersList("anyOf", anyOf);
serializeSublimitersList("noneOf", noneOf);
}
VCMI_LIB_NAMESPACE_END