#include "ModifierInstance.h" #include #include nejlika::ModifierInstance::ModifierInstance(const nlohmann::json& config) { type = magic_enum::enum_cast(config["type"].get()).value_or(ModifierType::Invalid); convertTo = magic_enum::enum_cast(config["convert-to"].get()).value_or(ModifierType::Invalid); value = config["value"].get(); if (config.contains("op")) { op = magic_enum::enum_cast(config["op"].get()).value_or(ModifierOperator::Additive); } else { op = ModifierOperator::Additive; } isResistance = config.contains("resistance") ? config["resistance"].get() : false; if (config.contains("category")) { category = magic_enum::enum_cast(config["category"].get()).value_or(ModifierCategory::Player); } else { category = ModifierCategory::Player; } effectID = config.contains("effect-id") ? config["effect-id"].get() : 0; effectType = config.contains("effect-type") ? config["effect-type"].get() : ""; } nlohmann::json nejlika::ModifierInstance::ToJson() const { nlohmann::json config; config["type"] = magic_enum::enum_name(type); config["convert-to"] = magic_enum::enum_name(convertTo); config["value"] = value; config["op"] = magic_enum::enum_name(op); config["resistance"] = isResistance; config["category"] = magic_enum::enum_name(category); config["effect-id"] = effectID; config["effect-type"] = effectType; return config; } std::string nejlika::ModifierInstance::GenerateHtmlString(const std::vector& modifiers) { std::stringstream ss; // target -> resistance -> op -> type -> value std::unordered_map>>> modifierMap; bool hasConvertTo = false; bool hasSkillModifier = false; for (const auto& modifier : modifiers) { if (modifier.type == ModifierType::Invalid) { continue; } if (modifier.GetConvertTo() != ModifierType::Invalid) { hasConvertTo = true; continue; } if (!modifier.GetUpgradeName().empty()) { hasSkillModifier = true; continue; } modifierMap[modifier.category][modifier.isResistance][modifier.op][modifier.type] = modifier.value; } // Resistances and addatives are not separated, pet and player are // Summarize the resistances and addatives for (const auto& target : modifierMap) { if (target.first == ModifierCategory::Pet) { ss << "\nPets:\n"; } for (const auto& resistance : target.second) { for (const auto& math : resistance.second) { for (const auto& modifier : math.second) { ss << ""; ss << ((modifier.second > 0) ? (math.first == ModifierOperator::Multiplicative ? "+" : "") : "-"); ss << std::fixed << std::setprecision(1) << std::abs(modifier.second); if (math.first == ModifierOperator::Multiplicative) { ss << "%"; } ss << " "; ss << " " << nejlika::GetModifierTypeName(modifier.first); if (resistance.first) { // If the ss now ends with 'Damage' remove it if (ss.str().substr(ss.str().size() - 7) == " Damage") { ss.seekp(-7, std::ios_base::end); } ss << " " << "Resistance"; } ss << "\n"; } } } } if (hasSkillModifier) { for (const auto& modifier : modifiers) { if (modifier.type != ModifierType::SkillModifier) { continue; } ss << ""; ss << ((modifier.value > 0) ? "+" : "-"); ss << std::fixed << std::setprecision(0) << std::abs(modifier.value); ss << " to "; ss << modifier.GetUpgradeName(); ss << "\n"; } } if (hasConvertTo) { for (const auto& modifier : modifiers) { if (modifier.GetConvertTo() == ModifierType::Invalid) { continue; } if (modifier.type == ModifierType::Invalid) { continue; } ss << ""; // +xx/yy% of T1 converted to T2 ss << ((modifier.value > 0) ? "" : "-"); ss << std::fixed << std::setprecision(0) << std::abs(modifier.value); ss << "% "; ss << " of "; ss << nejlika::GetModifierTypeName(modifier.type); ss << " converted to "; ss << nejlika::GetModifierTypeName(modifier.GetConvertTo()); ss << "\n"; } } return ss.str(); }