- Consolidated and vastly improved the performance of the program's methods of gathering game executables and DLLs
- Koaloader's respective unlocker DLLs are now correctly deployed based on executable bitnesses instead of which API DLLs exist
- Executable bitness is now detected automatically per-directory (prioritizing 64-bit before 32-bit)
- Executables which or not 32-bit nor 64-bit are now omitted
- Saved pre-v4.1.0.0 proxy choices will be automatically converted to the new format ("Koaloader.version_64.version.dll" -> "version")
- Executable directories' determined bitness can be visualized with the context menu (or during installation)
- Koaloader installations are now automatically uninstalled from the incorrect directories
- Koaloader executable directories are now found more broadly, with common incorrect paths being omitted (ones that contain setups, redistributables or crash reporters)
- Fixed Paradox Launcher Repair reinstalling in proxy mode if a config file was found
- Improved tabbing in the selection forms
- Improved main select form "All" check box logic
- Swapped multiple main select form operations with their thread-safe alternatives (fixes game scanning lockups)
- Extra text in the selection forms are now highlighted the same as nodes and can be left/right clicked
- Fixed pre-scan dialog "Sort By Name" function
- Added the "Sort By Name" function to the main selection form
- Small rearrangements and resizes in the main selection form
- More minor refactoring
- Selections are now properly separated by platform, fixing potential future issues related to two games on different platforms having the same id
- Saved pre-scan choices now have to be saved in JSON, and thus will be reset
- Selection nodes now display their platform and are now also sorted by their platform
- Minor refactoring
- Paradox Launcher repair operation now ignores configs altogether instead of needing to cache and restore
- Paradox Launcher repair operation now shows which files are corrected when performed automatically during installation
- Uninstallation now also deletes the cache json file
- SmokeAPI and ScreamAPI configuration files will no longer be created (and will be deleted) when they're unnecessary (empty)
- Improved installation action log strings for clarification
- SmokeAPI's dlc_ids parameter is now properly utilized (should fix Arma 3 launcher issues)
- Overhauled the ScreamAPI config creation to utilize unlock_all and auto_inject with proper overrides
- Right-click context menu favicons are now grabbed via Google's favicons API
- Official program/game websites are now openable via the right-click context menu should the Steam Store provide one
- Minor visual fixes and refactoring
- While installing SmokeAPI to games, old CreamAPI configurations will now be deleted if they exist
- Paradox Launcher repair methods will now be able to fix old CreamAPI/SmokeAPI versions
- Fixed Paradox Launcher SmokeAPI repair exception
- Converted the program from using CreamAPI to SmokeAPI (it's recommended to uninstall CreamAPI with v3.4 of this program before updating, but not required)
- Removed RimWorld from excluded games (it should work fine with SmokeAPI)
- Attempted fix for SteamCMD string exception
- Attempted fix for weird ExceptionHandler behavior
- Fixed weird "Block Protected Games" checkbox sizing for other languages
- Minor refactoring
- Steam games now wait on store api queries, so no DLC will ever be missed from the steam store now
- Steam DLC store queries will now only be performed after ALL Steam games have completed their respective store queries, to make sure the steam store api limit isn't hit before all games have queried successfully
- Added more files to SteamCMD cleanup
- Added a save and load feature to the new pre-scan choices dialog
- Re-enabled ReadyToRun compilation
- Moved the program to 64-bit
- Added Notepad++ support, so the program opens query files with it if it exists
- Cancelling the pre-scan choices dialog now cancels scanning
- The pre-scan choices dialog now doesn't show at all if no installed games are found on the system
- Fixed the installation form cancel button
- Selection form now no longer scans at unnecessary locations (e.g. after installation form re-select)
- Large code refactoring
- Minor refactoring
- Querying cooldown is now written to and read from ProgramData so it can be persistent and hopefully steam's API limit is reached a little less often
- Increased steam game info querying cooldown to 600 seconds (10 minutes) and steam DLC info querying cooldown to 1200 seconds (20 minutes)
- Introduced a 600 second (10 minute) cooldown for Epic game queries using the same system above
- Added a per-game 10 second cooldown and per-DLC 60 second cooldown between store queries to help prevent steam from thinking they're getting DDoSed (lol)
- Optimized selection form node updating
- Large code refactoring and optimizations
- The more essential SteamCMD directories (config and userdata) will no longer be cleaned up by the program, hopefully to speed up the first call
- Games can now also use SteamCMD as a fallback similar to DLC (previously both steam store AND steamCMD output was required for games, now it's either OR)
- Converted steam store page parsing into actual steam store API calls
- Substantially increased the speed of gathering app information, as DLC gathering will now attempt to use the steam store API system to gather information, only reverting back to SteamCMD if it was unsuccessful (if the DLC isn't on the steam store)
- Program will now try to utilize cached Epic Store info if the web request fails
- Reverted the maximum SteamCMD processes to 20
- Fixed a rare concurrency issue with the new SteamCMD method
- Improved the used images and icons for the context menu
- Added the "Open in SteamDB" context menu option for Steam DLC
- Overhauled SteamCMD appinfo gathering, with substantially increased speed
- Increased maximum SteamCMD processes from 20 to 30
- The gathering progress is now based on only games, so no more progress decreasing
- Overhauled and made OnTreeViewNodeCheckedChanged method more stable
- Made node sub-text display more specific to only game and dlc ids
- Fixed program validating tree nodes based on the pre-Epic-support id system
- Overhauled Epic Games entitlement querying and parsing
- Added back ScreamAPI entitlement selection, with preparations to add catalog item selection
- More code refactoring and simplifications
- Converted ScreamAPI config creation into unlock_all for now until I can figure out how to properly get ALL dlc ids (some games worked, some didn't)
- Enabled the display and installation of unnamed DLCs, as I've just discovered a case of DLC name updating without the buildid changing (Dying Light 2 - Peacekeeper 01)
- Overhauled right-click context menu icon handling
- The program will no longer get all game icons on start, and instead will load them when the game is right clicked
- Added DLC icons to the right click menu
- DLC icons in the right click menu will now display the game's icon if an icon doesn't exist for it
- Added an "Open AppInfo" button to the right click context menu
- Fixed an issue where the string "ERROR! Failed to install app '4' (Invalid platform)" was sometimes somewhere in the middle of AppInfo files, unfortunately meaning I have to bump the minimum appinfo version again
- By fixing the above issue, I also fixed certain random DLCs from being excluded
- Improved SteamCMD cleanup process
- Improved SteamCMD appinfo caching, upping the minimum appinfo version to facilitate changes
- Implemented SteamCMD process limit of 20, resulting in less CPU usage with faster and more stable appinfo gathering
- Separated appTasks into a separate list along with RunningTasks to improve stability
- Remaining games and DLCs are now first added outside of their scheduled tasks to improve visual feedback
- Added extra labels to the selection form progress section that display remaining games and DLCs, replacing the "(#/#)" text
- Fixed a harmless control invoke exception that happens when the program is closed
- Fixed a harmless bug with duplicates being included in the games to be gathered
- Minor refactoring
- Moved from VDF dynamic parsing to the more reliable method introduced in v2.2.4.1
- Fixed a bug where selections were validating prematurely
- Optimized the number of SteamCMD instances that would open for appinfo gathering processes
- Optimized the install form update delays so they're now way faster and still don't glitch the log
- Added a 10ms delay to DLC iterations to reduce control & window freezing
- Select form cancelling now runs on the proper thread to reduce cancellation delay
- Minor refactoring
- Updated HtmlAgilityPack dependency
- Replaced node right click with a beefy context menu with ICONS :O
- Small improvements to selection node display
- Fixed selections sometimes being prematurely removed
- Enabled selections will now be saved and restored after installation
- Massive refactoring and asynchronous fixes
- Disabled file operations from displaying in the install info label, and they now only display in the log
- Disabled selection validation, as previous issues warranting it have since been fixed
- Converted multiple methods to asynchronous to improve performance
- Added a minimal delay to the install form updates to keep the log from glitching
- Added double buffering to all controls to reduce flickering
- Fixed the cancel button not fully cancelling SteamCMD processes
- Internalized all possible classes, methods, accessors and fields
- Improved the aesthetics of the "Block Protected Games" help button
- Changed button, checkbox, and text FlatStyles to System for the better response effects
- Improved the node right click appId gathering
- Fixed a bug where right clicking to the right of a node's text would open the link twice
- Added gray text to the right of games and their DLC that displays their steam AppID
- Fixed exception handling for OnLoad method in selection form
- Made program selection validation more stable
- Reimplemented program selection caching with Usable boolean
- Fixed errors related to the treeNodes list by converting it into a method that gathers all nodes