campaign_loader.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "campaign_loader.h"
  2. #include <QFile>
  3. #include <QJsonArray>
  4. #include <QJsonDocument>
  5. #include <QJsonObject>
  6. namespace Game::Campaign {
  7. auto CampaignLoader::parseCampaignMission(const QJsonObject &obj)
  8. -> CampaignMission {
  9. CampaignMission mission;
  10. mission.mission_id = obj["mission_id"].toString();
  11. mission.order_index = obj["order_index"].toInt(0);
  12. if (obj.contains("intro_text")) {
  13. mission.intro_text = obj["intro_text"].toString();
  14. }
  15. if (obj.contains("outro_text")) {
  16. mission.outro_text = obj["outro_text"].toString();
  17. }
  18. if (obj.contains("difficulty_modifier")) {
  19. mission.difficulty_modifier =
  20. static_cast<float>(obj["difficulty_modifier"].toDouble());
  21. }
  22. if (obj.contains("world_region_id")) {
  23. mission.world_region_id = obj["world_region_id"].toString();
  24. }
  25. return mission;
  26. }
  27. auto CampaignLoader::loadFromJsonFile(const QString &file_path,
  28. CampaignDefinition &out_campaign,
  29. QString *error_msg) -> bool {
  30. QFile file(file_path);
  31. if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
  32. if (error_msg != nullptr) {
  33. *error_msg = QString("Failed to open file: %1").arg(file_path);
  34. }
  35. return false;
  36. }
  37. QJsonParseError parse_error;
  38. const QJsonDocument doc =
  39. QJsonDocument::fromJson(file.readAll(), &parse_error);
  40. file.close();
  41. if (parse_error.error != QJsonParseError::NoError) {
  42. if (error_msg != nullptr) {
  43. *error_msg =
  44. QString("JSON parse error: %1").arg(parse_error.errorString());
  45. }
  46. return false;
  47. }
  48. if (!doc.isObject()) {
  49. if (error_msg != nullptr) {
  50. *error_msg = "JSON root is not an object";
  51. }
  52. return false;
  53. }
  54. const QJsonObject root = doc.object();
  55. out_campaign.id = root["id"].toString();
  56. out_campaign.title = root["title"].toString();
  57. out_campaign.description = root["description"].toString();
  58. if (root.contains("missions")) {
  59. const QJsonArray missions = root["missions"].toArray();
  60. for (const auto &mission_val : missions) {
  61. out_campaign.missions.push_back(
  62. parseCampaignMission(mission_val.toObject()));
  63. }
  64. }
  65. return true;
  66. }
  67. } // namespace Game::Campaign