Files
MaaAssistantArknights/src/MaaCore/Config/Miscellaneous/BattleDataConfig.cpp
MistEO 5c0445d3ab refactor: 依赖大更新 (#13908)
Co-authored-by: status102 <102887808+status102@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-09-08 21:17:47 +08:00

83 lines
3.3 KiB
C++

#include "BattleDataConfig.h"
#include "Utils/Logger.hpp"
#include <meojson/json.hpp>
#include <ranges>
bool asst::BattleDataConfig::parse(const json::value& json)
{
LogTraceFunction;
m_drones_confusing.clear();
for (const auto& [id, char_data_json] : json.at("chars").as_object()) {
battle::OperProps data;
data.id = id;
std::string name = char_data_json.at("name").as_string();
std::string name_en = char_data_json.at("name_en").as_string();
std::string name_jp = char_data_json.at("name_jp").as_string();
std::string name_kr = char_data_json.at("name_kr").as_string();
std::string name_tw = char_data_json.at("name_tw").as_string();
data.name = name;
data.name_en = name_en;
data.name_jp = name_jp;
data.name_kr = name_kr;
data.name_tw = name_tw;
static const std::unordered_map<std::string, battle::Role> RoleMap = {
{ "CASTER", battle::Role::Caster }, { "MEDIC", battle::Role::Medic },
{ "PIONEER", battle::Role::Pioneer }, { "SNIPER", battle::Role::Sniper },
{ "SPECIAL", battle::Role::Special }, { "SUPPORT", battle::Role::Support },
{ "TANK", battle::Role::Tank }, { "WARRIOR", battle::Role::Warrior },
};
if (auto iter = RoleMap.find(char_data_json.at("profession").as_string()); iter == RoleMap.cend()) {
data.role = battle::Role::Drone;
}
else {
data.role = iter->second;
m_opers.emplace(name); // 所有干员名
}
const auto& ranges_json = char_data_json.at("rangeId").as_array();
for (size_t i = 0; i != data.ranges.size(); ++i) {
data.ranges.at(i) = ranges_json.at(i).as_string();
}
static const std::unordered_map<std::string, battle::LocationType> PositionMap = {
{ "NONE", battle::LocationType::All }, // 这种很多都是道具之类的,一般哪都能放
{ "MELEE", battle::LocationType::Melee },
{ "RANGED", battle::LocationType::Ranged },
{ "ALL", battle::LocationType::All },
};
if (auto iter = PositionMap.find(char_data_json.at("position").as_string()); iter == PositionMap.cend()) {
Log.warn("Unknown position", char_data_json.at("position").as_string());
data.location_type = battle::LocationType::Invalid;
}
else {
data.location_type = iter->second;
}
const auto& rarity = char_data_json.at("rarity").as_integer();
data.rarity = rarity;
if (auto tokens_opt = char_data_json.find<json::array>("tokens")) {
for (const auto& token : *tokens_opt) {
data.tokens.emplace_back(token.as_string());
if (tokens_opt->size() > 1) {
m_drones_confusing.emplace_back(token.as_string());
}
}
}
m_chars.emplace(std::move(name), std::move(data));
}
for (const auto& [id, points_json] : json.at("ranges").as_object()) {
battle::AttackRange points;
for (const auto& point : points_json.as_array()) {
points.emplace_back(point[0].as_integer(), point[1].as_integer());
}
m_ranges.emplace(id, std::move(points));
}
return true;
}