Skip to content

Commit

Permalink
achievements: leaderboard notifications. detailed toast message
Browse files Browse the repository at this point in the history
Draw achievement notifications using imgui drawlist api
Fixes for insets
Issue #761
  • Loading branch information
flyinghead committed May 7, 2024
1 parent 763d9ce commit f76d05a
Show file tree
Hide file tree
Showing 10 changed files with 229 additions and 79 deletions.
64 changes: 60 additions & 4 deletions core/achievements/achievements.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,12 @@ class Achievements
void handleShowAchievementProgress(const rc_client_event_t *event);
void handleHideAchievementProgress(const rc_client_event_t *event);
void handleUpdateAchievementProgress(const rc_client_event_t *event);
void handleLeaderboardStarted(const rc_client_event_t *event);
void handleLeaderboardFailed(const rc_client_event_t *event);
void handleLeaderboardSubmitted(const rc_client_event_t *event);
void handleShowLeaderboardTracker(const rc_client_event_t *event);
void handleHideLeaderboardTracker(const rc_client_event_t *event);
void handleUpdateLeaderboardTracker(const rc_client_event_t *event);
static void emuEventCallback(Event event, void *arg);

rc_client_t *rc_client = nullptr;
Expand Down Expand Up @@ -506,16 +512,26 @@ void Achievements::clientEventHandler(const rc_client_event_t* event, rc_client_
achievements->handleUpdateAchievementProgress(event);
break;

/*
TODO
case RC_CLIENT_EVENT_LEADERBOARD_STARTED:
achievements->handleLeaderboardStarted(event);
break;
case RC_CLIENT_EVENT_LEADERBOARD_FAILED:
achievements->handleLeaderboardFailed(event);
break;
case RC_CLIENT_EVENT_LEADERBOARD_SUBMITTED:
case RC_CLIENT_EVENT_LEADERBOARD_SCOREBOARD:
achievements->handleLeaderboardSubmitted(event);
break;
case RC_CLIENT_EVENT_LEADERBOARD_TRACKER_SHOW:
achievements->handleShowLeaderboardTracker(event);
break;
case RC_CLIENT_EVENT_LEADERBOARD_TRACKER_HIDE:
achievements->handleHideLeaderboardTracker(event);
break;
case RC_CLIENT_EVENT_LEADERBOARD_TRACKER_UPDATE:
*/
achievements->handleUpdateLeaderboardTracker(event);
break;
// TODO case RC_CLIENT_EVENT_LEADERBOARD_SCOREBOARD:

case RC_CLIENT_EVENT_DISCONNECTED:
notifyError("RetroAchievements disconnected");
break;
Expand Down Expand Up @@ -578,6 +594,46 @@ void Achievements::handleAchievementChallengeIndicatorHideEvent(const rc_client_
}
}

void Achievements::handleLeaderboardStarted(const rc_client_event_t *event)
{
const rc_client_leaderboard_t *leaderboard = event->leaderboard;
INFO_LOG(COMMON, "RA: Leaderboard started: %s", leaderboard->title);
std::string text = "Leaderboard " + std::string(leaderboard->title) + " started";
notifier.notify(Notification::Unlocked, "", text, leaderboard->description);
}
void Achievements::handleLeaderboardFailed(const rc_client_event_t *event)
{
const rc_client_leaderboard_t *leaderboard = event->leaderboard;
INFO_LOG(COMMON, "RA: Leaderboard failed: %s", leaderboard->title);
std::string text = "Leaderboard " + std::string(leaderboard->title) + " failed";
notifier.notify(Notification::Unlocked, "", text, leaderboard->description);
}
void Achievements::handleLeaderboardSubmitted(const rc_client_event_t *event)
{
const rc_client_leaderboard_t *leaderboard = event->leaderboard;
INFO_LOG(COMMON, "RA: Leaderboard submitted: %s", leaderboard->title);
std::string text = "Leaderboard " + std::string(leaderboard->title) + " submitted";
notifier.notify(Notification::Unlocked, "", text, leaderboard->description);
}
void Achievements::handleShowLeaderboardTracker(const rc_client_event_t *event)
{
const rc_client_leaderboard_tracker_t *leaderboard = event->leaderboard_tracker;
DEBUG_LOG(COMMON, "RA: Show leaderboard[%d]: %s", leaderboard->id, leaderboard->display);
notifier.showLeaderboard(leaderboard->id, leaderboard->display);
}
void Achievements::handleHideLeaderboardTracker(const rc_client_event_t *event)
{
const rc_client_leaderboard_tracker_t *leaderboard = event->leaderboard_tracker;
DEBUG_LOG(COMMON, "RA: Hide leaderboard[%d]: %s", leaderboard->id, leaderboard->display);
notifier.hideLeaderboard(leaderboard->id);
}
void Achievements::handleUpdateLeaderboardTracker(const rc_client_event_t *event)
{
const rc_client_leaderboard_tracker_t *leaderboard = event->leaderboard_tracker;
DEBUG_LOG(COMMON, "RA: Update leaderboard[%d]: %s", leaderboard->id, leaderboard->display);
notifier.showLeaderboard(leaderboard->id, leaderboard->display);
}

