save_storage.h 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #pragma once
  2. #include <QByteArray>
  3. #include <QJsonObject>
  4. #include <QSqlDatabase>
  5. #include <QString>
  6. #include <QVariantList>
  7. #include <memory>
  8. namespace Game::Campaign {
  9. struct CampaignDefinition;
  10. }
  11. namespace Game::Systems {
  12. class SaveStorage {
  13. public:
  14. explicit SaveStorage(QString database_path);
  15. ~SaveStorage();
  16. auto initialize(QString *out_error = nullptr) const -> bool;
  17. auto save_slot(const QString &slot_name, const QString &title,
  18. const QJsonObject &metadata, const QByteArray &world_state,
  19. const QByteArray &screenshot,
  20. QString *out_error = nullptr) -> bool;
  21. auto load_slot(const QString &slot_name, QByteArray &world_state,
  22. QJsonObject &metadata, QByteArray &screenshot, QString &title,
  23. QString *out_error = nullptr) -> bool;
  24. auto list_slots(QString *out_error = nullptr) const -> QVariantList;
  25. auto delete_slot(const QString &slot_name,
  26. QString *out_error = nullptr) -> bool;
  27. auto list_campaigns(QString *out_error = nullptr) -> QVariantList;
  28. auto get_campaign_progress(const QString &campaign_id,
  29. QString *out_error = nullptr) const -> QVariantMap;
  30. auto mark_campaign_completed(const QString &campaign_id,
  31. QString *out_error = nullptr) -> bool;
  32. auto save_mission_result(const QString &mission_id, const QString &mode,
  33. const QString &campaign_id, bool completed,
  34. const QString &result, const QString &difficulty,
  35. float completion_time,
  36. QString *out_error = nullptr) -> bool;
  37. auto get_mission_progress(const QString &mission_id,
  38. QString *out_error = nullptr) const -> QVariantMap;
  39. auto get_campaign_mission_progress(const QString &campaign_id,
  40. QString *out_error = nullptr) const
  41. -> QVariantList;
  42. auto unlock_next_mission(const QString &campaign_id,
  43. const QString &completed_mission_id,
  44. QString *out_error = nullptr) -> bool;
  45. auto ensure_campaign_missions_in_db(
  46. const Game::Campaign::CampaignDefinition &campaign,
  47. QString *out_error = nullptr) -> bool;
  48. private:
  49. auto open(QString *out_error = nullptr) const -> bool;
  50. auto ensure_schema(QString *out_error = nullptr) const -> bool;
  51. auto create_base_schema(QString *out_error = nullptr) const -> bool;
  52. auto migrate_schema(int from_version,
  53. QString *out_error = nullptr) const -> bool;
  54. auto schema_version(QString *out_error = nullptr) const -> int;
  55. auto set_schema_version(int version,
  56. QString *out_error = nullptr) const -> bool;
  57. auto migrate_to_2(QString *out_error = nullptr) const -> bool;
  58. auto migrate_to_3(QString *out_error = nullptr) const -> bool;
  59. auto ensure_campaign_in_db(const Game::Campaign::CampaignDefinition &campaign,
  60. QString *out_error = nullptr) -> bool;
  61. QString m_database_path;
  62. QString m_connection_name;
  63. mutable bool m_initialized = false;
  64. mutable QSqlDatabase m_database;
  65. };
  66. } // namespace Game::Systems