diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b2c9bae..b0876f5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,24 +1,42 @@ +* `settings_parser.cpp`: + - cleanup the settings parser code by split it into functions + - increase the buffer size for `account_name` to 100 chars + - increase the buffer size for `language` to 64 chars + +* `common_includes.h`: + - refactor includes order + - added new helper function to keep yielding the thread for a given amount of time (currently unused) +* build scripts: + - in Linux build scripts don't use `-d` flag with `rm` + - added global build stat message + +* don't cache deps build when pushing tag or opening pull requests + +* remove hardcoded repo path + remove Git LFS flag since it's no longer needed + +--- + ## 20/Dec/2023 -* fixed the implementation of BIsAppInstalled(), it must lock the global mutex since it is thread-safe, otherwise it will cause starvation and the current thread wion't yield, which triggers some games +* fixed the implementation of `BIsAppInstalled()`, it must lock the global mutex since it is thread-safe, otherwise it will cause starvation and the current thread wion't yield, which triggers some games -* more accurate behavior for BIsAppInstalled(), reject app ID if it was in the DLC list and isUnlockAllDlc was false +* more accurate behavior for `BIsAppInstalled()`, reject app ID if it was in the DLC list and isUnlockAllDlc was false -* basic implementation for RequestAppProofOfPurchaseKey() and RequestAllProofOfPurchaseKeys() +* basic implementation for `RequestAppProofOfPurchaseKey()` and `RequestAllProofOfPurchaseKeys()` -* a simple implementation for GetEarliestPurchaseUnixTime() +* a simple implementation for `GetEarliestPurchaseUnixTime()` -* more accurate implementation for BGetSessionClientResolution, set both x & y to 0 +* more accurate implementation for `BGetSessionClientResolution()`, set both x & y to 0 -* return false in Steam_Apps::BIsDlcInstalled() when the given app ID is the base game +* return false in `BIsDlcInstalled()` when the given app ID is the base game -* check for invalid app ID uint32_max in different places +* check for invalid app ID `uint32_max` in different places -* more accurate implementation for Steam_Client::BReleaseSteamPipe(), return true if the pipe was released successfully +* more accurate implementation for `BReleaseSteamPipe()`, return true if the pipe was released successfully * lock the global mutex and the overlay mutex in different places just to be on the safe side, without it, some games suffer from thread starvation, might slow things down -* added missing env var "SteamOverlayGameId" to steam_client and client_loader +* added missing env var `SteamOverlayGameId` to steam_client and client_loader * added a startup timer + counter for reference, currently used to print timestamp in debug log @@ -26,6 +44,8 @@ * fixed error propagation in Windows build script, apparently set /a var+=another_var works only if another_var is a defined env var but NOT one of the "magic" builtins like errorlevel +--- + ## 17/Dec/2023 * More accurate implementation for BIsAppInstalled(), it now rejects uint32_max @@ -35,10 +55,12 @@ * Changed the behavior of GetCurrentBetaName() to comply with the docs, might break stuff -* Allow customizing the behavior via is_beta_branch.txt + force_branch_name.txt config files +* Allow customizing the behavior via ne config files: `is_beta_branch.txt` + `force_branch_name.txt` * New script to generate native executable for `generate_emu_config` on Linux using pyinstaller +* Deprecate the old `RtlGenRandom()` in favor of the new `BCryptGenRandom()` + * Setup Github Worflows to: * Build `generate_emu_config` for `Linux` when you push code to a branch whose name matches the pattern `ci-build-gen-linux*` * Build `generate_emu_config` for `Windows` when you push code to a branch whose name matches the pattern `ci-build-gen-win*` @@ -59,6 +81,9 @@ * Added all third-party dependencies as local branches in this repo + refer to these branches as submodules, making the repo self contained +--- + +## 14/Dec/2023 * based on cvsR4U1 by ce20fdf2 from viewtopic.php?p=2936697#p2936697 * apply the fix for the Linux build (due to newer glibc) from this pull request by Randy Li: https://gitlab.com/Mr_Goldberg/goldberg_emulator/-/merge_requests/42/ @@ -70,16 +95,14 @@ * add fix for glyphs icons for xbox 360 controller by 0x0315 from viewtopic.php?p=2949498#p2949498 - -## 14/Dec/2023 * bare minimum implementation for SDK 1.58a + backup the current version of the interface 'steam ugc' - create new file: isteamugc017.h - > copy the current version of the interface to this file - > don't copy enums, structs, constants, etc..., just copy the pure virtual (abstract) class of the interface - > rename the abstract class to include the current version number in its name, i.e. 'class ISteamUGC017' - > create a file header guard containing the interface version in its name, i.e. 'ISTEAMUGC017_H' - > if the file has '#pragma once', then guard this line with '#ifdef STEAM_WIN32' ... '#endif', I don't know why + + copy the current version of the interface to this file + + don't copy enums, structs, constants, etc..., just copy the pure virtual (abstract) class of the interface + + rename the abstract class to include the current version number in its name, i.e. 'class ISteamUGC017' + + create a file header guard containing the interface version in its name, i.e. 'ISTEAMUGC017_H' + + if the file has '#pragma once', then guard this line with '#ifdef STEAM_WIN32' ... '#endif', I don't know why + isteamugc.h (this always contains the declaration of latest interface version) - declare the new API: GetUserContentDescriptorPreferences() - update the API: SetItemTags() to use the new argument @@ -91,11 +114,11 @@ + backup the current version of the interface 'steam remote play' - create new file: isteamremoteplay001.h - > copy the current version of the interface to this file - > don't copy enums, structs, constants, etc..., just copy the pure virtual (abstract) class of the interface - > rename the abstract class to include the current version number in its name, i.e. 'class ISteamRemotePlay001' - > create a file header guard containing the interface version in its name, i.e. 'ISTEAMREMOTEPLAY001_H' - > if the file has '#pragma once', then guard this line with '#ifdef STEAM_WIN32' ... '#endif', I don't know why + + copy the current version of the interface to this file + + don't copy enums, structs, constants, etc..., just copy the pure virtual (abstract) class of the interface + + rename the abstract class to include the current version number in its name, i.e. 'class ISteamRemotePlay001' + + create a file header guard containing the interface version in its name, i.e. 'ISTEAMREMOTEPLAY001_H' + + if the file has '#pragma once', then guard this line with '#ifdef STEAM_WIN32' ... '#endif', I don't know why + isteamremoteplay.h (this always contains the declaration of latest interface version) - declare the new API: BStartRemotePlayTogether() - update the interface version to STEAMREMOTEPLAY_INTERFACE_VERSION002 @@ -106,8 +129,8 @@ + steam_api.h - #include the backed-up interface files: - > #include "isteamugc017.h" - > #include "isteamremoteplay001.h" + + #include "isteamugc017.h" + + #include "isteamremoteplay001.h" - declare the new API: SteamInternal_SteamAPI_Init() - add a new enum ESteamAPIInitResult - fix return type of SteamAPI_InitSafe() from bool to steam_bool (some stupid games read the whole EAX register) @@ -130,58 +153,58 @@ + isteamnetworkingsockets.h - fix the signatures of the APIs: (ISteamNetworkingConnectionCustomSignaling vs ISteamNetworkingConnectionSignaling) - > ConnectP2PCustomSignaling() - > ReceivedP2PCustomSignal() + + ConnectP2PCustomSignaling() + + ReceivedP2PCustomSignal() + isteamnetworkingsockets009.h - fix the signatures of the APIs: (ISteamNetworkingConnectionCustomSignaling vs ISteamNetworkingConnectionSignaling) - > ConnectP2PCustomSignaling() - > ReceivedP2PCustomSignal() + + ConnectP2PCustomSignaling() + + ReceivedP2PCustomSignal() + steam_networking_sockets.h - implement the missing overloads of the APIs: (ISteamNetworkingConnectionCustomSignaling vs ISteamNetworkingConnectionSignaling) - > ConnectP2PCustomSignaling() - > ReceivedP2PCustomSignal() + + ConnectP2PCustomSignaling() + + ReceivedP2PCustomSignal() - + steam_api_flat.h - //////////////////// + + steam_api_flat.h + //////////////////// - declare new interfaces getters: - > SteamAPI_SteamUGC_v018() - > SteamAPI_SteamGameServerUGC_v018() + + SteamAPI_SteamUGC_v018() + + SteamAPI_SteamGameServerUGC_v018() - declare the new API: SteamAPI_ISteamUGC_GetUserContentDescriptorPreferences() - (needs revise) update signature of the API: SteamAPI_ISteamUGC_SetItemTags() to add the new argument - this will potentially break compatibility with older version of the flat API - //////////////////// + this will potentially break compatibility with older version of the flat API + //////////////////// - declare new interface getter: SteamAPI_SteamRemotePlay_v002() - - declare the new API: SteamAPI_ISteamRemotePlay_BStartRemotePlayTogether() - //////////////////// + - declare the new API: SteamAPI_ISteamRemotePlay_BStartRemotePlayTogether() + //////////////////// - fix the signatures of the APIs: (ISteamNetworkingConnectionCustomSignaling vs ISteamNetworkingConnectionSignaling) - > SteamAPI_ISteamNetworkingSockets_ConnectP2PCustomSignaling() - > SteamAPI_ISteamNetworkingSockets_ReceivedP2PCustomSignal() + + SteamAPI_ISteamNetworkingSockets_ConnectP2PCustomSignaling() + + SteamAPI_ISteamNetworkingSockets_ReceivedP2PCustomSignal() - + flat.cpp - //////////////////// + + flat.cpp + //////////////////// - implement new interfaces getters: - > SteamAPI_SteamUGC_v018() - > SteamAPI_SteamGameServerUGC_v018() + + SteamAPI_SteamUGC_v018() + + SteamAPI_SteamGameServerUGC_v018() - implement the new API: SteamAPI_ISteamUGC_GetUserContentDescriptorPreferences() - (needs revise) update signature of the API: SteamAPI_ISteamUGC_SetItemTags() to use the new argument - this will potentially break compatibility with older version of the flat API - //////////////////// + this will potentially break compatibility with older version of the flat API + //////////////////// - implement new interface getter SteamAPI_SteamRemotePlay_v002() - - implement the new API: SteamAPI_ISteamRemotePlay_BStartRemotePlayTogether() - //////////////////// + - implement the new API: SteamAPI_ISteamRemotePlay_BStartRemotePlayTogether() + //////////////////// - fix the signatures of the APIs: (ISteamNetworkingConnectionCustomSignaling vs ISteamNetworkingConnectionSignaling) - > SteamAPI_ISteamNetworkingSockets_ConnectP2PCustomSignaling() - > SteamAPI_ISteamNetworkingSockets_ReceivedP2PCustomSignal() + + SteamAPI_ISteamNetworkingSockets_ConnectP2PCustomSignaling() + + SteamAPI_ISteamNetworkingSockets_ReceivedP2PCustomSignal() + isteamfriends.h - (needs revise) add a missing (or new?) member m_dwOverlayPID to the struct GameOverlayActivated_t, hopefully this doesn't break stuff + steamnetworkingtypes.h - add new (or missing?) members to the enum ESteamNetworkingConfigValue: - > k_ESteamNetworkingConfig_RecvBufferSize - > k_ESteamNetworkingConfig_RecvBufferMessages - > k_ESteamNetworkingConfig_RecvMaxMessageSize - > k_ESteamNetworkingConfig_RecvMaxSegmentsPerPacket + + k_ESteamNetworkingConfig_RecvBufferSize + + k_ESteamNetworkingConfig_RecvBufferMessages + + k_ESteamNetworkingConfig_RecvMaxMessageSize + + k_ESteamNetworkingConfig_RecvMaxSegmentsPerPacket + add the file isteamdualsense.h, it isn't used currently but just in case for the future @@ -205,8 +228,8 @@ * in different places, avoid locking gloal mutex if the relevant functionality was disabled + example in steam_user_stats.h: SetAchievement() + example in steam_overlay.cpp: - > Steam_Overlay::AddMessageNotification() - > Steam_Overlay::AddInviteNotification() + + Steam_Overlay::AddMessageNotification() + + Steam_Overlay::AddInviteNotification() * explicitly use the ASCII version of Windows APIs to avoid conflict when building with define symbols UNICODE + _UNICODE - base.cpp: GetModuleHandleA() @@ -216,107 +239,106 @@ + return a number + use extern "C" if building in C++ mode -* add new build scripts for both Windows and Linux for a much easier dev/build experience, - both Windows and Linux scripts will run parallel build jobs for a much faster build times, - by default, the scripts will use 70% of the max available threads, but if the auto detection didn't work, - you can pass for example -j 10 to the scripts to use 10 parallel jobs +* add new build scripts for both Windows and Linux for a much easier dev/build experience, + both Windows and Linux scripts will run parallel build jobs for a much faster build times, + by default, the scripts will use 70% of the max available threads, but if the auto detection didn't work, + you can pass for example `-j 10` to the scripts to use 10 parallel jobs - on Linux, archives (.a files) of third party libraries are bundled wholly, and built statically via: - -Wl,--whole-archive -Wl,-Bstatic -lssq -lcurl ... -Wl,-Bdynamic -Wl,--no-whole-archive + on Linux, archives (.a files) of third party libraries are bundled wholly, and built statically via: + `-Wl,--whole-archive -Wl,-Bstatic -lssq -lcurl ... -Wl,-Bdynamic -Wl,--no-whole-archive` this ensures that the final output binary (for example: libsteam.so) won't require these libraries at runtime + to build on Linux (I'm using latest Ubuntu on WSL) - - run as sudo ./build_linux_deps.sh, this will do the following: - > download and install the required build tools via apt-install - > unpack the third party libraries (protobuf, zlib, etc...) from the folder third-party to build-linux-deps - > build the unpacked libraries from build-linux-deps + - run as `sudo ./build_linux_deps.sh`, this will do the following: + + download and install the required build tools via `apt-install` + + unpack the third party libraries (protobuf, zlib, etc...) from the folder `third-party` to `build-linux-deps` + + build the unpacked libraries from `build-linux-deps` - you only need this step once, additionally you can pass these arguments to the script: - -verbose: force cmake to display extra info - -j : force cmake to use parallel build jobs + you only need this step once, additionally you can pass these arguments to the script: + + `-verbose`: force cmake to display extra info + + `-j `: force cmake to use `` parallel build jobs - - without sudo, run ./build_linux.sh and pass the argument "release" or "debug" to build the emu in the corresponding mode, - this will build the emu inside the folder build-linux - some additional arguments you can pass to the script: - -lib-32: prevent building 32-bit libsteam_api.so - -lib-64: prevent building 64-bit libsteam_api.so + - without sudo, run `./build_linux.sh` and pass the argument `release` or `debug` to build the emu in the corresponding mode, this will build the emu inside the folder `build-linux` + some additional arguments you can pass to the script: + + `-lib-32`: prevent building 32-bit libsteam_api.so + + `-lib-64`: prevent building 64-bit libsteam_api.so - -client-32: prevent building 32-bit steamclient.so - -client-64: prevent building 64-bit steamclient.so + + `-client-32`: prevent building 32-bit steamclient.so + + `-client-64`: prevent building 64-bit steamclient.so - -tool-clientldr: prevent copying the script steamclient_loader.sh - -tool-itf: prevent copying the script find_interfaces.sh - -tool-lobby-32: prevent building executable lobby_connect_x32 - -tool-lobby-64: prevent building executable lobby_connect_x64 + + `-tool-clientldr`: prevent copying the script steamclient_loader.sh + + `-tool-itf`: prevent copying the script find_interfaces.sh + + `-tool-lobby-32`: prevent building executable lobby_connect_x32 + + `-tool-lobby-64`: prevent building executable lobby_connect_x64 - +lowperf: (UNTESTED) pass some arguments to the compiler to prevent emmiting instructions for: SSE4, popcnt, AVX + + `+lowperf`: (UNTESTED) pass some arguments to the compiler to prevent emmiting instructions for: SSE4, popcnt, AVX - -j : force build operations to use parallel jobs + + `-j `: force build operations to use `` parallel jobs + to build on Windows (just install Visual Studio 2019/2022) - - without admin, run build_win_deps.bat, this will do the following: - > unpack the third party libraries (protobuf, zlib, etc...) from the folder third-party to build-win-deps - > build the unpacked libraries from build-win-deps + - without admin, run `build_win_deps.bat`, this will do the following: + + unpack the third party libraries (protobuf, zlib, etc...) from the folder `third-party` to `build-win-deps` + + build the unpacked libraries from `build-win-deps` - you only need this step once, additionally you can pass these arguments to the script: - -verbose: force cmake to display extra info - -j : force cmake to use parallel build jobs + you only need this step once, additionally you can pass these arguments to the script: + + `-verbose`: force cmake to display extra info + + `-j `: force cmake to use `` parallel build jobs - - without admin, run build_win.bat and pass the argument "release" or "debug" to build the emu in the corresponding mode, - this will build the emu inside the folder build-win + - without admin, run `build_win.bat` and pass the argument `release` or `debug` to build the emu in the corresponding mode, + this will build the emu inside the folder `build-win` some additional arguments you can pass to the script: - -lib-32: prevent building 32-bit steam_api.dll - -lib-64: prevent building 64-bit steam_api64.dll + + `-lib-32`: prevent building 32-bit steam_api.dll + + `-lib-64`: prevent building 64-bit steam_api64.dll - -ex-lib-32: prevent building experimental steam_api.dll - -ex-lib-64: prevent building experimental steam_api64.dll + + `-ex-lib-32`: prevent building `experimental steam_api.dll` + + `-ex-lib-64`: prevent building `experimental steam_api64.dll` - -ex-client-32: prevent building experimental steamclient.dll - -ex-client-64: prevent building experimental steamclient64.dll + + `-ex-client-32`: prevent building `experimental steamclient.dll` + + `-ex-client-64`: prevent building `experimental steamclient64.dll` - -exclient-32: prevent building experimental client steamclient.dll - -exclient-64: prevent building experimental client steamclient64.dll - -exclient-ldr: prevent building experimental client loader steamclient_loader.exe + + `-exclient-32`: prevent building experimental `client steamclient.dll` + + `-exclient-64`: prevent building experimental `client steamclient64.dll` + + `-exclient-ldr`: prevent building experimental `client loader steamclient_loader.exe` - -tool-itf: prevent building executable find_interfaces.exe - -tool-lobby: prevent building executable lobby_connect.exe + + `-tool-itf`: prevent building executable `find_interfaces.exe` + + `-tool-lobby`: prevent building executable `lobby_connect.exe` - +lowperf: (UNTESTED) for 32-bit build only, pass the argument /arch:IA32 to the compiler + + `+lowperf`: (UNTESTED) for 32-bit build only, pass the argument `/arch:IA32` to the compiler - -j : force build operations to use parallel jobs + + `-j `: force build operations to use `` parallel jobs -* added all required third-party libraries inside the folder "third-party" +* added all required third-party libraries inside the folder `third-party` -* greatly enhanced the functionality of the generate_emu_config script + add a build script - + run recreate_venv.bat to - > create a python virtual environemnt - > install all required packages inside this env - + run rebuild.bat to produce a bootstrapped .exe built using pyinstaller +* greatly enhanced the functionality of the `generate_emu_config` script + add a build script + + run `recreate_venv.bat` to + + create a python virtual environemnt + + install all required packages inside this env + + run `rebuild.bat` to produce a bootstrapped .exe built using `pyinstaller` + inside the folder of the built executable - > create a file called my_login.txt, then add your username in the first line, and your password in the second line - > run the .exe file without any args to display all available options + + create a file called `my_login.txt`, then add your username in the first line, and your password in the second line + + run the .exe file without any args to display all available options -* revert the changes to SetProduct() and SetGameDescription() +* revert the changes to `SetProduct()` and `SetGameDescription()` -* in steam_overlay.cpp: AddAchievementNotification(): prefer original paths of achievements icons first, then fallback to "achievement_images/" +* in `steam_overlay.cpp`, in `AddAchievementNotification()`: prefer original paths of achievements icons first, then fallback to `achievement_images/` -////////// older changes -* add missing implementation of (de)sanitize_string when NO_DISK_WRITE is defined which fixes compilation of lobby_connect + +## Older changes +* add missing implementation of (de)sanitize_string when `NO_DISK_WRITE` is defined which fixes compilation of `lobby_connect` * check for empty string in (de)sanitize_file_name() before accessing its items -* implement new API: GetAuthTicketForWebApi() - + base.h: declare the new API: getWebApiTicket() - + base.cpp: implement the new API: Auth_Ticket_Manager::getWebApiTicket() - + steam_user.h: call the new API inside GetAuthTicketForWebApi() +* implement new API: `GetAuthTicketForWebApi()` + + `base.h`: declare the new API: `getWebApiTicket()` + + `base.cpp`: implement the new API: `Auth_Ticket_Manager::getWebApiTicket()` + + `steam_user.h`: call the new API inside `GetAuthTicketForWebApi()` -* add an updated and safer impl for Local_Storage::load_image_resized() by RIPAciD from viewtopic.php?p=2884627#p2884627 +* add an updated and safer impl for `Local_Storage::load_image_resized()` by RIPAciD from viewtopic.php?p=2884627#p2884627 -* add missing note in ReadMe about libssq +* add missing note in ReadMe about `libssq` * add new release 4 by ce20fdf2 from viewtopic.php?p=2933673#p2933673 * add hotfix 3 by ce20fdf2 from viewtopic.php?p=2921215#p2921215 * add hotfix 2 by ce20fdf2: viewtopic.php?p=2884110#p2884110 * add initial hotfix by ce20fdf2 -