Commit Graph

78 Commits

Author SHA1 Message Date
LillyJadeKatrin
394af40db5 Improved achievements disabled messaging
Most obviously, there is no longer a warning message to the player in the achievement window that achievements are disabled if a game is not currently running.
2024-02-15 16:33:18 -05:00
Lioncash
db80abbadd AchievementManager: Tidy up GetRichPresence()
This can be a direct return.
2024-02-01 23:03:24 -05:00
Lioncash
c14414a151 AchievementManager: clear name in CloseGame()/LogOut()
A little more idiomatic.
2024-02-01 23:03:24 -05:00
Lioncash
2d8af7b7f8 AchievementManager: Replace memsets where applicable
We can just use brace initialization to zero these out. Smaller to
write and a little quicker to read.
2024-02-01 23:03:24 -05:00
Lioncash
184fe932ed AchievementManager: std::move leaderboard info in FetchBoardInfo()
Avoids churning some allocations.
2024-02-01 23:03:24 -05:00
Lioncash
76c381e6f7 AchievementManager: Ensure update callback is always valid
This way we don't need to do any validity checking aside from the
initial setting of the callback. Also cuts down on line noise.
2024-02-01 23:03:23 -05:00
Lioncash
2b83cc739a AchievementManager: Convert .compare() into equality operators
These perform a default comparison, which is the same as using the
equality operators.
2024-02-01 23:03:23 -05:00
Lioncash
394418b415 AchievementManager: Remove unnecessary .get()
Same behavior, less code.
2024-02-01 23:03:23 -05:00
Lioncash
161efff6c9 AchievementManager: Remove long qualifier
We can remove the long qualifying on some ResponseType instances to
lessen the amount of reading.
2024-02-01 23:03:23 -05:00
LillyJadeKatrin
fd99a5db9a Reverse endianness of achievement memory peeks
rcheevos expects these multi-byte peeks to have the opposite endianness so they need to be swapped before rcheevos gets them.
2024-01-29 11:55:49 -05:00
LillyJadeKatrin
f25bdda728 Removed post data from Achievement request logs
post_data included passwords and API keys in plaintext so continuing to include it in logs is a security liability.
2024-01-27 18:50:27 -05:00
LillyJadeKatrin
03e3f65653 Add host URL setting to achievements config
The Host URL setting in the RetroAchievements config will, if set, be used as the host URL for all server requests for achievements. This allows for an easy switch to the RetroAchievements staging server for testing.
2024-01-24 07:08:54 -05:00
LillyJadeKatrin
aa3e1e2324 Retroachievements - Fixed Login Checks
Two fixes: verify that there's an API token before attempting to automatically log in, and don't attempt to hash a game and load it unless achievements are enabled and the player is logged in. This prevents multiple API requests that we already know will fail, one of which will display an unnecessary error message to the player.
2023-12-13 09:00:25 -05:00
Lioncash
18032f19a5 AchievementManager: Resolve -Wshadow warnings
Renames some variables to avoid shadowing warnings on gcc.