void Achievements::handleGameCompleted(const rc_client_event_t *event)
{
const rc_client_game_t* game = rc_client_get_game_info(rc_client);
Expand Down
2 changes: 1 addition & 1 deletion core/emulator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -541,7 +541,7 @@ void Emulator::loadGame(const char *path, LoadProgress *progress)
cheatManager.reset(settings.content.gameId);
if (cheatManager.isWidescreen())
{
gui_display_notification("Widescreen cheat activated", 1000);
gui_display_notification("Widescreen cheat activated", 2000);
config::ScreenStretching.override(134); // 4:3 -> 16:9
}
// reload settings so that all settings can be overridden
Expand Down
5 changes: 2 additions & 3 deletions core/hw/naomi/printer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -830,8 +830,7 @@ class ThermalPrinter
std::string s = get_writable_data_path(settings.content.gameId + "-results.png");
bitmapWriter->save(s);
bitmapWriter.reset();
s = "Print out saved to " + s;
gui_display_notification(s.c_str(), 5000);
gui_display_notification("Print out saved", 5000, s.c_str());
NOTICE_LOG(NAOMI, "%s", s.c_str());
}
break;
Expand Down Expand Up @@ -1198,7 +1197,7 @@ std::string get_writable_data_path(const std::string& s)
return "./" + s;
}

void gui_display_notification(char const*, int) {
void gui_display_notification(char const*, int, char const*) {
}

int main(int argc, char *argv[])
Expand Down
8 changes: 4 additions & 4 deletions core/rend/gui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2971,7 +2971,7 @@ static void gui_display_settings()
ImGui::End();
}

void gui_display_notification(const char *msg, int duration)
void gui_display_notification(const char *msg, int duration, const char *details)
{
if (gui_state != GuiState::Closed)
{
Expand All @@ -2980,7 +2980,7 @@ void gui_display_notification(const char *msg, int duration)
osd_message_end = getTimeMs() + duration;
}
else {
toast.show(msg, "", duration);
toast.show(msg, details != nullptr ? details : "", duration);
}
}

Expand Down Expand Up @@ -3465,7 +3465,7 @@ void gui_display_osd()
const ScaledVec2 padding(5.f, 5.f);
const ImVec2 size = largeFont->CalcTextSizeA(largeFont->FontSize, FLT_MAX, maxW, &message.front(), &message.back() + 1)
+ padding * 2.f;
ImVec2 pos(0, ImGui::GetIO().DisplaySize.y - size.y);
ImVec2 pos(insetLeft, ImGui::GetIO().DisplaySize.y - size.y);
constexpr float alpha = 0.7f;
const ImU32 bg_col = alphaOverride(0x00202020, alpha / 2.f);
dl->AddRectFilled(pos, pos + size, bg_col, 0.f);
Expand Down Expand Up @@ -3560,7 +3560,7 @@ void fatal_error(const char* text, ...)
va_end(args);
ERROR_LOG(COMMON, "%s", temp);

gui_display_notification(temp, 2000);
gui_display_notification("Fatal Error", 20000, temp);
}

extern bool subfolders_read;
Expand Down
2 changes: 1 addition & 1 deletion core/rend/gui.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ void gui_init();
void gui_initFonts();
void gui_open_settings();
void gui_display_ui();
void gui_display_notification(const char *msg, int duration);
void gui_display_notification(const char *msg, int duration, const char *details = nullptr);
void gui_display_osd();
void gui_display_profiler();
void gui_open_onboarding();
Expand Down
Loading

0 comments on commit f76d05a

Please sign in to comment.