mirror of
https://github.com/vcmi/vcmi.git
synced 2025-06-23 00:28:08 +02:00
Seerhut works as rewardable object
This commit is contained in:
@ -19,6 +19,7 @@
|
|||||||
#include "VCMI_Lib.h"
|
#include "VCMI_Lib.h"
|
||||||
#include "mapObjectConstructors/CObjectClassesHandler.h"
|
#include "mapObjectConstructors/CObjectClassesHandler.h"
|
||||||
#include "spells/CSpellHandler.h"
|
#include "spells/CSpellHandler.h"
|
||||||
|
#include "serializer/JsonSerializeFormat.h"
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_BEGIN
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
@ -385,4 +386,14 @@ void MetaString::jsonDeserialize(const JsonNode & source)
|
|||||||
numbers.push_back(entry.Integer());
|
numbers.push_back(entry.Integer());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MetaString::serializeJson(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
JsonNode attr;
|
||||||
|
if(handler.saving)
|
||||||
|
jsonSerialize(attr);
|
||||||
|
handler.serializeRaw("attributes", attr, std::nullopt);
|
||||||
|
if(!handler.saving)
|
||||||
|
jsonDeserialize(attr);
|
||||||
|
}
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_END
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
@ -14,6 +14,7 @@ VCMI_LIB_NAMESPACE_BEGIN
|
|||||||
class JsonNode;
|
class JsonNode;
|
||||||
class CreatureID;
|
class CreatureID;
|
||||||
class CStackBasicDescriptor;
|
class CStackBasicDescriptor;
|
||||||
|
class JsonSerializeFormat;
|
||||||
using TQuantity = si32;
|
using TQuantity = si32;
|
||||||
|
|
||||||
/// Strings classes that can be used as replacement in MetaString
|
/// Strings classes that can be used as replacement in MetaString
|
||||||
@ -114,6 +115,8 @@ public:
|
|||||||
void jsonSerialize(JsonNode & dest) const;
|
void jsonSerialize(JsonNode & dest) const;
|
||||||
void jsonDeserialize(const JsonNode & dest);
|
void jsonDeserialize(const JsonNode & dest);
|
||||||
|
|
||||||
|
void serializeJson(JsonSerializeFormat & handler);
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler & h, const int version)
|
template <typename Handler> void serialize(Handler & h, const int version)
|
||||||
{
|
{
|
||||||
h & exactStrings;
|
h & exactStrings;
|
||||||
|
@ -802,35 +802,28 @@ void CGSeerHut::serializeJsonOptions(JsonSerializeFormat & handler)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto s = handler.enterStruct("reward");
|
if(handler.getCurrent()["reward"].isNull() || handler.getCurrent()["reward"].Struct().empty())
|
||||||
std::string fullIdentifier;
|
|
||||||
std::string metaTypeName;
|
|
||||||
std::string scope;
|
|
||||||
std::string identifier;
|
|
||||||
|
|
||||||
const JsonNode & rewardsJson = handler.getCurrent();
|
|
||||||
|
|
||||||
fullIdentifier.clear();
|
|
||||||
|
|
||||||
if(rewardsJson.Struct().empty())
|
|
||||||
{
|
|
||||||
CRewardableObject::serializeJsonOptions(handler);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
auto iter = rewardsJson.Struct().begin();
|
|
||||||
fullIdentifier = iter->first;
|
|
||||||
}
|
|
||||||
|
|
||||||
ModUtility::parseIdentifier(fullIdentifier, scope, metaTypeName, identifier);
|
|
||||||
if(!std::set<std::string>{"resource", "primarySkill", "secondarySkill", "artifact", "spell", "creature", "experience", "mana", "morale", "luck"}.count(metaTypeName))
|
|
||||||
{
|
{
|
||||||
CRewardableObject::serializeJsonOptions(handler);
|
CRewardableObject::serializeJsonOptions(handler);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//backward compatibility
|
//backward compatibility
|
||||||
|
auto s = handler.enterStruct("reward");
|
||||||
|
const JsonNode & rewardsJson = handler.getCurrent();
|
||||||
|
|
||||||
|
std::string fullIdentifier;
|
||||||
|
std::string metaTypeName;
|
||||||
|
std::string scope;
|
||||||
|
std::string identifier;
|
||||||
|
|
||||||
|
auto iter = rewardsJson.Struct().begin();
|
||||||
|
fullIdentifier = iter->first;
|
||||||
|
|
||||||
|
ModUtility::parseIdentifier(fullIdentifier, scope, metaTypeName, identifier);
|
||||||
|
if(!std::set<std::string>{"resource", "primarySkill", "secondarySkill", "artifact", "spell", "creature", "experience", "mana", "morale", "luck"}.count(metaTypeName))
|
||||||
|
return;
|
||||||
|
|
||||||
int val = 0;
|
int val = 0;
|
||||||
handler.serializeInt(fullIdentifier, val);
|
handler.serializeInt(fullIdentifier, val);
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include "../NetPacks.h"
|
#include "../NetPacks.h"
|
||||||
#include "../mapObjectConstructors/AObjectTypeHandler.h"
|
#include "../mapObjectConstructors/AObjectTypeHandler.h"
|
||||||
#include "../mapObjectConstructors/CObjectClassesHandler.h"
|
#include "../mapObjectConstructors/CObjectClassesHandler.h"
|
||||||
|
#include "../serializer/JsonSerializeFormat.h"
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_BEGIN
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
@ -278,7 +279,8 @@ CRewardableObject::CRewardableObject()
|
|||||||
|
|
||||||
void CRewardableObject::serializeJsonOptions(JsonSerializeFormat & handler)
|
void CRewardableObject::serializeJsonOptions(JsonSerializeFormat & handler)
|
||||||
{
|
{
|
||||||
|
CArmedInstance::serializeJsonOptions(handler);
|
||||||
|
handler.serializeStruct("rewardable", static_cast<Rewardable::Interface&>(*this));
|
||||||
}
|
}
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_END
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
#include "StdInc.h"
|
#include "StdInc.h"
|
||||||
#include "Configuration.h"
|
#include "Configuration.h"
|
||||||
|
#include "../serializer/JsonSerializeFormat.h"
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_BEGIN
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
@ -23,4 +24,30 @@ ui16 Rewardable::Configuration::getResetDuration() const
|
|||||||
return resetParameters.period;
|
return resetParameters.period;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Rewardable::ResetInfo::serializeJson(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
handler.serializeInt("period", period);
|
||||||
|
handler.serializeBool("visitors", visitors);
|
||||||
|
handler.serializeBool("rewards", rewards);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Rewardable::VisitInfo::serializeJson(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
handler.serializeStruct("limiter", limiter);
|
||||||
|
handler.serializeStruct("reward", reward);
|
||||||
|
handler.serializeStruct("message", message);
|
||||||
|
handler.serializeInt("visitType", visitType);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Rewardable::Configuration::serializeJson(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
handler.serializeStruct("onSelect", onSelect);
|
||||||
|
handler.enterArray("info").serializeStruct(info);
|
||||||
|
handler.serializeEnum("selectMode", selectMode, std::vector<std::string>{SelectModeString.begin(), SelectModeString.end()});
|
||||||
|
handler.serializeEnum("visitMode", visitMode, std::vector<std::string>{VisitModeString.begin(), VisitModeString.end()});
|
||||||
|
handler.serializeStruct("resetParameters", resetParameters);
|
||||||
|
handler.serializeBool("canRefuse", canRefuse);
|
||||||
|
handler.serializeInt("infoWindowType", infoWindowType);
|
||||||
|
}
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_END
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
@ -66,6 +66,8 @@ struct DLL_LINKAGE ResetInfo
|
|||||||
/// if true - re-randomize rewards on a new week
|
/// if true - re-randomize rewards on a new week
|
||||||
bool rewards;
|
bool rewards;
|
||||||
|
|
||||||
|
void serializeJson(JsonSerializeFormat & handler);
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
h & period;
|
h & period;
|
||||||
@ -85,6 +87,8 @@ struct DLL_LINKAGE VisitInfo
|
|||||||
/// Event to which this reward is assigned
|
/// Event to which this reward is assigned
|
||||||
EEventType visitType;
|
EEventType visitType;
|
||||||
|
|
||||||
|
void serializeJson(JsonSerializeFormat & handler);
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
h & limiter;
|
h & limiter;
|
||||||
@ -121,6 +125,8 @@ struct DLL_LINKAGE Configuration
|
|||||||
EVisitMode getVisitMode() const;
|
EVisitMode getVisitMode() const;
|
||||||
ui16 getResetDuration() const;
|
ui16 getResetDuration() const;
|
||||||
|
|
||||||
|
void serializeJson(JsonSerializeFormat & handler);
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
h & info;
|
h & info;
|
||||||
|
@ -147,4 +147,9 @@ void Rewardable::Interface::grantRewardAfterLevelup(IGameCallback * cb, const Re
|
|||||||
cb->removeAfterVisit(instance);
|
cb->removeAfterVisit(instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Rewardable::Interface::serializeJson(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
configuration.serializeJson(handler);
|
||||||
|
}
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_END
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
@ -44,6 +44,8 @@ public:
|
|||||||
|
|
||||||
Rewardable::Configuration configuration;
|
Rewardable::Configuration configuration;
|
||||||
|
|
||||||
|
void serializeJson(JsonSerializeFormat & handler);
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
h & configuration;
|
h & configuration;
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include "../IGameCallback.h"
|
#include "../IGameCallback.h"
|
||||||
#include "../CPlayerState.h"
|
#include "../CPlayerState.h"
|
||||||
#include "../mapObjects/CGHeroInstance.h"
|
#include "../mapObjects/CGHeroInstance.h"
|
||||||
|
#include "../serializer/JsonSerializeFormat.h"
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_BEGIN
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
@ -119,4 +120,9 @@ bool Rewardable::Limiter::heroAllowed(const CGHeroInstance * hero) const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Rewardable::Limiter::serializeJson(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_END
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
@ -92,6 +92,8 @@ struct DLL_LINKAGE Limiter
|
|||||||
h & anyOf;
|
h & anyOf;
|
||||||
h & noneOf;
|
h & noneOf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void serializeJson(JsonSerializeFormat & handler);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,9 @@
|
|||||||
#include "Reward.h"
|
#include "Reward.h"
|
||||||
|
|
||||||
#include "../mapObjects/CGHeroInstance.h"
|
#include "../mapObjects/CGHeroInstance.h"
|
||||||
|
#include "../serializer/JsonSerializeFormat.h"
|
||||||
|
#include "../constants/StringConstants.h"
|
||||||
|
#include "../CSkillHandler.h"
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_BEGIN
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
@ -94,4 +97,97 @@ void Rewardable::Reward::loadComponents(std::vector<Component> & comps,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Rewardable::Reward::serializeJson(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
resources.serializeJson(handler, "resources");
|
||||||
|
handler.serializeBool("removeObject", removeObject);
|
||||||
|
handler.serializeInt("manaPercentage", manaPercentage);
|
||||||
|
handler.serializeInt("movePercentage", movePercentage);
|
||||||
|
handler.serializeInt("heroExperience", heroExperience);
|
||||||
|
handler.serializeInt("heroLevel", heroLevel);
|
||||||
|
handler.serializeInt("manaDiff", manaDiff);
|
||||||
|
handler.serializeInt("manaOverflowFactor", manaOverflowFactor);
|
||||||
|
handler.serializeInt("movePoints", movePoints);
|
||||||
|
handler.serializeIdArray("artifacts", artifacts);
|
||||||
|
handler.serializeIdArray("spells", spells);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto a = handler.enterArray("creaturesChange");
|
||||||
|
std::vector<std::pair<CreatureID, CreatureID>> fieldValue;
|
||||||
|
if(handler.saving)
|
||||||
|
{
|
||||||
|
for(auto & i : creaturesChange)
|
||||||
|
fieldValue.push_back(i);
|
||||||
|
}
|
||||||
|
a.syncSize(fieldValue);
|
||||||
|
for(int i = 0; i < fieldValue.size(); ++i)
|
||||||
|
{
|
||||||
|
auto e = a.enterStruct(i);
|
||||||
|
e->serializeId("creature", fieldValue[i].first, CreatureID{});
|
||||||
|
e->serializeId("amount", fieldValue[i].second, CreatureID{});
|
||||||
|
}
|
||||||
|
if(!handler.saving)
|
||||||
|
{
|
||||||
|
for(auto & i : fieldValue)
|
||||||
|
creaturesChange[i.first] = i.second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto a = handler.enterStruct("spellCast");
|
||||||
|
a->serializeId("spell", spellCast.first, SpellID{});
|
||||||
|
a->serializeInt("level", spellCast.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_END
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
@ -110,6 +110,8 @@ struct DLL_LINKAGE Reward
|
|||||||
if(version >= 821)
|
if(version >= 821)
|
||||||
h & spellCast;
|
h & spellCast;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void serializeJson(JsonSerializeFormat & handler);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -293,7 +293,9 @@ bool RewardsWidget::commitChanges()
|
|||||||
seerhut->configuration.info.clear();
|
seerhut->configuration.info.clear();
|
||||||
for(int row = 0; row < rewards; ++row)
|
for(int row = 0; row < rewards; ++row)
|
||||||
{
|
{
|
||||||
Rewardable::Reward reward;
|
seerhut->configuration.info.emplace_back();
|
||||||
|
seerhut->configuration.info.back().visitType = Rewardable::EEventType::EVENT_FIRST_VISIT;
|
||||||
|
Rewardable::Reward & reward = seerhut->configuration.info.back().reward;
|
||||||
haveRewards = true;
|
haveRewards = true;
|
||||||
int typeId = ui->rewardsTable->item(row, 0)->data(Qt::UserRole).toInt();
|
int typeId = ui->rewardsTable->item(row, 0)->data(Qt::UserRole).toInt();
|
||||||
int listId = ui->rewardsTable->item(row, 1) ? ui->rewardsTable->item(row, 1)->data(Qt::UserRole).toInt() : 0;
|
int listId = ui->rewardsTable->item(row, 1) ? ui->rewardsTable->item(row, 1)->data(Qt::UserRole).toInt() : 0;
|
||||||
|
Reference in New Issue
Block a user