Commit Graph
100 Commits
Author SHA1 Message Date
LillyJadeKatrin 44af48a11f Add Messages for Challenges
Starting or ending a challenge now displays a popup naming and describing the challenge along with the active icon.
2024-07-01 06:56:59 -04:00
LillyJadeKatrin de7bf2b6a5 Move achievement dialog scrollbars to top when changing games 2024-06-29 07:02:17 -04:00
LillyJadeKatrin 0615db9e2e Made progress bars more legible in dark mode 2024-06-29 07:02:17 -04:00
LillyJadeKatrin 56e1c23413 Fixed floating overlapping leaderboard bucket headers 2024-06-29 07:02:17 -04:00
LillyJadeKatrin 7ffcde3ab3 Fixed misaligned borders on unlocked achievement badges 2024-06-26 22:41:39 -04:00
LillyJadeKatrin 16e868b46a Removed large empty space at the bottom of achievement/leaderboard lists 2024-06-26 22:41:11 -04:00
LillyJadeKatrin 1a33e28452 Update Achievement Sort and Progress on RP
Whenever a request to update the Rich Presence comes in, typically every ten seconds, the Achievement Progress Widget will update the sort order of the achievements and all of their measured values.
2024-06-25 23:05:56 -04:00
LillyJadeKatrin bf230a9909 Trim extra characters from measured progress
The measured_progress C string for achievements to display potentially contains junk data after the null terminator, which was rendering in the QString in the dialog. This trims those junk characters.
2024-06-22 23:36:06 -04:00
LillyJadeKatrin aa393dfb6e Add MemoryVerifier to AchievementManager Startup
rc_client calls the provided memory peeker asynchronously in the callback for starting a session, to validate/invalidate the memory used for achievements. Dolphin cannot access memory from any thread but host or CPU so this access has a small chance of being invalid. This commit adds a MemoryVerifier that the AchievementManager will use to perform this, before changing the peek method back to the original MemoryPeeker for normal operation.
2024-06-22 09:31:00 -04:00
LillyJadeKatrin e1a8dc65ce Fix cut off text in Achievements dialog 2024-06-22 00:26:52 -04:00
LillyJadeKatrin d50407d800 Make achievement progress text label transparent
This field was completely hiding the progress bar in dark mode without this.
2024-06-21 07:17:05 -04:00
LillyJadeKatrin 9b9e6c4582 Refactored AchievementProgress UpdateData to Re-Sort
When AchievementProgress::UpdateData(false) is called, it will now empty itself and reinsert all existing boxes, re-sorted into their current buckets, and call UpdateProgress on them all.
2024-06-20 09:03:30 -04:00
LillyJadeKatrin 29f1b82f5e Decouple Hardcore from EmulationStateChanged
Rerendering the entire Achievements dialog every EmulationStateChanged signal is far too often when it turns out that signal fires multiple times to confirm game close, for example. This change results in only the settings changing on EmulationStateChanged, and having the Hardcore mode toggle (which DOES require redrawing the entire dialog) emit its own signal alongside EmulationStateChanged.
2024-06-20 07:59:59 -04:00
LillyJadeKatrin 75c2360aea Split AchievementBox UpdateData
AchievementBox now has UpdateData and UpdateProgress, which is called from UpdateData, but may be called elsewhere to update just the progress measurement of the achievement.
2024-06-19 22:12:30 -04:00
LillyJadeKatrin 45563a872c Scale challenge icons based on screen height 2024-06-19 13:59:59 -04:00
LillyJadeKatrin b0fb6ffff3 Update rcheevos submodule to newest master 2024-06-18 08:42:21 -04:00
LillyJadeKatrin 6b3a9a0bcd Add Sorting to Achievements Dialog
rc_client provides basic sorting buckets as a possible option when retrieving the list of achievements or leaderboards; this enables them and labels them in the dialog.
2024-06-18 08:20:04 -04:00
LillyJadeKatrin ff25403e0e Disable GDB Stub in Hardcore Mode 2024-06-17 01:07:43 -04:00
LillyJadeKatrin 9e1f5ed4b5 Stack Challenge Icons Horizontally 2024-06-15 22:42:40 -04:00
LillyJadeKatrin a79f428972 Fix margins on icon-only messages
Messages with an icon and no text (such as in the game start sequence) had an oversized margin due to ImGui adding padding for an empty string.
2024-06-15 22:42:35 -04:00
LillyJadeKatrin 1b00b4e3d8 OSD messages display horizontally
OSD messages with an icon and text will display the text to the right of the icon instead of below it.
2024-06-15 22:30:39 -04:00
LillyJadeKatrin e1ed19d48a Add word wrap to Achievement Dialog text 2024-06-15 11:38:13 -04:00
LillyJadeKatrin cee3d9126b Added missing dialog updates to achievement events
Now should properly update the Achievements dialog whenever the displayed state of an achievement/leaderboard changes.
2024-06-15 07:56:21 -04:00
LillyJadeKatrin 3d5a1f7d33 Refactored Challenge Icons to handle icon updates
If an icon is displayed on screen before it downloads, it was displaying a default icon but it would fail to load the actual icon even after it was downloaded. This fixes that.
2024-06-15 07:36:49 -04:00
LillyJadeKatrin cb05ed29fe Only Display One Progress At A Time
Add a two second timer to Achievement Progress Indicators to wait until two seconds after the previous message (when it should have decayed out automatically) before posting any new ones.
2024-06-14 23:02:14 -04:00
LillyJadeKatrin 7eec723f3f Hide Challenge Icons when OSD Messages Disabled 2024-06-14 00:19:45 -04:00
LillyJadeKatrin fe517ad2c6 Remove Extra Speed Limit Message
Prior to this change, attempting to decrease the speed limit below 100% in hardmode would display the new attempted speed and then warn that the speed can not be decreased below 100%; this disables that first message under those conditions.
2024-06-12 06:39:46 -04:00
LillyJadeKatrin 12467ffcfa Improved Achievement Progress Label
Label now appears atop the progress bar and reports the progress as the formatted text returned by rcheevos instead of a simple percentage.
2024-06-12 06:25:26 -04:00
LillyJadeKatrin d18dc1785d Release Achievement Manager Loaded Volume
AchievementManager maintains a unique pointer to a copy of the current volume so it can asynchronously hash that volume. It is not needed otherwise, so I can release that pointer when hashing is complete. This change fixes a bug whereby changing discs in a game and then changing to a different game would result in the loaded volume pointer still being loaded with and hashing to the previous game.
2024-06-11 23:35:28 -04:00
LillyJadeKatrin 9499e14209 Add user agent to headers for all RetroAchievements server calls
Requested agent syntax is "Dolphin/5.0-23456"
2024-06-03 00:24:43 -04:00
LillyJadeKatrin 8e33a5778e Properly reset Discord presence after game close
Also fixed an Achievement log that was reporting even when achievements were disabled.
2024-05-27 17:52:13 -04:00
LillyJadeKatrin 1e9e0cd2d7 Remove names from badge objects
The names attached to the BadgeStatus object are obsolete and unneeded and are removed from everything that uses them. All BadgeStatus references are updated to just Badge.
2024-05-23 21:29:23 +02:00
LillyJadeKatrin 3b61b6d816 Add Default Achievement Badges
The defaults get loaded in by Dolphin at emulator start, and are used if the badge that would normally be displayed has not for whatever reason been downloaded yet. Badges attached to this PR are placeholders (MayIMilae is designing permanent badges) and reside in Sys\Load\RetroAchievements.
2024-05-23 21:29:15 +02:00
LillyJadeKatrin dc8f3f6eae Refactored Achievement Badges into Texture Layers
Achievement badges/icons are refactored into the type CustomTextureData::ArraySlice::Level as that is the data type images loaded from the filesystem will be. This includes everything that uses the badges in the Qt UI and OnScreenDisplay, and similarly removes the OSD::Icon type because Level already contains that information.
2024-05-23 10:41:45 -04:00
LillyJadeKatrin 75465f00cc Remove Badges Enabled option from Achievements
Was informed by the RetroAchievements team that this isn't an option in most emulators, and as the next commits will be to enable default icons, there will always be something to display.
2024-05-23 10:40:08 -04:00
LillyJadeKatrin 2328539a76 Add Discord Presence setting to Achievement Settings dialog
Setting is only enabled when Rich Presence is enabled. Toggling either Rich Presence or Discord Presence will immediately update the Discord status.
2024-05-08 07:08:31 -04:00
LillyJadeKatrin 57c8ea12ed Send Rich Presence to Discord
If Rich Presence and Discord Presence are enabled in Achievement Settings, the string generated by rcheevos as the player's current Rich Presence will be sent to the Status field in the Discord Presence object. This will be updated whenever Rich Presence updates.
2024-05-08 00:33:33 -04:00
LillyJadeKatrin 5768d82662 Add Discord Presence flag to Achievement Settings
When enabled, this will send Rich Presence to Discord to be displayed in players' statuses.
2024-05-08 00:28:55 -04:00
LillyJadeKatrin 91764fd28f Retooled Achievements Welcome Message
The "welcome message" that shows up to players when a game starts up and Achievements are active will now either tell the player upon load that there's no support for achievements, or will wait until the first attempt to load the game's badge either succeeds or fails and then display a full message with title and progress and status. This is in part facilitated by a boolean field for when to display a welcome message, set to true upon loading and to false upon a message being displayed.
2024-05-04 11:29:41 -04:00
LillyJadeKatrin 42ca39c6fe Hide Achievement Dialog Header When Disabled
If achievements were disabled but a player token is in settings, prior to this change the Achievement Manager dialog would show a box with no player name and score zero, which is unnecessary.
2024-05-03 21:35:01 -04:00
LillyJadeKatrin fc64b43fae Fix possible memory leak in an Achievement Manager callback 2024-05-03 00:11:38 -04:00
LillyJadeKatrin ad969dfc0d Disabled Hardcore Mode when Achievements disabled
Bugfix for hardcore-disabled items being disabled when hardcore was true but achievement integration was false, which should mean hardcore is effectively disabled. Now everything checks the IsHardcoreModeActive method in AchievementManager which processes the setting AND the game state to determine if hardcore mode is actually active.
2024-05-02 04:44:52 -04:00
LillyJadeKatrin d8ef3ee6c5 Add Spectator Mode to achievement settings
Spectator Mode is a new mode added by rc_client that allows for achievement and leaderboard functionality, but does not submit this data to the site, partially allowing for offline achievements. It effectively replaces the former settings for disabling achievements, leaderboards, and RP, which are now always active internally as long as the client is active.
2024-05-01 07:04:32 -04:00
LillyJadeKatrin fd0de1b01f Updated Unofficial and Encore settings to use rc_client
These settings now only are applied at game start and their tooltips have been updated to reflect this.
2024-05-01 07:04:32 -04:00
LillyJadeKatrin 0883aa114e Update hardcore toggle to use rc_client
The client can take care of itself and handle its own hardcore status when it toggles, so I can tell the settings widget to contact the manager directly to set it.
Also, gradually reorganizing the settings dialog over the next handful of commits.
2024-05-01 07:04:32 -04:00
LillyJadeKatrin 9a40ec06b5 Remove Achievements/Leaderboards/RP Enabled settings
The RetroAchievements client object now handles these three settings as a singular "spectator" mode that will be added in a future commit.
2024-05-01 07:04:32 -04:00
LillyJadeKatrin 3bf5b8e610 Handle Reset and Server Error client events. 2024-05-01 07:04:32 -04:00
LillyJadeKatrin b05028da1f Added Change Media client functionality to AchievementMananger
The client can handle media changes natively so disabling can take place internally. This code uses the same external calls to load data, but will call either BeginLoad or BeginChangeMedia based on whether any media is already loaded.
Due to the client's handling of media changes (it simply disables hardcore if an unknown media is detected) the existing functionality for "disabling" the achievements is no longer necessary and can be deleted.
2024-05-01 07:04:32 -04:00
LillyJadeKatrin 878e6e847b Update Achievement Dialog Header to use rc_client
Two portions of this need updating.
Anything related to points and unlock counts and scoring uses game_summary now instead of the TallyScore method. Unfortunately this comes with the drawback that I cannot easily at this time access the number of points/unlocks from the other hardcore mode, so things like the second progress bar have been deleted.
Rich presence, which no longer needs to be stored, but can be calculated at request. As the AchievementHeader can now update just the Rich Presence, DoFrame can now simply call a header update with .rp=true and the current Rich Presence will be calculated immediately.
As the two items above are the last remaining things to use a number of the components in AchievementManager, this also deletes: Request V1 (V2 is renamed accordingly), ResponseType, PointSpread, TallyScore, UnlockStatus, and the RP generation and ping methods.
2024-05-01 07:04:32 -04:00
LillyJadeKatrin 4214c301ef Refactor AchievementsWindow::UpdateData to take a partial update parameter
UpdateData in AchievementsWindow now only updates the components being requested, massively improving the window's performance. The parameter is UpdatedItems in AchievementManager, which tracks which portions of the system have been updated for every update callback.
2024-05-01 07:04:32 -04:00
LillyJadeKatrin fa2210f80d Refactor leaderboard entry calls to use rc_client
Leaderboard entry calls are asyncronous and use a callback. Logic remains the same, but the callback populates the list that the UI grabs values from.
2024-05-01 06:43:20 -04:00
LillyJadeKatrin c57be0efca Refactor Leaderboard widget to allow partial updates
Similarly to the Progress widget (though without the separate object for each box, because each Leaderboard unit is just three text fields stacked vertically), AchievementLeaderboardWidget.UpdateData will now accept three options: destroy all and rebuild, update all, or update a set of rows.

