- Save DLC enabled state to installed.json during install
- Restore DLC enabled state from installed.json when loading saved installed games on launch
- Added SmokeAPI.ReadConfigDlcIds() to read SmokeAPI.config.json and extract enabled/disabled DLC IDs from override_dlc_status and extra_dlcs
- Added CreamAPI.ReadConfigDlcIds() to read cream_api.ini and extract DLC IDs from [dlc] section
- On scan, when a SmokeAPI or CreamAPI unlocker is detected, read its config and adjust DLC enabled state accordingly
- Removed legacy dlc.json entirely (DlcChoicesPath, ReadDlcChoices, WriteDlcChoices, and all references) since installed.json now fully manages DLC state
- Refactored logging methods ProgramData.Log/LogWarning/LogError with a better structured Log.Info/Warn/Error and LogDestination enum for routing logs to the correct file (Scan, Steam, Unlocker, App)
- Relocated the cooldown folder from C:\ProgramData\CreamInstaller\cooldown to C:\ProgramData\CreamInstaller\Cache\cooldown (Does not cleanup the old location currently)
- Removes the old Save/Load buttons on the main window as they don't provide a real purpose with the new changes of loading installed DLC Unlockers
- Removes the Reset button as it clears the loaded settings which really serves no effective purpose with the new changes
- Moves the Uninstall All button to the Main Window since it doesn't really make sense for it to live on the Rescan window
- Add prompt on Uninstall All to confirm you actually WANT to remove EVERYTHING
- Chaged several classes within ThemeManager to sealed since they're not inherrited from in other areas of the code.
- Added Nullable section and defined some variables as nullable.
- Fix for SteamCMD Migration: Creates SteamCMD directory before trying to start the download (Woops, kinda need to do that.)
- Ensures the application migrates SteamCMD files fom the legacy location C:\ProgramData\Creamlnstaller\ to C:\ProgramData\Creamlnstaller\SteamCMD\
- Add information about proxying DLLs and finding the correct proxy DLL for a game.
- Adjust the FAQ section into an expand/collapse section. (Surely you'll read it if you have to expand it right?!)
- Add additional flags to the false positive section
- Cleanup some of the AI shit. (Yes, I ran the readme through AI, it made the formatting better for sure. ¯\_(ツ)_/¯)
- SteamCMD: Changed output reading from one character at a time to buffered reads, fixing a stderr deadlock issue and making the process much faster and more responsive to cancellation.
- DLC detection: Eliminated a busy-wait loop that was polling every 200ms on a background thread while waiting for game data to arrive. Now uses proper async signaling so the thread is freed up entirely.
- HTTP retries: Previously every Steam API error was retried up to 10 times with delays, even for "403 Forbidden" errors that will never succeed. The scanner now gives up immediately on permanent errors, preventing up to 90 seconds of wasted retries per failed app, and avoids triggering rate limits by hammering the API on doomed requests
- Replaced fixed 1-second waits with smarter retry timing that waits longer after each failed attempt and adds a small random delay to reduce API requests. Also reduced the maximum number of retry attempts from 10 to 3 for temporary network errors.
- Adds the ability to Test Ubisoft Games > Has a search function with a "public" API.
- Remove the DLC section from Steam Game Test Window, never really going to use this as originally the idea with test games was primarily to test DLC resolution.
- Ensure the game name is cleared whens witching between test platforms
- Proper cleanup of test data if the Clear All Tests button is clicked, ensures test games get cleared from the selection list as well.
- Adds a badge/color for ScreamAPI (Epic Games)
- Adds a badge/color for UPlay Unlocker (Ubisoft Games)
- Adds a badge/color for Koaloader (MISC Injection Methods)
- Rename JSON Proxy field to "Proxy DLL Name" and always store the resolved
name instead of null for default convention
- Add DetectInstalledProxy() to find proxy dlls winmm/winhttp/version.dll
- Fixes to ensure all detected unlockers are persisted in installed.json on scan so pre-existing unlockers are tracked even if not installed via CreamInstaller
- Restore proxy and extra protection state from saved records for both
scanned and previously scanned games on reload
- Detect proxy DLLs from disk for previously scanned game reconstruction
- Checks if CreamAPI/SmokeAPI/ScreamAPI are present in a game directory. If so, ensures it's stored in installed.json so we recall all games with DLC unlockers that have been detected, even if those DLC unlockers were not installed VIA CreamInstaller.
- Updates further logging lines that were using UTC to instead use current system time.
- Added log lines to include total time for detecting games and DLC during library scan
- Added log lines for why a game may not be processed.
- Added log lines to indicate how many game were detected across all libraries.
- Corrects log line where the game-scan.log was incorrectly reporting double the amount of selected games
- Slight adjustments to where SteamAPI calls go in logs
- Renamed cream-steamcmd log to just cream-steam.log
- Added prefixes for SteamCMD / SteamAPI commands to logs
- Adds logic to allow for a Steam Game with no SteamAPI dll to use forced proxy methods. (This is not guranteed to work and thus these games are tagged with the "Proxy Only" platform tag.
- Adds tooltips, and displays them for Unsupported/Proxy Only games if hovered with the mouse.
- Adds improved logging to the application, breaks logs into 3 primary logs: game-scan.log, cream-steamcmd.log and CreamInstaller.log
- Fixed issues with how HttpClient was being created and managed, which could lead to socket leaks and connection problems. Now the app reuses a single shared HttpClient instead of creating new ones repeatedly, and properly manages the underlying connection handler.
- Improved connection handling with better timeouts, safer pooling settings, and better handling of network errors and DNS changes.
- Improved Debug Error messaging for failed SteamCMD querys
Added try catch for async handling across the application to reduce crash risk from async void methods. Added proper error handling so exceptions are caught instead of crashing the app.
- Fixes a rare issue where the application could crash if the same window was called by multiple parts of the program at the same time. This could cause unexpected errors or crashes.
- Added method to remember the games you've installed so they don't need to be reselected.
- Added labels for to display if CreamAPI / SmokeAPI DLC Unlockers are installed
- Logic to ensure the Extra Protection checkbox displays at the appropriate time
- Added logic to read Extra Protection state from cream_api.ini when CreamAPI is detected
- Adds the ability to enable ExtraProtection for CreamAPI, this is required for games that check the integrity of the steam_api.dll
Related Work Items: #2, #21
- Adjusts the selection bar so it properly selects the whole field.
- Adjusted the color of the selection bar to be a lighter blue so text is easier to read.
- Fixes missing expander in dark mode, which occured when I was fixing the checkboxes. (Woops)
- Fixes the selection bar in dark mode, now properly selects the proxy button as well instead of being cut off. (Light mode still looks like shit though.)
- Added Test Game Generator to the Debug window for creating fake installed game entries for testing
- Updated ThemeManager to properly theme ListBox controls in dark mode
- Labels now use transparent backgrounds for better appearance
- Added base logging infrastructure
- Create scan log during library/game scan in %ProgramData%\CreamInstaller\scan.log
- Normalize Steam library paths (libraryfolders.vdf) using Path.GetFullPath + ResolvePath to handle slashes, casing, and drive changes
- Diagnostics.ResolvePath: wrap GetFileSystemInfos in try/catch and guard against empty results to prevent IndexOutOfRangeException (May assist with issues on slow or intermittently accessible external drives)