67 lines
1.9 KiB
C++
67 lines
1.9 KiB
C++
#pragma once
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
#include <unordered_map>
|
|
|
|
#include <tinyxml2.h>
|
|
|
|
#include "constants.h"
|
|
|
|
namespace cursebreaker {
|
|
|
|
struct AchievementRequirement
|
|
{
|
|
ActionType action{};
|
|
uint16_t targetId{}; // e.g., item id, npc id, etc.
|
|
uint16_t count{};
|
|
std::string description;
|
|
};
|
|
|
|
struct Achievement
|
|
{
|
|
uint16_t id{};
|
|
uint16_t points{};
|
|
uint16_t category{};
|
|
|
|
std::string name;
|
|
std::string description;
|
|
std::string icon;
|
|
|
|
std::vector<AchievementRequirement> requirements;
|
|
|
|
Achievement() = default;
|
|
};
|
|
|
|
// Achievements configuration manager
|
|
class AchievementsConfig {
|
|
public:
|
|
static AchievementsConfig& getInstance() {
|
|
static AchievementsConfig instance;
|
|
return instance;
|
|
}
|
|
|
|
bool loadFromXML(const std::string& filepath);
|
|
const Achievement* getAchievementById(int id) const;
|
|
const std::unordered_map<int, Achievement>& getAllAchievements() const { return m_achievements; }
|
|
|
|
private:
|
|
AchievementsConfig() = default;
|
|
~AchievementsConfig() = default;
|
|
AchievementsConfig(const AchievementsConfig&) = delete;
|
|
AchievementsConfig& operator=(const AchievementsConfig&) = delete;
|
|
|
|
std::unordered_map<int, Achievement> m_achievements;
|
|
|
|
// Helper methods for parsing
|
|
void parseAchievement(tinyxml2::XMLElement* achievementElement);
|
|
void parseRequirements(tinyxml2::XMLElement* achievementElement, Achievement& achievement);
|
|
std::string getAttributeValue(tinyxml2::XMLElement* element, const char* attribute, const std::string& defaultValue = "");
|
|
int getAttributeValueInt(tinyxml2::XMLElement* element, const char* attribute, int defaultValue = 0);
|
|
bool getAttributeValueBool(tinyxml2::XMLElement* element, const char* attribute, bool defaultValue = false);
|
|
};
|
|
|
|
// Helper functions for enum conversions
|
|
ActionType stringToActionType(const std::string& str);
|
|
|
|
} // namespace cursebreaker
|