diff --git a/dep/imgui/include/IconsPromptFont.h b/dep/imgui/include/IconsPromptFont.h index d627eee35..3d09e144c 100644 --- a/dep/imgui/include/IconsPromptFont.h +++ b/dep/imgui/include/IconsPromptFont.h @@ -326,3 +326,6 @@ #define ICON_PF_EXIT_QUIT_LEAVE "\xF0\x9F\x9A\xAA" #define ICON_PF_INFORMATION "\xF0\x9F\x9B\x88" #define ICON_PF_SHOPPING_CART "\xF0\x9F\x9B\x92" +#define ICON_PF_ACHIEVEMENTS_PROGRESSION "\xE2\x8E\xB2" +#define ICON_PF_ACHIEVEMENTS_MISSABLE "\xE2\x8E\xB3" +#define ICON_PF_ACHIEVEMENTS_WIN "\xE2\x8E\xB4" diff --git a/scripts/generate_update_fa_glyph_ranges.py b/scripts/generate_update_fa_glyph_ranges.py index f3add874d..fafc5c230 100755 --- a/scripts/generate_update_fa_glyph_ranges.py +++ b/scripts/generate_update_fa_glyph_ranges.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python3 + import code import sys import os diff --git a/src/core/achievements.cpp b/src/core/achievements.cpp index 9eb614580..782d51c66 100644 --- a/src/core/achievements.cpp +++ b/src/core/achievements.cpp @@ -35,6 +35,7 @@ #include "util/state_wrapper.h" #include "IconsFontAwesome5.h" +#include "IconsPromptFont.h" #include "fmt/format.h" #include "imgui.h" #include "imgui_internal.h" @@ -2354,19 +2355,42 @@ void Achievements::DrawAchievement(const rc_client_achievement_t* cheevo) g_medium_font->CalcTextSizeA(g_medium_font->FontSize, FLT_MAX, 0.0f, text.c_str(), text.end_ptr())); const float points_template_start = bb.Max.x - points_template_size.x; const float points_start = points_template_start + ((points_template_size.x - points_size.x) * 0.5f); - const char* lock_text = is_unlocked ? ICON_FA_LOCK_OPEN : ICON_FA_LOCK; - const ImVec2 lock_size(g_large_font->CalcTextSizeA(g_large_font->FontSize, FLT_MAX, 0.0f, lock_text)); + + const char* right_icon_text; + switch (cheevo->type) + { + case RC_CLIENT_ACHIEVEMENT_TYPE_MISSABLE: + right_icon_text = ICON_PF_ACHIEVEMENTS_MISSABLE; // Missable + break; + + case RC_CLIENT_ACHIEVEMENT_TYPE_PROGRESSION: + right_icon_text = ICON_PF_ACHIEVEMENTS_PROGRESSION; // Progression + break; + + case RC_CLIENT_ACHIEVEMENT_TYPE_WIN: + right_icon_text = ICON_PF_ACHIEVEMENTS_WIN; // Win Condition + break; + + // Just use the lock for standard achievements. + case RC_CLIENT_ACHIEVEMENT_TYPE_STANDARD: + default: + right_icon_text = is_unlocked ? ICON_FA_LOCK_OPEN : ICON_FA_LOCK; + break; + } + + const ImVec2 right_icon_size(g_large_font->CalcTextSizeA(g_large_font->FontSize, FLT_MAX, 0.0f, right_icon_text)); const float text_start_x = bb.Min.x + image_size.x + LayoutScale(15.0f); const ImRect title_bb(ImVec2(text_start_x, bb.Min.y), ImVec2(points_start, midpoint)); const ImRect summary_bb(ImVec2(text_start_x, midpoint), ImVec2(points_start, midpoint + g_medium_font->FontSize)); const ImRect points_bb(ImVec2(points_start, midpoint), bb.Max); - const ImRect lock_bb(ImVec2(points_template_start + ((points_template_size.x - lock_size.x) * 0.5f), bb.Min.y), + const ImRect lock_bb(ImVec2(points_template_start + ((points_template_size.x - right_icon_size.x) * 0.5f), bb.Min.y), ImVec2(bb.Max.x, midpoint)); ImGui::PushFont(g_large_font); ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, cheevo->title, nullptr, nullptr, ImVec2(0.0f, 0.0f), &title_bb); - ImGui::RenderTextClipped(lock_bb.Min, lock_bb.Max, lock_text, nullptr, &lock_size, ImVec2(0.0f, 0.0f), &lock_bb); + ImGui::RenderTextClipped(lock_bb.Min, lock_bb.Max, right_icon_text, nullptr, &right_icon_size, ImVec2(0.0f, 0.0f), + &lock_bb); ImGui::PopFont(); ImGui::PushFont(g_medium_font); diff --git a/src/util/imgui_manager.cpp b/src/util/imgui_manager.cpp index 51c4192e6..3dbb45e08 100644 --- a/src/util/imgui_manager.cpp +++ b/src/util/imgui_manager.cpp @@ -555,7 +555,7 @@ ImFont* ImGuiManager::AddFixedFont(float size) bool ImGuiManager::AddIconFonts(float size) { static constexpr ImWchar range_fa[] = { 0xf002,0xf002,0xf005,0xf005,0xf007,0xf007,0xf00c,0xf00e,0xf011,0xf011,0xf013,0xf013,0xf017,0xf017,0xf019,0xf019,0xf01c,0xf01c,0xf021,0xf021,0xf023,0xf023,0xf025,0xf025,0xf027,0xf028,0xf02e,0xf02e,0xf030,0xf030,0xf03a,0xf03a,0xf03d,0xf03d,0xf049,0xf04c,0xf050,0xf050,0xf059,0xf059,0xf05e,0xf05e,0xf062,0xf063,0xf065,0xf065,0xf067,0xf067,0xf071,0xf071,0xf075,0xf075,0xf077,0xf078,0xf07b,0xf07c,0xf084,0xf085,0xf091,0xf091,0xf0a0,0xf0a0,0xf0ac,0xf0ad,0xf0c5,0xf0c5,0xf0c7,0xf0c8,0xf0cb,0xf0cb,0xf0d0,0xf0d0,0xf0dc,0xf0dc,0xf0e2,0xf0e2,0xf0eb,0xf0eb,0xf0f1,0xf0f1,0xf0f3,0xf0f3,0xf0fe,0xf0fe,0xf110,0xf110,0xf119,0xf119,0xf11b,0xf11c,0xf140,0xf140,0xf144,0xf144,0xf14a,0xf14a,0xf15b,0xf15b,0xf15d,0xf15d,0xf188,0xf188,0xf191,0xf192,0xf1ab,0xf1ab,0xf1dd,0xf1de,0xf1e6,0xf1e6,0xf1eb,0xf1eb,0xf1f8,0xf1f8,0xf1fc,0xf1fc,0xf242,0xf242,0xf245,0xf245,0xf26c,0xf26c,0xf279,0xf279,0xf2d0,0xf2d0,0xf2db,0xf2db,0xf2f2,0xf2f2,0xf2f5,0xf2f5,0xf3c1,0xf3c1,0xf410,0xf410,0xf466,0xf466,0xf500,0xf500,0xf51f,0xf51f,0xf545,0xf545,0xf547,0xf548,0xf552,0xf552,0xf57a,0xf57a,0xf5a2,0xf5a2,0xf5aa,0xf5aa,0xf5e7,0xf5e7,0xf65d,0xf65e,0xf6a9,0xf6a9,0xf7c2,0xf7c2,0xf807,0xf807,0xf815,0xf815,0xf818,0xf818,0xf84c,0xf84c,0xf8cc,0xf8cc,0x0,0x0 }; - static constexpr ImWchar range_pf[] = { 0x2196,0x2199,0x219e,0x21a1,0x21b0,0x21b3,0x21ba,0x21c3,0x21c7,0x21ca,0x21d0,0x21d4,0x21dc,0x21dd,0x21e0,0x21e3,0x21ed,0x21ee,0x21f7,0x21f8,0x21fa,0x21fb,0x227a,0x227d,0x23f4,0x23f7,0x2427,0x243a,0x243c,0x243c,0x243e,0x243e,0x2460,0x246b,0x24f5,0x24fd,0x24ff,0x24ff,0x278a,0x278e,0x27fc,0x27fc,0xe001,0xe001,0xff21,0xff3a,0x0,0x0 }; + static constexpr ImWchar range_pf[] = { 0x2196,0x2199,0x219e,0x21a1,0x21b0,0x21b3,0x21ba,0x21c3,0x21c7,0x21ca,0x21d0,0x21d4,0x21dc,0x21dd,0x21e0,0x21e3,0x21ed,0x21ee,0x21f7,0x21f8,0x21fa,0x21fb,0x227a,0x227d,0x23b2,0x23b4,0x23f4,0x23f7,0x2427,0x243a,0x243c,0x243c,0x243e,0x243e,0x2460,0x246b,0x24f5,0x24fd,0x24ff,0x24ff,0x278a,0x278e,0x27fc,0x27fc,0xe001,0xe001,0xff21,0xff3a,0x0,0x0 }; { ImFontConfig cfg;