Also gets rid of a FilereaderState struct, since one is already defined
in the declaration of the AchievementManager class.
2023-12-12 15:37:20 -05:00
Lioncash
d90537cc18 AchievementManager: Return by reference from GetLock()
This makes the API a little nicer to use, since you don't need to do
a mandatory dereference when passing the lock into any kind of scope
guard.
2023-12-11 13:51:50 -05:00
Lioncash
e55f9ed102 AchievementManager: Make GetInstance() return a reference
The internal static member will always have a valid lifetime. Makes this
consistent with other instance based objects in our code.
2023-12-11 13:36:39 -05:00
Admiral H. Curtiss
70cd0040a3 AchievementManager: Only nag user about disabled achievements when they were actually enabled before. 2023-12-10 21:10:49 +01:00
LillyJadeKatrin
8fbc5960e7 Handle Achievement Un/Primed Events
When an achievement is "primed", a challenge is active, for example completing a portion of the game in under a time limit or without taking damage or using certain items. This is stored in a map in the Achievement Manager (and removed when the achievement is unprimed) so a later commit can display it on screen.
2023-12-06 08:21:06 -05:00
LillyJadeKatrin
ebf2ef1d82 Refactored hash process to check prior game ID
If the new game ID is a different title than the previous game ID, the achievement manager is compromised.
2023-12-05 16:17:18 -05:00
LillyJadeKatrin
c8d8ca2ff7 Added Disabled flag to Achievement Manager
The Disabled state sits between Game Closed and completely Shutdown - stronger than the former, as it refuses to let a game be opened again until AchievementManager is restored (which only happens upon a fresh core boot) but it isn't completely shut down and will still allow the player to be logged in and access the achievement settings and their (global) achievement header.
2023-12-05 16:17:17 -05:00
LillyJadeKatrin
148c2f3c0d Refactored AchievementManager hash code to take a volume.
This change splits LoadGameAsync into three methods: two HashGame methods to accept either a string filepath or a volume, and a common LoadGameSync that both HashGames call to actually process the code. In the process, some minor cleanup, and the hash resolution now takes place on the work queue asynchronously.
2023-12-05 16:17:11 -05:00
LillyJadeKatrin
138e68ef9f Added Hardcore flag to Achievement Settings
Hardcore Mode is a RetroAchievements feature for enabling as close to original hardware as possible, to keep a fair, challenging, and competitive playing field for achievements (which get tallied differently and emphasized more in hardcore) and leaderboards (where it is mandatory) at the cost of several common emulator features that provide advantages, such as state loading and slower emulation speeds.
This commit just adds the flag to the AchievementSettings, with more to come.
2023-12-02 16:41:15 -05:00
LillyJadeKatrin
db78437498 Refactored welcome message to render after game start
Split the "welcome" messages letting players know achievements are active into a separate method that gets called (currently) after a number of frames to ensure that the emulator has started properly and has somewhere to display the messages.
2023-10-19 19:21:12 +02:00
LillyJadeKatrin
a3d561fdff Add badges to achievement messages
Updated OSD::AddMessage calls for achievements and game start to pass in the badges intended to be shown.
2023-10-19 19:13:20 +02:00
LillyJadeKatrin
04df930e0d Added FetchBoardInfo to AchievementManager
FetchBoardInfo is called (via the work queue asynchronously) on a leaderboard every time it is activated or submitted to. It makes two calls to the RetroAchievements API for fetching leaderboard info, one that requests the top four entries in the leaderboard and another that requests the player's entry, the two entries above the player and the two entries below. All of these are inserted into a single map (resolving any overlaps) so the result can be exposed to the UI.
2023-10-15 21:28:40 +02:00
LillyJadeKatrin
61dded7043 Added Leaderboard info map to AchievementManager
The leaderboard map created here contains information useful to displaying leaderboard stats in the Achievement dialog, including each leaderboard's name and description and a partial list of entries for display. The entire map is exposed to the UI in a single call for simplicity.
2023-10-15 21:28:40 +02:00
Admiral H. Curtiss
1645b1ed62 AchievementManager: Call ActivateDeactivateLeaderboards() and ActivateDeactivateRichPresence() under lock.
Both of these functions access `m_game_data` and don't lock themselves, so they must be called in a way that guarantees that `m_game_data` is not modified during the call.
2023-10-15 18:59:36 +02:00
Admiral H. Curtiss
111c1ab531 AchievementManager: Don't store pointer to rc_runtime_event_t in lambda.
Scope issue in the event callback from `rc_runtime_do_frame()`. The pointer points to a variable on the stack from inside `rc_runtime_do_frame()`, so that's a race condition between the thread calling `rc_runtime_do_frame()` and the event queue thread.
2023-10-11 10:32:11 +02:00
Admiral H. Curtiss
da6339a722 Merge pull request #12026 from LillyJadeKatrin/retroachievements-measured
RetroAchievements - Progress Notifications
2023-10-01 19:25:02 +02:00
LillyJadeKatrin
6d96b7173e Handle Achievement Progress Event
Added handling to Achievement Progress Events, which are generated when an achievement with a Measured field updates in value. For example, an achievement for collecting 120 stars will throw this event when the player collects each star, and with this handling, the player will get a message on screen informing them of this progress. This message will only appear if the newly added RA_PROGRESS_ENABLED setting is true.
2023-10-01 11:24:48 -04:00
LillyJadeKatrin
c8b1379113 Added error checking and logging to AchievementManager::GetAchievementProgress. 2023-10-01 10:27:57 -04:00
LillyJadeKatrin
ba83efded6 Added badges to achievement progress tab
Provided the badges are turned on in the settings, each achievement will have a badge next to it on the progress tab. There are different badges for locked and unlocked (usually locked is grayscale while unlocked is in color but not necessarily) and the badge chosen depends on the player's current unlock and hardcore status.
2023-09-30 23:29:02 -04:00
LillyJadeKatrin
fd50b1fda6 Added FetchBadges to AchievementManager
FetchBadges fetches all available badges (player, game, achievements) and stores them in AchievementManager's memory. New fields and accessors have been added as necessary. Badges for individual achievements are stored in the UnlockStatus map. The method is public so that the settings dialog can call it if badges are turned on after a game is started. Badges are deleted at game close and logout.
2023-09-30 14:18:15 -04:00
LillyJadeKatrin
6541aa206d Added RequestImage to AchievementManager
Image requests from RetroAchievements have a slightly different format from other requests, on account of being GET calls that return strings of image data, so this is a separate function that makes such calls. To handle this, I create a BadgeStatus object that ties each badge to a boolean flag for whether it is loaded and thus usable.
2023-09-28 22:47:15 -04:00
LillyJadeKatrin
50f04ea456 Refactored FetchGameData to incorporate the request directly instead of a different method, so that game_data can be processed directly under a lock. 2023-09-28 00:57:22 -04:00
LillyJadeKatrin
6036a6db55 Updated AchievementManager StartRASession to properly lock inputs and outputs without locking during the network call. 2023-09-28 00:55:58 -04:00
LillyJadeKatrin
7153284e9f Updated AchievementManager ResolveHash to properly lock inputs and outputs without locking during the network call. 2023-09-28 00:55:58 -04:00
LillyJadeKatrin
a29ec7d956 Updated AchievementManager VerifyCredentials to properly lock inputs and outputs without locking during the network call. 2023-09-28 00:55:58 -04:00
LillyJadeKatrin
b53962fd23 Cleaned up some issues with AchievementManager::CloseGame. 2023-09-28 00:55:57 -04:00
LillyJadeKatrin
da00191eb6 Added log statements across AchievementManager. 2023-09-23 01:32:43 -04:00
LillyJadeKatrin
38bd04c439 Add Rich Presence to Achievement Dialog Header
This refactors the Rich Presence generation to store to a member field that can be exposed to the UI to display the Rich Presence in the achievement header. It still updates at its original rate of once per two minutes, but calls an update on the dialog when that ticks.
2023-09-06 10:01:33 -04:00
LillyJadeKatrin
7a7e0ab2f5 Fixed Leaderboard Scored message format
Refactored the message displayed when a leaderboard is submitted to so that it properly generates and uses a FormattedValue.
2023-07-21 01:45:50 -04:00
LillyJadeKatrin
ccc9d0e5ea Synchronized Achievement Window
Expanded the use of the lock mutex already used for loading the player's existing unlock status to guard against races involving the Achievements dialog window reading from data AchievementManager might be in the process of updating. The lock has been exposed publicly and the AchievementsWindow uses it in its UpdateData method, and anywhere else that might modify data used to render that window has also been wrapped with it.
2023-07-01 22:26:30 -04:00
LillyJadeKatrin
fbaeaf305b Add UpdateCallback to AchievementManager
AchievementManager now has a SetUpdateCallback method for providing a single universal callback for anytime something important changes in the achievement state, such as logging in/out, game load/close, or events such as achievement unlocks. AchievementsWindow sets this callback in its own init to its UpdateData method so that the AchievementsWindow gets updated when one of these changes takes place.
2023-07-01 22:26:29 -04:00
LillyJadeKatrin
f700faf6ab Expose Achievements Data for Display
Added some small methods to AchievementManager to expose useful data for displaying in an achievement UI. Also moved a couple things from private to public for the same purpose.
2023-07-01 22:26:29 -04:00
LillyJadeKatrin
32f7873ee6 Added missing Leaderboard Canceled event 2023-06-03 09:15:41 -04:00
LillyJadeKatrin
60350635b6 Fixed Rich Presence bugs
Refactored the Rich Presence two-minute trigger to clean it up and fix it.
2023-06-03 09:15:40 -04:00
LillyJadeKatrin
82ff6fb0b7 Fix RetroAchievements Login Crash
Fixing a bug with the RetroAchievements integration where certain combinations of configurations would result in a malformed API request and an attempt to dereference the null response.
2023-05-28 20:53:03 -04:00
LillyJadeKatrin
57290a45e8 Added Notification Popups for Game Mastery
Added OnScreenDisplay messages to HandleAchievementTriggeredEvent to display an extra congratulations message if the player has completed (unlocked all achievements in casual) or mastered (unlocked all achievements in challenge) the game. This also uses the display name retrieved when verifying credentials, which has now been added as a member field on AchievementManager.
2023-05-23 23:23:18 -04:00
LillyJadeKatrin
1841089054 Added Notification Popups for Game Start
Added an OnScreenDisplay message to LoadGameByFilenameAsync to display a message when a player starts a game with achievements, notifying them of their current score. The score displayed is challenge points if the player is in challenge mode or challenge + casual if the player is in casual mode. A second message tells the player which mode they are in. To match RetroAchievements' website interface, the messages are blue for casual and gold for challenge.
2023-05-23 23:22:22 -04:00