As part of this, AchievementManager::GetLeaderboardsInfo has been refactored to GetLeaderboardInfo to return a single leaderboard for the ID passed in.
2024-05-01 06:43:20 -04:00
LillyJadeKatrin d2069e888d Refactored AchievementProgressWidget to maintain AchievementBox list
AchievementProgressWidget maintains in memory a map of AchievementBox pointers so that UpdateData can operate on them individually. UpdateData is overhauled for three options: UpdateData(true) will destroy the entire list and re-create it from scratch as before, to be used if the game or player changes/closes/logs out. UpdateData(false) will loop through the map and call UpdateData on every achievement box, to be used for certain settings changes such as enabling badges or disabling hardcore mode. UpdateData(set<IDs>) will call UpdateData on only the IDs in the set, to be used when achievements are unlocked.
2024-05-01 06:43:20 -04:00
LillyJadeKatrin 3793d723b9 Created AchievementBox Qt object
AchievementBox is an extension of QGroupBox that contains the data for a single achievement, initialized with the achievement data and able to reference AchievementManager to update itself.
2024-05-01 06:43:20 -04:00
LillyJadeKatrin 0627209131 Add DoState to AchievementManager
While state loading is not allowed in the hardcore mode that most players will use, it is allowed in softcore mode; more importantly, if something fails to unlock or unlocks when it shouldn't in either mode the player can create a save that retains the current achievement state.
2024-05-01 06:43:20 -04:00
LillyJadeKatrin 70116b222d Handle Game Completed Client Event 2024-05-01 06:43:20 -04:00
LillyJadeKatrin 6b5b7cbd7c Handle Achievement Progress Client Events
This is not a 1 to 1 relationship with how the events look primarily because currently achievement
progress messages are in OnScreenDisplay, which currently vanishes messages automatically.
As this covers the last remaining runtime-based event from the old event handler, that handler has been deleted and the new event handler has been renamed to take its place.
2024-05-01 06:43:19 -04:00
LillyJadeKatrin a70733f74f Handle Achievement Challenge Indicator Show/Hide Client Events
Also deletes the corresponding runtime-based events from the old event handler.
2024-05-01 06:43:19 -04:00
LillyJadeKatrin 7895b739ee Display active leaderboard data on screen
Up to four leaderboards are displayed in a window in the bottom right of the screen (vertically above challenge icons, if there are any). As per RetroAchievements standards, the markers only display the current leaderboard values with no further context necessary.
2024-05-01 06:43:19 -04:00
LillyJadeKatrin 6f3a608e92 Add active leaderboard tracker to achievement manager
The active leaderboard data (leaderboards currently being attempted, which get displayed on screen) is now tracked. When a leaderboard is started its value is added to a vector (sorted by start frame). There are a separate set of client events specifically to handle leaderboard trackers, that are used to populate and manage this vector. The top portion of this vector (by RetroAchievement standards, the first four items) is exposed to be displayed on screen.
2024-05-01 06:43:19 -04:00
LillyJadeKatrin eee77ec6b7 Handle Leaderboard Submitted/Started/Failed Client Events
Also deletes the corresponding runtime-based events from the old event handler.
2024-05-01 06:43:19 -04:00
LillyJadeKatrin bc3e429dd9 Handle Achievement Triggered Client Event
Also deletes the old runtime-based Achievement Triggered event from the old handler, and the methods used by it to publish to the server and reactivate/deactivate achievements in the runtime.
2024-05-01 06:43:19 -04:00
LillyJadeKatrin c88d4cf040 Created EventHandlerV2 and added client to DoFrame
As MemoryPeeker V1 is no longer in use, it is deleted and MemoryPeekerV2 is renamed in its place.
2024-05-01 06:43:19 -04:00
LillyJadeKatrin 7497df99df Refactored Welcome Message to use rc_client
Restructured the welcome message to use the information in rc_client, particularly the summary. Redesigned the message in the process to look cleaner.
2024-05-01 06:43:19 -04:00
LillyJadeKatrin c5bb1c4e68 Retooled achievement badge fetch process
This change was primarily made to refactor the badge fetching to use the client instead of the runtime, but in the process I also refactored the code to cut down on complexity and duplication. Now the FetchBadge method is passed a function that generates the badge name; this is used to ensure that once the badge is loaded that it is still the desired badge to avoid race conditions.
2024-05-01 06:43:19 -04:00
LillyJadeKatrin 7b835a20ca Updated GetGameDisplayName to use rc_client 2024-05-01 06:43:19 -04:00
LillyJadeKatrin 486a9d2318 Refactored Achievement Mananger to load games through rc_client
HashGame has become LoadGame, similar structure with the file loaders but using the client instead. LoadGameCallback has been created to handle the results. The old LoadGameSync has been deleted as have
several hash and load methods that it called.
2024-05-01 06:43:19 -04:00
LillyJadeKatrin 355b892621 Get display name and score from client
Delete m_display_name and m_player_score fields and retrieve those values directly from the client's user information.
2024-05-01 06:43:18 -04:00
LillyJadeKatrin 3bf8b5fb90 Refactored Achievement Manager Login to use rc_client
LoginCallback was created to handle the results of the asynchronous client login calls; VerifyCredentials was deleted as no longer necessary.
2024-05-01 06:43:18 -04:00
LillyJadeKatrin 7b3fac18cd Remove synchronous achievement login
Deletes AchievementManager::Login, renames LoginAsync to Login, and replaces the one synchronous call in the AchievementSettingsWidget with the async call. There is a minor usability regression in that the UI currently does not notify the user when a login has failed; this will be addressed in a later change (possibly in a different PR).
2024-05-01 06:43:18 -04:00
LillyJadeKatrin ba519e4670 Add rc_client to AchievementManager
Also includes init and shutdown V2s.
2024-05-01 06:43:18 -04:00
LillyJadeKatrin 4ec662bcdf Add rc_client MemoryPeekerV2 to AchievementManager
Has a more traditional read-x-bytes structure; for passing into rc_client in the constructor.
2024-05-01 06:43:18 -04:00
LillyJadeKatrin 05136ee099 Add rc_client RequestV2 to AchievementManager
RequestV2 is to be passed into rc_client upon construction so rc_client can handle server calls internally.
2024-05-01 06:43:18 -04:00
LillyJadeKatrin 225a6da074 Update rcheevos submodule to newest master. 2024-04-03 15:03:36 -04:00
LillyJadeKatrin 08ecefe0f7 Added locks to achievement runtime calls
Testing found that spamming toggles for Enable Leaderboards etc risked leaderboards being deleted while the runtime was in the process of recalculating them; this should clear up those conflicts.
2024-03-14 14:32:47 -04:00
LillyJadeKatrin 5418e89523 Adjusted achievement progress updates to duration short 2024-03-08 23:26:56 -05:00
LillyJadeKatrin 085c17aed4 Remove the update callback on all events
Not only was the extra call to the update callback in the AchievementEventHandler method unnecessary, it was getting called on events that don't even need to be tracked here, causing a lot of lag when it turned out one achievement was repeatedly spamming Achievement Reset Events as a shortcut.
2024-03-04 20:04:08 -05:00
LillyJadeKatrin a2db33b6f1 Update rcheevos submodule to master 2024-03-03 17:55:47 -05:00
LillyJadeKatrin f556f646a2 Don't Publish Unofficial Achievements
Check an achievement's category and only request RetroAchievements to award if it is CORE and not UNOFFICIAL.
2024-03-03 12:58:20 -05:00
LillyJadeKatrin 56b82e764c Clear active challenges when game closes
Failing to do this was causing challenge icons to carry over into the next game if a game was closed while the icons were active, even if the next game to run was a completely different game entirely with completely different badges.
2024-02-26 22:21:05 -05:00
LillyJadeKatrin d66b96b1c0 Properly enable RetroAchievements hardcore mode
RetroAchievements plans to use the user_agent in unlock requests to determine which software version was used to play the game, and can filter older software versions out. As such, I have been given the go-ahead to remove the hardcoded line that forces hardcore to always be false.
2024-02-20 12:59:01 -05:00
LillyJadeKatrin e5b73fec08 Fixes to Achievement points count/mastery
Two minor updates to improve the Achievement Manager's handling of a player's completion rate.
One, UnlockStatus and the unlock map now track achievement category, such that TallyScore does not count unofficial achievements in counts/points.
Two, the determinations for mastery/completion are now improved to check (1) that the achievement triggering this is CORE (not UNOFFICIAL) and (2) that it has not already been unlocked at this level on the site, which should be sufficient to determine that the unlocking of this particular achievement completes/masters the game.
2024-02-18 19:27:18 -05:00
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
LillyJadeKatrin 1ed7b35710 Retain Save State Folder
Adds a setting field under the hood to retain which folder the player last saved/loaded a state to/from, so that the dialog box to select a state to save/load reopens at that folder.
2024-02-05 19:44:09 -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
LillyJadeKatrin e992225b88 Bugfix - small square in bottom right corner
Fixed a bug in OSUI created by the challenge icons that caused a small rectangle to appear in the bottom right corner of the screen.
2023-12-08 00:33:29 -05:00
LillyJadeKatrin caa729f84a Display Active Challenges On Screen
The active challenges, aka the primed achievements, are displayed on screen as a series of icons in the bottom right corner of the screen via OnScreenUI.
2023-12-07 16:02:15 -05: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 2bf6ebcb90 Added achievement hash to non-disc boot paths. 2023-12-05 16:17:18 -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 2cb14edafa Add Hardcore switch to Achievement Settings dialog
This adds the actual switch to turn on Hardcore Mode to the settings tab of the Achievements dialog. It is accompanied by a large tooltip warning explaining what it does and when it can be enabled.
The switch is only enabled to be turned on when no game is running, so that games are started in hardcore mode and can only be loaded via the console's memory card, as in the original hardware. Hardcore may be turned off while a game is running, but cannot be turned back on until the game is disabled.
The toggle trigger for hardcore mode also automatically disables the settings that are not allowed during hardcore mode.
Finally, the original flag in AchievementSettingsWidget to set whether things are enabled in hardcore mode (primarily Leaderboards) is replaced with the actual Hardcore Mode setting.
2023-12-02 16:41:17 -05:00
LillyJadeKatrin 6f7e02e201 Disable TAS recording playback in hardcore mode
Play Input Recording would potentially unlock achievements without any player input and needs to be disabled. If a recording is already playing, hardcore mode cannot be enabled.
2023-12-02 16:41:17 -05:00
LillyJadeKatrin 3aebbbb3e7 Disable cheats in hardcore mode
RetroAchievements does not allow cheats such as Action Replay or Gecko in hardcore mode, for fairness.
2023-12-02 16:41:17 -05:00
LillyJadeKatrin 0abfa94bc8 Disable Freelook in hardcore mode
The player getting a better view of their surroundings than the game would normally allow could possibly give the player an advantage over the original hardware, so Freelook is disabled in hardcore mode. To do this, I disable the config flag for Freelook when it is accessed, to make sure that it is disabled whether it was enabled before or after hardcore mode was enabled.
2023-12-02 16:41:16 -05:00
LillyJadeKatrin 1a19a92943 Disable memory patches in hardcore mode
Memory patches would be an easy way to manipulate the memory needed to calculate achievement logic, so they must be disabled. Riivolution patches that do not affect memory are allowed, as they will be hashed with the game file.
2023-12-02 16:41:16 -05:00