#include "achievements.hpp" #include "Z2AudioLib/Z2SeMgr.h" #include "dusk/achievements.h" #include "fmt/format.h" #include "m_Do/m_Do_audio.h" #include "nav_types.hpp" #include "pane.hpp" namespace dusk::ui { namespace { struct CategoryInfo { AchievementCategory cat; const char* label; }; constexpr CategoryInfo kCategories[] = { {AchievementCategory::Challenge, "Challenge"}, {AchievementCategory::Collection, "Collection"}, {AchievementCategory::Minigame, "Minigame"}, {AchievementCategory::Misc, "Misc"}, {AchievementCategory::Glitched, "Glitched"}, }; void append_achievement_info(Rml::Element* parent, const Achievement& a) { auto* header = append(parent, "achievement-header"); auto* name = append(header, "achievement-name"); name->SetClass("unlocked", a.unlocked); append_text(name, a.name); auto* badge = append(header, "achievement-badge"); badge->SetClass(a.unlocked ? "unlocked" : "locked", true); append_text(badge, a.unlocked ? "Unlocked" : "Locked"); auto* description = append(parent, "p"); description->SetClass("achievement-desc", true); append_text(description, a.description); if (a.isCounter) { const float fraction = a.goal > 0 ? float(a.progress) / float(a.goal) : 1.0f; auto* progress = append(parent, "progress"); progress->SetAttribute("value", fraction); progress->SetClass(a.unlocked ? "progress-done" : "progress-ongoing", true); append_text( append(parent, "achievement-progress"), fmt::format("{} / {}", a.progress, a.goal)); } } class AchievementRow : public FluentComponent { public: AchievementRow(Rml::Element* parent, const Achievement& a) : FluentComponent(createRowRoot(parent)) { auto& btn = add_child