From db2a803cf7446aef6ce343ee271dca131e8645b5 Mon Sep 17 00:00:00 2001 From: Mr_Goldberg Date: Sun, 19 Jan 2020 12:55:14 -0500 Subject: [PATCH] A few improvements to the overlay merge request. NO_OVERLAY define becomes EMU_OVERLAY which enables the overlay instead of disabling it. disable_overlay.txt moved to steam_settings. --- .gitlab-ci.yml | 10 +- CMakeLists.txt | 13 +- Readme_release.txt | 4 +- build_steamos.sh | 12 +- build_win_debug_experimental.bat | 4 +- build_win_lobby_connect.bat | 2 +- build_win_release.bat | 4 +- build_win_release_experimental.bat | 4 +- ...d_win_release_experimental_steamclient.bat | 4 +- dll/dll.cpp | 9 +- dll/net.proto | 2 +- dll/settings.h | 3 + dll/settings_parser.cpp | 5 + dll/steam_client.cpp | 13 +- dll/steam_client.h | 1 - dll/steam_user_stats.cpp | 829 --------------- dll/steam_user_stats.h | 944 ++++++++++++++---- download_glew.sh | 12 - .../disable_overlay.EXAMPLE.txt | 1 + overlay_experimental/Base_Hook.cpp | 4 +- overlay_experimental/Base_Hook.h | 4 +- overlay_experimental/Hook_Manager.cpp | 4 +- overlay_experimental/Hook_Manager.h | 4 +- overlay_experimental/Renderer_Detector.h | 4 +- overlay_experimental/linux/OpenGLX_Hook.cpp | 4 +- overlay_experimental/linux/OpenGLX_Hook.h | 4 +- overlay_experimental/linux/X11_Hook.cpp | 4 +- overlay_experimental/linux/X11_Hook.h | 4 +- overlay_experimental/steam_overlay.cpp | 2 +- overlay_experimental/steam_overlay.h | 2 +- overlay_experimental/windows/DX10_Hook.cpp | 4 +- overlay_experimental/windows/DX10_Hook.h | 4 +- overlay_experimental/windows/DX11_Hook.cpp | 4 +- overlay_experimental/windows/DX11_Hook.h | 4 +- overlay_experimental/windows/DX12_Hook.cpp | 4 +- overlay_experimental/windows/DX12_Hook.h | 4 +- overlay_experimental/windows/DX9_Hook.cpp | 4 +- overlay_experimental/windows/DX9_Hook.h | 4 +- overlay_experimental/windows/OpenGL_Hook.cpp | 4 +- overlay_experimental/windows/OpenGL_Hook.h | 4 +- overlay_experimental/windows/Windows_Hook.cpp | 4 +- overlay_experimental/windows/Windows_Hook.h | 4 +- 42 files changed, 857 insertions(+), 1107 deletions(-) mode change 100755 => 100644 build_steamos.sh delete mode 100644 dll/steam_user_stats.cpp delete mode 100755 download_glew.sh create mode 100644 files_example/steam_settings.EXAMPLE/disable_overlay.EXAMPLE.txt diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 71c719d..9cb8671 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -59,8 +59,7 @@ build_windows: image: fedora:29 script: - - dnf -y install wine wget p7zip sed dos2unix unzip - - ./download_glew.sh + - dnf -y install wine wget p7zip sed dos2unix - unix2dos *.txt - unix2dos files_example/*.txt files_example/*/*.txt - sed -i 's/..\\vcpkg\\packages\\/.\\/g' build_set_protobuf_directories.bat @@ -104,7 +103,7 @@ build_cmake_linux: script: - mkdir cmake-builds && cd cmake-builds - mkdir x64-release && cd x64-release - - cmake ../../ -G "Ninja" -DCMAKE_BUILD_TYPE:STRING="RelWithDebInfo" -DNO_OVERLAY=ON && ninja + - cmake ../../ -G "Ninja" -DCMAKE_BUILD_TYPE:STRING="RelWithDebInfo" && ninja - cd .. # - mkdir x64-experimental-release && cd x64-experimental-release # - cmake ../../ -G "Ninja" -DCMAKE_BUILD_TYPE:STRING="RelWithDebInfo" -DEMU_EXPERIMENTAL_BUILD:BOOL=ON && ninja @@ -127,7 +126,6 @@ build_cmake_windows: - 7za x cmake-3.15.0-rc1-win64-x64.zip - wget 'https://gitlab.com/Mr_Goldberg/goldberg_emulator/uploads/0119304e030098b4821d73170fe52084/protobuf_x64-windows-static.7z' - 7za x protobuf_x64-windows-static.7z -oprotobuf_x64-windows-static - - ./download_glew.sh script: - export WINEDEBUG=-all @@ -135,13 +133,13 @@ build_cmake_windows: - mkdir cmake-builds && cd cmake-builds - mkdir x64-release && cd x64-release - echo call .\\..\\..\\sdk_standalone\\set_vars64.bat >> cmake-build.bat - - echo .\\..\\..\\cmake-3.15.0-rc1-win64-x64\\bin\\cmake.exe ..\\.. -G \"NMake Makefiles\" -DCMAKE_BUILD_TYPE:STRING="RelWithDebInfo" -DNO_OVERLAY=ON -DCMAKE_PREFIX_PATH="protobuf_x64-windows-static" -DProtobuf_PROTOC_EXECUTABLE:STRING="./../../protobuf_x64-windows-static/tools/protobuf/protoc.exe" >> cmake-build.bat + - echo .\\..\\..\\cmake-3.15.0-rc1-win64-x64\\bin\\cmake.exe ..\\.. -G \"NMake Makefiles\" -DCMAKE_BUILD_TYPE:STRING="RelWithDebInfo" -DCMAKE_PREFIX_PATH="protobuf_x64-windows-static" -DProtobuf_PROTOC_EXECUTABLE:STRING="./../../protobuf_x64-windows-static/tools/protobuf/protoc.exe" >> cmake-build.bat - echo nmake.exe >> cmake-build.bat - wine cmd /c cmake-build.bat - cd .. - mkdir x64-experimental-release && cd x64-experimental-release - echo call .\\..\\..\\sdk_standalone\\set_vars64.bat >> cmake-build.bat - - echo .\\..\\..\\cmake-3.15.0-rc1-win64-x64\\bin\\cmake.exe ..\\.. -G \"NMake Makefiles\" -DCMAKE_BUILD_TYPE:STRING="RelWithDebInfo" -DEMU_EXPERIMENTAL_BUILD=ON -DCMAKE_PREFIX_PATH="protobuf_x64-windows-static" -DProtobuf_PROTOC_EXECUTABLE:STRING="./../../protobuf_x64-windows-static/tools/protobuf/protoc.exe" >> cmake-build.bat + - echo .\\..\\..\\cmake-3.15.0-rc1-win64-x64\\bin\\cmake.exe ..\\.. -G \"NMake Makefiles\" -DCMAKE_BUILD_TYPE:STRING="RelWithDebInfo" -DEMU_EXPERIMENTAL_BUILD=ON -DEMU_OVERLAY=ON -DCMAKE_PREFIX_PATH="protobuf_x64-windows-static" -DProtobuf_PROTOC_EXECUTABLE:STRING="./../../protobuf_x64-windows-static/tools/protobuf/protoc.exe" >> cmake-build.bat - echo nmake.exe >> cmake-build.bat - wine cmd /c cmake-build.bat - cd .. diff --git a/CMakeLists.txt b/CMakeLists.txt index eb53226..dac2ea1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -105,7 +105,7 @@ endif() add_library(${LIB_STEAM_API} SHARED $<$:${DETOURS_SRC_SHARED}> - $<$,$>>:${OVERLAY_EXPERIMENTAL_SRC_SHARED}> + $<$,$>:${OVERLAY_EXPERIMENTAL_SRC_SHARED}> ${DLL_SRC_SHARED} ${PROTO_SRCS} ${PROTO_HDRS} @@ -126,9 +126,9 @@ target_link_libraries(${LIB_STEAM_API} protobuf::libprotobuf $<$:ws2_32> $<$:iphlpapi> - $<$,$,$>>:glew32s.lib> - $<$,$,$>>:opengl32.lib> - $<$,$,$>>:Winmm.lib> + $<$,$,$>:glew32s.lib> + $<$,$,$>:opengl32.lib> + $<$,$,$>:Winmm.lib> ) # Add target compile definitions @@ -139,8 +139,8 @@ target_compile_definitions(${LIB_STEAM_API} $<$:EMU_RELEASE_BUILD> $<$:EMU_RELEASE_BUILD> $<$:EMU_EXPERIMENTAL_BUILD> - $<$:NO_OVERLAY> - $<$,$,$>>:GLEW_STATIC> + $<$:EMU_OVERLAY> + $<$,$,$>:GLEW_STATIC> ) # Install the target @@ -265,7 +265,6 @@ target_link_libraries(${BIN_LOBBY_CONNECT} target_compile_definitions(${BIN_LOBBY_CONNECT} PRIVATE NO_DISK_WRITES - NO_OVERLAY LOBBY_CONNECT $<$:EMU_RELEASE_BUILD> $<$:EMU_RELEASE_BUILD> diff --git a/Readme_release.txt b/Readme_release.txt index e78b7fa..5749d1e 100644 --- a/Readme_release.txt +++ b/Readme_release.txt @@ -102,8 +102,10 @@ You must all be on the same LAN for it to work. IMPORTANT: Do not run more than one steam game with the same appid at the same time on the same computer with my emu or there might be network issues (dedicated servers should be fine though). +Overlay (Note: at the moment this feature is only enabled in the windows experimental builds): +The overlay can be disabled by putting a file named disable_overlay.txt in the steam_settings folder. This is for games that depend on the steam overlay to let people join multiplayer games. -Controller (Note: at the moment this feature is only enabled in the windows experimental builds): +Controller (Note: at the moment this feature is only enabled in the windows experimental builds and the linux builds): SteamController/SteamInput support is limited to XInput controllers. If your controller is not XInput, there are many tools (at least for windows) that you can use to make it emulate an XInput one. Steam uses things called action sets for controller configuration. An action set is a group of action names. Action names are bound to buttons, triggers or joysticks. The emulator needs to know for each action set, which button is linked to which action name. Create a ACTION_SET_NAME.txt file in the steam_settings\controller folder for every action set the game uses. diff --git a/build_steamos.sh b/build_steamos.sh old mode 100755 new mode 100644 index 41ce0e7..c91e44b --- a/build_steamos.sh +++ b/build_steamos.sh @@ -7,10 +7,10 @@ mkdir -p linux/tools cp scripts/find_interfaces.sh linux/tools/ cp scripts/steamclient_loader.sh linux/tools/ ../protobuf/prefix_x86/bin/protoc -I./dll/ --cpp_out=./dll/ ./dll/*.proto -g++ -m32 -shared -fPIC -fvisibility=hidden -Wl,--exclude-libs,ALL -DGNUC -DNO_OVERLAY -DEMU_RELEASE_BUILD -DNDEBUG -s -o linux/x86/libsteam_api.so dll/*.cpp dll/*.cc -Wno-return-type -I../protobuf/prefix_x86/include/ -L../protobuf/prefix_x86/lib/ -lprotobuf-lite -std=c++11 && echo built32 -g++ -m32 -shared -fPIC -fvisibility=hidden -Wl,--exclude-libs,ALL -DGNUC -DNO_OVERLAY -DEMU_RELEASE_BUILD -DSTEAMCLIENT_DLL -DNDEBUG -s -o linux/x86/steamclient.so dll/*.cpp dll/*.cc -Wno-return-type -I../protobuf/prefix_x86/include/ -L../protobuf/prefix_x86/lib/ -lprotobuf-lite -std=c++11 && echo built32_steamclient -g++ -m32 -fvisibility=hidden -Wl,--exclude-libs,ALL -DGNUC -DNO_OVERLAY -DEMU_RELEASE_BUILD -DNDEBUG -DNO_DISK_WRITES -DLOBBY_CONNECT -s -o linux/lobby_connect/lobby_connect_x86 lobby_connect.cpp dll/*.cpp dll/*.cc -Wno-return-type -I../protobuf/prefix_x86/include/ -L../protobuf/prefix_x86/lib/ -lprotobuf-lite -lpthread -std=c++11 && echo built_lobby_connect32 +g++ -m32 -shared -fPIC -fvisibility=hidden -Wl,--exclude-libs,ALL -DGNUC -DEMU_RELEASE_BUILD -DNDEBUG -DCONTROLLER_SUPPORT -s -o linux/x86/libsteam_api.so dll/*.cpp dll/*.cc controller/*.c -Wno-return-type -I../protobuf/prefix_x86/include/ -L../protobuf/prefix_x86/lib/ -lprotobuf-lite -std=c++11 && echo built32 +g++ -m32 -fvisibility=hidden -Wl,--exclude-libs,ALL -DGNUC -DEMU_RELEASE_BUILD -DNDEBUG -DNO_DISK_WRITES -DLOBBY_CONNECT -s -o linux/lobby_connect/lobby_connect_x86 lobby_connect.cpp dll/*.cpp dll/*.cc -Wno-return-type -I../protobuf/prefix_x86/include/ -L../protobuf/prefix_x86/lib/ -lprotobuf-lite -lpthread -std=c++11 && echo built_lobby_connect32 +g++ -m32 -shared -fPIC -fvisibility=hidden -Wl,--exclude-libs,ALL -DGNUC -DEMU_RELEASE_BUILD -DSTEAMCLIENT_DLL -DNDEBUG -DCONTROLLER_SUPPORT -s -o linux/x86/steamclient.so dll/*.cpp dll/*.cc controller/*.c -Wno-return-type -I../protobuf/prefix_x86/include/ -L../protobuf/prefix_x86/lib/ -lprotobuf-lite -std=c++11 && echo built32_steamclient ../protobuf/prefix/bin/protoc -I./dll/ --cpp_out=./dll/ ./dll/*.proto -g++ -shared -fPIC -fvisibility=hidden -Wl,--exclude-libs,ALL -DGNUC -DNO_OVERLAY -DEMU_RELEASE_BUILD -DNDEBUG -s -o linux/x86_64/libsteam_api.so dll/*.cpp dll/*.cc -Wno-return-type -I../protobuf/prefix/include/ -L../protobuf/prefix/lib/ -lprotobuf-lite -std=c++11 && echo built64 -g++ -shared -fPIC -fvisibility=hidden -Wl,--exclude-libs,ALL -DGNUC -DNO_OVERLAY -DEMU_RELEASE_BUILD -DSTEAMCLIENT_DLL -DNDEBUG -s -o linux/x86_64/steamclient.so dll/*.cpp dll/*.cc -Wno-return-type -I../protobuf/prefix/include/ -L../protobuf/prefix/lib/ -lprotobuf-lite -std=c++11 && echo built64_steamclient -g++ -fvisibility=hidden -Wl,--exclude-libs,ALL -DGNUC -DNO_OVERLAY -DEMU_RELEASE_BUILD -DNDEBUG -DNO_DISK_WRITES -DLOBBY_CONNECT -s -o linux/lobby_connect/lobby_connect_x64 lobby_connect.cpp dll/*.cpp dll/*.cc -Wno-return-type -I../protobuf/prefix/include/ -L../protobuf/prefix/lib/ -lprotobuf-lite -lpthread -std=c++11 && echo built_lobby_connect64 +g++ -shared -fPIC -fvisibility=hidden -Wl,--exclude-libs,ALL -DGNUC -DEMU_RELEASE_BUILD -DNDEBUG -DCONTROLLER_SUPPORT -s -o linux/x86_64/libsteam_api.so dll/*.cpp dll/*.cc controller/*.c -Wno-return-type -I../protobuf/prefix/include/ -L../protobuf/prefix/lib/ -lprotobuf-lite -std=c++11 && echo built64 +g++ -fvisibility=hidden -Wl,--exclude-libs,ALL -DGNUC -DEMU_RELEASE_BUILD -DNDEBUG -DNO_DISK_WRITES -DLOBBY_CONNECT -s -o linux/lobby_connect/lobby_connect_x64 lobby_connect.cpp dll/*.cpp dll/*.cc -Wno-return-type -I../protobuf/prefix/include/ -L../protobuf/prefix/lib/ -lprotobuf-lite -lpthread -std=c++11 && echo built_lobby_connect64 +g++ -shared -fPIC -fvisibility=hidden -Wl,--exclude-libs,ALL -DGNUC -DEMU_RELEASE_BUILD -DSTEAMCLIENT_DLL -DNDEBUG -DCONTROLLER_SUPPORT -s -o linux/x86_64/steamclient.so dll/*.cpp dll/*.cc controller/*.c -Wno-return-type -I../protobuf/prefix/include/ -L../protobuf/prefix/lib/ -lprotobuf-lite -std=c++11 && echo built64_steamclient diff --git a/build_win_debug_experimental.bat b/build_win_debug_experimental.bat index 88cb67a..ef997bc 100755 --- a/build_win_debug_experimental.bat +++ b/build_win_debug_experimental.bat @@ -4,13 +4,13 @@ call build_set_protobuf_directories.bat "%PROTOC_X86_EXE%" -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto call build_env_x86.bat cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /LD /IImGui /Iglew\include /I%PROTOBUF_X86_DIRECTORY%\include\ /DGLEW_STATIC /DEMU_EXPERIMENTAL_BUILD /DCONTROLLER_SUPPORT dll/*.cpp dll/*.cc detours/*.cpp controller/gamepad.c ImGui/*.cpp ImGui/impls/*.cpp ImGui/impls/windows/*.cpp overlay_experimental/*.cpp overlay_experimental/windows/*.cpp "%PROTOBUF_X86_LIBRARY%" glew\lib\Release\Win32\glew32s.lib opengl32.lib Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib Winmm.lib /EHsc /MP12 /link /OUT:steam_api.dll +cl /LD /IImGui /Iglew\include /I%PROTOBUF_X86_DIRECTORY%\include\ /DGLEW_STATIC /DEMU_EXPERIMENTAL_BUILD /DCONTROLLER_SUPPORT /DEMU_OVERLAY dll/*.cpp dll/*.cc detours/*.cpp controller/gamepad.c ImGui/*.cpp ImGui/impls/*.cpp ImGui/impls/windows/*.cpp overlay_experimental/*.cpp overlay_experimental/windows/*.cpp "%PROTOBUF_X86_LIBRARY%" glew\glew.c opengl32.lib Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib Winmm.lib /EHsc /MP12 /link /OUT:steam_api.dll cl /LD steamclient.cpp /EHsc /MP12 /link /OUT:steamclient.dll cl /LD steamnetworkingsockets.cpp /EHsc /MP12 /link /OUT:steamnetworkingsockets.dll "%PROTOC_X64_EXE%" -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto call build_env_x64.bat cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /LD /IImGui /Iglew\include /I%PROTOBUF_X64_DIRECTORY%\include\ /DGLEW_STATIC /DEMU_EXPERIMENTAL_BUILD /DCONTROLLER_SUPPORT dll/*.cpp dll/*.cc detours/*.cpp controller/gamepad.c ImGui/*.cpp ImGui/impls/*.cpp ImGui/impls/windows/*.cpp overlay_experimental/*.cpp overlay_experimental/windows/*.cpp "%PROTOBUF_X64_LIBRARY%" glew\lib\Release\x64\glew32s.lib opengl32.lib Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib Winmm.lib /EHsc /MP12 /link /OUT:steam_api64.dll +cl /LD /IImGui /Iglew\include /I%PROTOBUF_X64_DIRECTORY%\include\ /DGLEW_STATIC /DEMU_EXPERIMENTAL_BUILD /DCONTROLLER_SUPPORT /DEMU_OVERLAY dll/*.cpp dll/*.cc detours/*.cpp controller/gamepad.c ImGui/*.cpp ImGui/impls/*.cpp ImGui/impls/windows/*.cpp overlay_experimental/*.cpp overlay_experimental/windows/*.cpp "%PROTOBUF_X64_LIBRARY%" glew\glew.c opengl32.lib Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib Winmm.lib /EHsc /MP12 /link /OUT:steam_api64.dll cl /LD steamclient.cpp /EHsc /MP12 /link /OUT:steamclient64.dll cl /LD steamnetworkingsockets.cpp /EHsc /MP12 /link /OUT:steamnetworkingsockets64.dll diff --git a/build_win_lobby_connect.bat b/build_win_lobby_connect.bat index 99c167a..27c83e5 100755 --- a/build_win_lobby_connect.bat +++ b/build_win_lobby_connect.bat @@ -6,7 +6,7 @@ call build_set_protobuf_directories.bat "%PROTOC_X86_EXE%" -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto call build_env_x86.bat cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /DNO_OVERLAY /DNO_DISK_WRITES /DLOBBY_CONNECT /DEMU_RELEASE_BUILD /DNDEBUG /I%PROTOBUF_X86_DIRECTORY%\include\ lobby_connect.cpp dll/*.cpp dll/*.cc "%PROTOBUF_X86_LIBRARY%" Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib Comdlg32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\lobby_connect\lobby_connect.exe +cl /DNO_DISK_WRITES /DLOBBY_CONNECT /DEMU_RELEASE_BUILD /DNDEBUG /I%PROTOBUF_X86_DIRECTORY%\include\ lobby_connect.cpp dll/*.cpp dll/*.cc "%PROTOBUF_X86_LIBRARY%" Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib Comdlg32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\lobby_connect\lobby_connect.exe del /Q /S release\lobby_connect\*.lib del /Q /S release\lobby_connect\*.exp copy Readme_lobby_connect.txt release\lobby_connect\Readme.txt diff --git a/build_win_release.bat b/build_win_release.bat index 56386cb..79e7804 100755 --- a/build_win_release.bat +++ b/build_win_release.bat @@ -10,12 +10,12 @@ call build_set_protobuf_directories.bat "%PROTOC_X86_EXE%" -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto call build_env_x86.bat cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /LD /DNO_OVERLAY /DEMU_RELEASE_BUILD /DNDEBUG /I%PROTOBUF_X86_DIRECTORY%\include\ dll/*.cpp dll/*.cc "%PROTOBUF_X86_LIBRARY%" Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\steam_api.dll +cl /LD /DEMU_RELEASE_BUILD /DNDEBUG /I%PROTOBUF_X86_DIRECTORY%\include\ dll/*.cpp dll/*.cc "%PROTOBUF_X86_LIBRARY%" Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\steam_api.dll "%PROTOC_X64_EXE%" -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto call build_env_x64.bat cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /LD /DNO_OVERLAY /DEMU_RELEASE_BUILD /DNDEBUG /I%PROTOBUF_X64_DIRECTORY%\include\ dll/*.cpp dll/*.cc "%PROTOBUF_X64_LIBRARY%" Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\steam_api64.dll +cl /LD /DEMU_RELEASE_BUILD /DNDEBUG /I%PROTOBUF_X64_DIRECTORY%\include\ dll/*.cpp dll/*.cc "%PROTOBUF_X64_LIBRARY%" Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\steam_api64.dll copy Readme_release.txt release\Readme.txt xcopy /s files_example\* release\ call build_win_release_experimental.bat diff --git a/build_win_release_experimental.bat b/build_win_release_experimental.bat index 3c51e2d..d3ab784 100755 --- a/build_win_release_experimental.bat +++ b/build_win_release_experimental.bat @@ -6,11 +6,11 @@ call build_set_protobuf_directories.bat "%PROTOC_X86_EXE%" -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto call build_env_x86.bat cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DGLEW_STATIC /DCONTROLLER_SUPPORT /DNDEBUG /IImGui /Iglew\include /I%PROTOBUF_X86_DIRECTORY%\include\ dll/*.cpp dll/*.cc detours/*.cpp controller/gamepad.c ImGui/*.cpp ImGui/impls/*.cpp ImGui/impls/windows/*.cpp overlay_experimental/*.cpp overlay_experimental/windows/*.cpp "%PROTOBUF_X86_LIBRARY%" glew\lib\Release\Win32\glew32s.lib opengl32.lib Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib Winmm.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\experimental\steam_api.dll +cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DGLEW_STATIC /DCONTROLLER_SUPPORT /DEMU_OVERLAY /DNDEBUG /IImGui /Iglew\include /I%PROTOBUF_X86_DIRECTORY%\include\ dll/*.cpp dll/*.cc detours/*.cpp controller/gamepad.c ImGui/*.cpp ImGui/impls/*.cpp ImGui/impls/windows/*.cpp overlay_experimental/*.cpp overlay_experimental/windows/*.cpp "%PROTOBUF_X86_LIBRARY%" glew\glew.c opengl32.lib Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib Winmm.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\experimental\steam_api.dll cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DNDEBUG steamclient.cpp /EHsc /MP12 /Ox /link /OUT:release\experimental\steamclient.dll "%PROTOC_X64_EXE%" -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto call build_env_x64.bat cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DGLEW_STATIC /DCONTROLLER_SUPPORT /DNDEBUG /IImGui /Iglew\include /I%PROTOBUF_X64_DIRECTORY%\include\ dll/*.cpp dll/*.cc detours/*.cpp controller/gamepad.c ImGui/*.cpp ImGui/impls/*.cpp ImGui/impls/windows/*.cpp overlay_experimental/*.cpp overlay_experimental/windows/*.cpp "%PROTOBUF_X64_LIBRARY%" glew\lib\Release\x64\glew32s.lib opengl32.lib Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib Winmm.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\experimental\steam_api64.dll +cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DGLEW_STATIC /DCONTROLLER_SUPPORT /DEMU_OVERLAY /DNDEBUG /IImGui /Iglew\include /I%PROTOBUF_X64_DIRECTORY%\include\ dll/*.cpp dll/*.cc detours/*.cpp controller/gamepad.c ImGui/*.cpp ImGui/impls/*.cpp ImGui/impls/windows/*.cpp overlay_experimental/*.cpp overlay_experimental/windows/*.cpp "%PROTOBUF_X64_LIBRARY%" glew\glew.c opengl32.lib Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib Winmm.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\experimental\steam_api64.dll cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DNDEBUG steamclient.cpp /EHsc /MP12 /Ox /link /OUT:release\experimental\steamclient64.dll copy Readme_experimental.txt release\experimental\Readme.txt diff --git a/build_win_release_experimental_steamclient.bat b/build_win_release_experimental_steamclient.bat index 1a1312e..22566d4 100644 --- a/build_win_release_experimental_steamclient.bat +++ b/build_win_release_experimental_steamclient.bat @@ -6,11 +6,11 @@ call build_set_protobuf_directories.bat "%PROTOC_X86_EXE%" -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto call build_env_x86.bat cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DSTEAMCLIENT_DLL /DCONTROLLER_SUPPORT /DNDEBUG /I%PROTOBUF_X86_DIRECTORY%\include\ dll/*.cpp dll/*.cc detours/*.cpp controller/gamepad.c "%PROTOBUF_X86_LIBRARY%" Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\experimental_steamclient\steamclient.dll +cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DSTEAMCLIENT_DLL /DCONTROLLER_SUPPORT /DEMU_OVERLAY /DGLEW_STATIC /IImGui /Iglew\include /DNDEBUG /I%PROTOBUF_X86_DIRECTORY%\include\ dll/*.cpp dll/*.cc detours/*.cpp controller/gamepad.c ImGui/*.cpp ImGui/impls/*.cpp ImGui/impls/windows/*.cpp overlay_experimental/*.cpp overlay_experimental/windows/*.cpp "%PROTOBUF_X86_LIBRARY%" glew\glew.c opengl32.lib Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib Winmm.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\experimental_steamclient\steamclient.dll "%PROTOC_X64_EXE%" -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto cl steamclient_loader/*.cpp advapi32.lib user32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\experimental_steamclient\steamclient_loader.exe copy steamclient_loader\ColdClientLoader.ini release\experimental_steamclient\ call build_env_x64.bat cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DSTEAMCLIENT_DLL /DCONTROLLER_SUPPORT /DNDEBUG /I%PROTOBUF_X64_DIRECTORY%\include\ dll/*.cpp dll/*.cc detours/*.cpp controller/gamepad.c "%PROTOBUF_X64_LIBRARY%" Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\experimental_steamclient\steamclient64.dll +cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DSTEAMCLIENT_DLL /DCONTROLLER_SUPPORT /DEMU_OVERLAY /DGLEW_STATIC /IImGui /Iglew\include /DNDEBUG /I%PROTOBUF_X64_DIRECTORY%\include\ dll/*.cpp dll/*.cc detours/*.cpp controller/gamepad.c ImGui/*.cpp ImGui/impls/*.cpp ImGui/impls/windows/*.cpp overlay_experimental/*.cpp overlay_experimental/windows/*.cpp "%PROTOBUF_X64_LIBRARY%" glew\glew.c opengl32.lib Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib Winmm.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\experimental_steamclient\steamclient64.dll copy Readme_experimental_steamclient.txt release\experimental_steamclient\Readme.txt diff --git a/dll/dll.cpp b/dll/dll.cpp index d751cbf..8b12702 100644 --- a/dll/dll.cpp +++ b/dll/dll.cpp @@ -221,14 +221,9 @@ STEAMAPI_API bool S_CALLTYPE SteamAPI_Init() crack_SteamAPI_Init(); #endif load_old_interface_versions(); - user_steam_pipe = get_steam_client()->CreateSteamPipe(); - get_steam_client()->ConnectToGlobalUser(user_steam_pipe); - Steam_Client* client = get_steam_client(); -#ifndef NO_OVERLAY - if( client->enable_overlay ) - client->steam_overlay->SetupOverlay(); -#endif + user_steam_pipe = client->CreateSteamPipe(); + client->ConnectToGlobalUser(user_steam_pipe); return true; } diff --git a/dll/net.proto b/dll/net.proto index d30e9af..e486ae3 100644 --- a/dll/net.proto +++ b/dll/net.proto @@ -211,7 +211,7 @@ message Common_Message { Friend_Messages friend_messages = 11; Network_Old network_old = 12; Networking_Sockets networking_sockets = 13; - Steam_Messages steam_messages = 14; + Steam_Messages steam_messages = 14; } uint32 source_ip = 128; diff --git a/dll/settings.h b/dll/settings.h index e422dc0..697fe38 100644 --- a/dll/settings.h +++ b/dll/settings.h @@ -139,6 +139,9 @@ public: //networking bool disable_networking = false; + + //overlay + bool disable_overlay = false; }; #endif diff --git a/dll/settings_parser.cpp b/dll/settings_parser.cpp index ebbec1c..0ccb5f5 100644 --- a/dll/settings_parser.cpp +++ b/dll/settings_parser.cpp @@ -250,6 +250,7 @@ uint32 create_localstorage_settings(Settings **settings_client_out, Settings **s bool steam_offline_mode = false; bool disable_networking = false; + bool disable_overlay = false; { std::string steam_settings_path = Local_Storage::get_game_settings_path(); @@ -260,6 +261,8 @@ uint32 create_localstorage_settings(Settings **settings_client_out, Settings **s steam_offline_mode = true; } else if (p == "disable_networking.txt") { disable_networking = true; + } else if (p == "disable_overlay.txt") { + disable_overlay = true; } } } @@ -272,6 +275,8 @@ uint32 create_localstorage_settings(Settings **settings_client_out, Settings **s settings_server->custom_broadcasts = custom_broadcasts; settings_client->disable_networking = disable_networking; settings_server->disable_networking = disable_networking; + settings_client->disable_overlay = disable_overlay; + settings_server->disable_overlay = disable_overlay; { std::string dlc_config_path = Local_Storage::get_game_settings_path() + "DLC.txt"; diff --git a/dll/steam_client.cpp b/dll/steam_client.cpp index c537f13..d80e348 100644 --- a/dll/steam_client.cpp +++ b/dll/steam_client.cpp @@ -48,11 +48,6 @@ Steam_Client::Steam_Client() { uint32 appid = create_localstorage_settings(&settings_client, &settings_server, &local_storage); - { - std::ifstream chk_ovlay(Local_Storage::get_program_path() + PATH_SEPARATOR + "disable_overlay.txt", std::ios::in); - if (chk_ovlay) - enable_overlay = false; - } network = new Networking(settings_server->get_local_steam_id(), appid, settings_server->get_port(), &(settings_server->custom_broadcasts), settings_server->disable_networking); callback_results_client = new SteamCallResults(); @@ -71,7 +66,7 @@ Steam_Client::Steam_Client() steam_matchmaking = new Steam_Matchmaking(settings_client, network, callback_results_client, callbacks_client, run_every_runcb); steam_matchmaking_servers = new Steam_Matchmaking_Servers(settings_client, network); - steam_user_stats = new Steam_User_Stats(settings_client, local_storage, callback_results_client, callbacks_client); + steam_user_stats = new Steam_User_Stats(settings_client, local_storage, callback_results_client, callbacks_client, steam_overlay); steam_apps = new Steam_Apps(settings_client, callback_results_client); steam_networking = new Steam_Networking(settings_client, network, callbacks_client, run_every_runcb); steam_remote_storage = new Steam_Remote_Storage(settings_client, local_storage, callback_results_client); @@ -197,6 +192,10 @@ HSteamUser Steam_Client::ConnectToGlobalUser( HSteamPipe hSteamPipe ) } userLogIn(); +#ifdef EMU_OVERLAY + if(!settings_client->disable_overlay) + steam_overlay->SetupOverlay(); +#endif steam_pipes[hSteamPipe] = Steam_Pipe::CLIENT; return CLIENT_HSTEAMUSER; } @@ -711,7 +710,7 @@ ISteamScreenshots *Steam_Client::GetISteamScreenshots( HSteamUser hSteamuser, HS // Deprecated. Applications should use SteamAPI_RunCallbacks() or SteamGameServer_RunCallbacks() instead. void Steam_Client::RunFrame() { - PRINT_DEBUG("RunFrame\n"); + PRINT_DEBUG("Steam_Client::RunFrame\n"); } // returns the number of IPC calls made since the last time this function was called diff --git a/dll/steam_client.h b/dll/steam_client.h index 8b7a2c7..5812881 100644 --- a/dll/steam_client.h +++ b/dll/steam_client.h @@ -131,7 +131,6 @@ public: Steam_Overlay* steam_overlay; - bool enable_overlay = true; bool user_logged_in = false; bool server_init = false; std::thread background_keepalive; diff --git a/dll/steam_user_stats.cpp b/dll/steam_user_stats.cpp deleted file mode 100644 index 9592309..0000000 --- a/dll/steam_user_stats.cpp +++ /dev/null @@ -1,829 +0,0 @@ -/* Copyright (C) 2019 Mr Goldberg - This file is part of the Goldberg Emulator - - The Goldberg Emulator is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 3 of the License, or (at your option) any later version. - - The Goldberg Emulator is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the Goldberg Emulator; if not, see - . */ - -#include "steam_user_stats.h" -#include "dll.h" - -unsigned int Steam_User_Stats::find_leaderboard(std::string name) -{ - unsigned index = 1; - for (auto& leaderboard : leaderboards) { - if (leaderboard.name == name) return index; - ++index; - } - - return 0; -} - -void Steam_User_Stats::load_achievements_db() -{ - std::string file_path = Local_Storage::get_game_settings_path() + achievements_user_file; - local_storage->load_json(file_path, defined_achievements); -} - -void Steam_User_Stats::load_achievements() -{ - local_storage->load_json_file("", achievements_user_file, user_achievements); -} - -void Steam_User_Stats::save_achievements() -{ - local_storage->write_json_file("", achievements_user_file, user_achievements); -} - -Steam_User_Stats::Steam_User_Stats(Settings *settings, Local_Storage *local_storage, class SteamCallResults *callback_results, class SteamCallBacks *callbacks): - settings(settings), - local_storage(local_storage), - callback_results(callback_results), - callbacks(callbacks), - defined_achievements(nlohmann::json::object()), - user_achievements(nlohmann::json::object()) -{ - load_achievements_db(); // achievements db - load_achievements(); // achievements per user -} - -nlohmann::json const& Steam_User_Stats::GetAchievementsDb() const -{ - return defined_achievements; -} - -// Ask the server to send down this user's data and achievements for this game -STEAM_CALL_BACK(UserStatsReceived_t) -bool Steam_User_Stats::RequestCurrentStats() -{ - PRINT_DEBUG("Steam_User_Stats::RequestCurrentStats\n"); - std::lock_guard lock(global_mutex); - - UserStatsReceived_t data; - data.m_nGameID = settings->get_local_game_id().ToUint64(); - data.m_eResult = k_EResultOK; - data.m_steamIDUser = settings->get_local_steam_id(); - callbacks->addCBResult(data.k_iCallback, &data, sizeof(data), 0.1); - return true; -} - - -// Data accessors -bool Steam_User_Stats::GetStat(const char* pchName, int32* pData) -{ - PRINT_DEBUG("GetStat int32 %s\n", pchName); - if (!pchName || !pData) return false; - std::lock_guard lock(global_mutex); - auto stats_config = settings->getStats(); - auto stats_data = stats_config.find(pchName); - if (stats_data != stats_config.end()) { - if (stats_data->second.type != Stat_Type::STAT_TYPE_INT) return false; - } - - int read_data = local_storage->get_data(Local_Storage::stats_storage_folder, pchName, (char*)pData, sizeof(*pData)); - if (read_data == sizeof(int32)) - return true; - - if (stats_data != stats_config.end()) { - *pData = stats_data->second.default_value_int; - return true; - } - - return false; -} - -bool Steam_User_Stats::GetStat(const char* pchName, float* pData) -{ - PRINT_DEBUG("GetStat float %s\n", pchName); - if (!pchName || !pData) return false; - std::lock_guard lock(global_mutex); - auto stats_config = settings->getStats(); - auto stats_data = stats_config.find(pchName); - if (stats_data != stats_config.end()) { - if (stats_data->second.type == Stat_Type::STAT_TYPE_INT) return false; - } - - int read_data = local_storage->get_data(Local_Storage::stats_storage_folder, pchName, (char*)pData, sizeof(*pData)); - if (read_data == sizeof(float)) - return true; - - if (stats_data != stats_config.end()) { - *pData = stats_data->second.default_value_float; - return true; - } - - return false; -} - - -// Set / update data -bool Steam_User_Stats::SetStat(const char* pchName, int32 nData) -{ - PRINT_DEBUG("SetStat int32 %s\n", pchName); - if (!pchName) return false; - std::lock_guard lock(global_mutex); - - return local_storage->store_data(Local_Storage::stats_storage_folder, pchName, (char*)&nData, sizeof(nData)) == sizeof(nData); -} - -bool Steam_User_Stats::SetStat(const char* pchName, float fData) -{ - PRINT_DEBUG("SetStat float %s\n", pchName); - if (!pchName) return false; - std::lock_guard lock(global_mutex); - - return local_storage->store_data(Local_Storage::stats_storage_folder, pchName, (char*)&fData, sizeof(fData)) == sizeof(fData); -} - -bool Steam_User_Stats::UpdateAvgRateStat(const char* pchName, float flCountThisSession, double dSessionLength) -{ - PRINT_DEBUG("UpdateAvgRateStat %s\n", pchName); - std::lock_guard lock(global_mutex); - - char data[sizeof(float) + sizeof(float) + sizeof(double)]; - int read_data = local_storage->get_data(Local_Storage::stats_storage_folder, pchName, (char*)data, sizeof(*data)); - float oldcount = 0; - double oldsessionlength = 0; - if (read_data == sizeof(data)) { - memcpy(&oldcount, data + sizeof(float), sizeof(oldcount)); - memcpy(&oldsessionlength, data + sizeof(float) + sizeof(double), sizeof(oldsessionlength)); - } - - oldcount += flCountThisSession; - oldsessionlength += dSessionLength; - - float average = oldcount / oldsessionlength; - memcpy(data, &average, sizeof(average)); - memcpy(data + sizeof(float), &oldcount, sizeof(oldcount)); - memcpy(data + sizeof(float) * 2, &oldsessionlength, sizeof(oldsessionlength)); - - return local_storage->store_data(Local_Storage::stats_storage_folder, pchName, data, sizeof(data)) == sizeof(data); -} - - -// Achievement flag accessors -bool Steam_User_Stats::GetAchievement(const char* pchName, bool* pbAchieved) -{ - PRINT_DEBUG("GetAchievement %s\n", pchName); - if (pchName == nullptr) return false; - std::lock_guard lock(global_mutex); - - try { - auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { - return item["name"].get() == pchName; - }); - auto ach = user_achievements.find(pchName); - if (it != defined_achievements.end() && ach != user_achievements.end()) { - if (pbAchieved != nullptr) *pbAchieved = (*ach)["earned"]; - return true; - } - } - catch (...) {} - - if (pbAchieved != nullptr)*pbAchieved = false; - - return false; -} - -bool Steam_User_Stats::SetAchievement(const char* pchName) -{ - PRINT_DEBUG("SetAchievement %s\n", pchName); - if (pchName == nullptr) return false; - - try { - auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { - return item["name"].get() == pchName; - }); - if (it != defined_achievements.end()) { - if (user_achievements.find(pchName) == user_achievements.end() || user_achievements[pchName].value("earned", false) == false) { - user_achievements[pchName]["earned"] = true; - user_achievements[pchName]["earned_time"] = std::chrono::duration_cast>(std::chrono::system_clock::now().time_since_epoch()).count(); -#ifndef NO_OVERLAY - get_steam_client()->steam_overlay->AddAchievementNotification(it.value()); -#endif - } - return true; - } - } - catch (...) {} - - return false; -} - -bool Steam_User_Stats::ClearAchievement(const char* pchName) -{ - PRINT_DEBUG("ClearAchievement %s\n", pchName); - if (pchName == nullptr) return false; - std::lock_guard lock(global_mutex); - - try { - auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { - return static_cast(item["name"]) == pchName; - }); - if (it != defined_achievements.end()) { - user_achievements[pchName]["earned"] = false; - user_achievements[pchName]["earned_time"] = static_cast(0); - return true; - } - } - catch (...) {} - - return false; -} - - -// Get the achievement status, and the time it was unlocked if unlocked. -// If the return value is true, but the unlock time is zero, that means it was unlocked before Steam -// began tracking achievement unlock times (December 2009). Time is seconds since January 1, 1970. -bool Steam_User_Stats::GetAchievementAndUnlockTime(const char* pchName, bool* pbAchieved, uint32* punUnlockTime) -{ - PRINT_DEBUG("GetAchievementAndUnlockTime\n"); - if (pchName == nullptr) return false; - std::lock_guard lock(global_mutex); - - try { - auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { - return static_cast(item["name"]) == pchName; - }); - auto ach = user_achievements.find(pchName); - if (it != defined_achievements.end() && ach != user_achievements.end()) { - if (pbAchieved != nullptr) *pbAchieved = (*ach)["earned"]; - if (punUnlockTime != nullptr) *punUnlockTime = (*ach)["earned_time"]; - return true; - } - } - catch (...) {} - - if (pbAchieved != nullptr) *pbAchieved = false; - if (punUnlockTime != nullptr) *punUnlockTime = 0; - return true; -} - - -// Store the current data on the server, will get a callback when set -// And one callback for every new achievement -// -// If the callback has a result of k_EResultInvalidParam, one or more stats -// uploaded has been rejected, either because they broke constraints -// or were out of date. In this case the server sends back updated values. -// The stats should be re-iterated to keep in sync. -bool Steam_User_Stats::StoreStats() -{ - PRINT_DEBUG("StoreStats\n"); - std::lock_guard lock(global_mutex); - - save_achievements(); - - UserStatsStored_t data; - data.m_nGameID = settings->get_local_game_id().ToUint64(); - data.m_eResult = k_EResultOK; - callbacks->addCBResult(data.k_iCallback, &data, sizeof(data)); - return true; -} - - -// Achievement / GroupAchievement metadata - -// Gets the icon of the achievement, which is a handle to be used in ISteamUtils::GetImageRGBA(), or 0 if none set. -// A return value of 0 may indicate we are still fetching data, and you can wait for the UserAchievementIconFetched_t callback -// which will notify you when the bits are ready. If the callback still returns zero, then there is no image set for the -// specified achievement. -int Steam_User_Stats::GetAchievementIcon(const char* pchName) -{ - PRINT_DEBUG("GetAchievementIcon\n"); - if (pchName == nullptr) return 0; - std::lock_guard lock(global_mutex); - - return 0; -} - - -// Get general attributes for an achievement. Accepts the following keys: -// - "name" and "desc" for retrieving the localized achievement name and description (returned in UTF8) -// - "hidden" for retrieving if an achievement is hidden (returns "0" when not hidden, "1" when hidden) -const char* Steam_User_Stats::GetAchievementDisplayAttribute(const char* pchName, const char* pchKey) -{ - PRINT_DEBUG("GetAchievementDisplayAttribute %s %s\n", pchName, pchKey); - if (pchName == nullptr) return ""; - if (pchKey == nullptr) return ""; - - std::lock_guard lock(global_mutex); - - if (strcmp (pchKey, "name") == 0) { - try { - auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { - return static_cast(item["name"]) == pchName; - }); - if (it != defined_achievements.end()) { - return it.value()["displayName"].get_ptr()->c_str(); - } - } - catch (...) {} - } - - if (strcmp(pchKey, "desc") == 0) { - try { - auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { - return static_cast(item["name"]) == pchName; - }); - if (it != defined_achievements.end()) { - return it.value()["description"].get_ptr()->c_str(); - } - } - catch (...) {} - } - - if (strcmp(pchKey, "hidden") == 0) { - try { - auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { - return static_cast(item["name"]) == pchName; - }); - if (it != defined_achievements.end()) { - return it.value()["hidden"].get_ptr()->c_str(); - } - } - catch (...) {} - } - - return ""; -} - - -// Achievement progress - triggers an AchievementProgress callback, that is all. -// Calling this w/ N out of N progress will NOT set the achievement, the game must still do that. -bool Steam_User_Stats::IndicateAchievementProgress(const char* pchName, uint32 nCurProgress, uint32 nMaxProgress) -{ - PRINT_DEBUG("IndicateAchievementProgress\n"); - if (pchName == nullptr) return false; - std::lock_guard lock(global_mutex); - - try { - auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { - return static_cast(item["name"]) == pchName; - }); - auto ach = user_achievements.find(pchName); - if (it != defined_achievements.end()) { - bool achieved = false; - if (ach != user_achievements.end()) { - bool achieved = ach->value("earned", false); - } - - UserAchievementStored_t data = {}; - data.m_nGameID = settings->get_local_game_id().ToUint64(); - data.m_bGroupAchievement = false; - strncpy(data.m_rgchAchievementName, pchName, k_cchStatNameMax); - - if (achieved) { - data.m_nCurProgress = 0; - data.m_nMaxProgress = 0; - } - else { - user_achievements[pchName]["progress"] = nCurProgress; - user_achievements[pchName]["max_progress"] = nMaxProgress; - data.m_nCurProgress = nCurProgress; - data.m_nMaxProgress = nMaxProgress; - } - - save_achievements(); - callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); - return true; - } - } - catch (...) {} - - return false; -} - - -// Used for iterating achievements. In general games should not need these functions because they should have a -// list of existing achievements compiled into them -uint32 Steam_User_Stats::GetNumAchievements() -{ - PRINT_DEBUG("GetNumAchievements\n"); - std::lock_guard lock(global_mutex); - return defined_achievements.size(); -} - -// Get achievement name iAchievement in [0,GetNumAchievements) -const char* Steam_User_Stats::GetAchievementName(uint32 iAchievement) -{ - PRINT_DEBUG("GetAchievementName\n"); - try { - static std::string achievement_name; - achievement_name = defined_achievements[iAchievement]["name"].get(); - return achievement_name.c_str(); - } - catch (...) {} - return ""; -} - - -// Friends stats & achievements - -// downloads stats for the user -// returns a UserStatsReceived_t received when completed -// if the other user has no stats, UserStatsReceived_t.m_eResult will be set to k_EResultFail -// these stats won't be auto-updated; you'll need to call RequestUserStats() again to refresh any data -STEAM_CALL_RESULT(UserStatsReceived_t) -SteamAPICall_t Steam_User_Stats::RequestUserStats(CSteamID steamIDUser) -{ - PRINT_DEBUG("Steam_User_Stats::RequestUserStats %llu\n", steamIDUser.ConvertToUint64()); - std::lock_guard lock(global_mutex); - - // Enable this to allow hot reload achievements status - //if (steamIDUser == settings->get_local_steam_id()) { - // load_achievements(); - //} - - - UserStatsReceived_t data; - data.m_nGameID = settings->get_local_game_id().ToUint64(); - data.m_eResult = k_EResultOK; - data.m_steamIDUser = steamIDUser; - return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data), 0.1); -} - - -// requests stat information for a user, usable after a successful call to RequestUserStats() -bool Steam_User_Stats::GetUserStat(CSteamID steamIDUser, const char* pchName, int32* pData) -{ - PRINT_DEBUG("GetUserStat %s %llu\n", pchName, steamIDUser.ConvertToUint64()); - if (pchName == nullptr) return false; - - std::lock_guard lock(global_mutex); - - if (steamIDUser == settings->get_local_steam_id()) { - GetStat(pchName, pData); - } - else { - *pData = 0; - } - - return true; -} - -bool Steam_User_Stats::GetUserStat(CSteamID steamIDUser, const char* pchName, float* pData) -{ - PRINT_DEBUG("GetUserStat %s %llu\n", pchName, steamIDUser.ConvertToUint64()); - if (pchName == nullptr) return false; - - std::lock_guard lock(global_mutex); - - if (steamIDUser == settings->get_local_steam_id()) { - GetStat(pchName, pData); - } - else { - *pData = 0; - } - - return true; -} - -bool Steam_User_Stats::GetUserAchievement(CSteamID steamIDUser, const char* pchName, bool* pbAchieved) -{ - PRINT_DEBUG("GetUserAchievement %s\n", pchName); - if (pchName == nullptr) return false; - std::lock_guard lock(global_mutex); - - if (steamIDUser == settings->get_local_steam_id()) { - return GetAchievement(pchName, pbAchieved); - } - - return false; -} - -// See notes for GetAchievementAndUnlockTime above -bool Steam_User_Stats::GetUserAchievementAndUnlockTime(CSteamID steamIDUser, const char* pchName, bool* pbAchieved, uint32* punUnlockTime) -{ - PRINT_DEBUG("GetUserAchievementAndUnlockTime %s\n", pchName); - if (pchName == nullptr) return false; - std::lock_guard lock(global_mutex); - - if (steamIDUser == settings->get_local_steam_id()) { - return GetAchievementAndUnlockTime(pchName, pbAchieved, punUnlockTime); - } - return false; -} - - -// Reset stats -bool Steam_User_Stats::ResetAllStats(bool bAchievementsToo) -{ - PRINT_DEBUG("ResetAllStats\n"); - std::lock_guard lock(global_mutex); - //TODO - if (bAchievementsToo) { - std::for_each(user_achievements.begin(), user_achievements.end(), [](nlohmann::json& v) { - v["earned"] = false; - v["earned_time"] = 0; - }); - } - - return true; -} - - -// Leaderboard functions - -// asks the Steam back-end for a leaderboard by name, and will create it if it's not yet -// This call is asynchronous, with the result returned in LeaderboardFindResult_t -STEAM_CALL_RESULT(LeaderboardFindResult_t) -SteamAPICall_t Steam_User_Stats::FindOrCreateLeaderboard(const char* pchLeaderboardName, ELeaderboardSortMethod eLeaderboardSortMethod, ELeaderboardDisplayType eLeaderboardDisplayType) -{ - PRINT_DEBUG("FindOrCreateLeaderboard %s\n", pchLeaderboardName); - std::lock_guard lock(global_mutex); - - unsigned int leader = find_leaderboard(pchLeaderboardName); - if (!leader) { - struct Steam_Leaderboard leaderboard; - leaderboard.name = std::string(pchLeaderboardName); - leaderboard.sort_method = eLeaderboardSortMethod; - leaderboard.display_type = eLeaderboardDisplayType; - leaderboards.push_back(leaderboard); - leader = leaderboards.size(); - } - - LeaderboardFindResult_t data; - data.m_hSteamLeaderboard = leader; - data.m_bLeaderboardFound = 1; - return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); -} - - -// as above, but won't create the leaderboard if it's not found -// This call is asynchronous, with the result returned in LeaderboardFindResult_t -STEAM_CALL_RESULT(LeaderboardFindResult_t) -SteamAPICall_t Steam_User_Stats::FindLeaderboard(const char* pchLeaderboardName) -{ - PRINT_DEBUG("FindLeaderboard %s\n", pchLeaderboardName); - std::lock_guard lock(global_mutex); - - auto settings_Leaderboards = settings->getLeaderboards(); - if (settings_Leaderboards.count(pchLeaderboardName)) { - auto config = settings_Leaderboards[pchLeaderboardName]; - return FindOrCreateLeaderboard(pchLeaderboardName, config.sort_method, config.display_type); - } - else if (settings->createUnknownLeaderboards()) { - return FindOrCreateLeaderboard(pchLeaderboardName, k_ELeaderboardSortMethodDescending, k_ELeaderboardDisplayTypeNumeric); - } - else { - LeaderboardFindResult_t data; - data.m_hSteamLeaderboard = find_leaderboard(pchLeaderboardName);; - data.m_bLeaderboardFound = !!data.m_hSteamLeaderboard; - return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); - } -} - - -// returns the name of a leaderboard -const char* Steam_User_Stats::GetLeaderboardName(SteamLeaderboard_t hSteamLeaderboard) -{ - PRINT_DEBUG("GetLeaderboardName\n"); - std::lock_guard lock(global_mutex); - - if (hSteamLeaderboard > leaderboards.size() || hSteamLeaderboard <= 0) return ""; - return leaderboards[hSteamLeaderboard - 1].name.c_str(); -} - - -// returns the total number of entries in a leaderboard, as of the last request -int Steam_User_Stats::GetLeaderboardEntryCount(SteamLeaderboard_t hSteamLeaderboard) -{ - PRINT_DEBUG("GetLeaderboardEntryCount\n"); - return 0; -} - - -// returns the sort method of the leaderboard -ELeaderboardSortMethod Steam_User_Stats::GetLeaderboardSortMethod(SteamLeaderboard_t hSteamLeaderboard) -{ - PRINT_DEBUG("GetLeaderboardSortMethod\n"); - std::lock_guard lock(global_mutex); - if (hSteamLeaderboard > leaderboards.size() || hSteamLeaderboard <= 0) return k_ELeaderboardSortMethodNone; - return leaderboards[hSteamLeaderboard - 1].sort_method; -} - - -// returns the display type of the leaderboard -ELeaderboardDisplayType Steam_User_Stats::GetLeaderboardDisplayType(SteamLeaderboard_t hSteamLeaderboard) -{ - PRINT_DEBUG("GetLeaderboardDisplayType\n"); - std::lock_guard lock(global_mutex); - if (hSteamLeaderboard > leaderboards.size() || hSteamLeaderboard <= 0) return k_ELeaderboardDisplayTypeNone; - return leaderboards[hSteamLeaderboard - 1].display_type; -} - - -// Asks the Steam back-end for a set of rows in the leaderboard. -// This call is asynchronous, with the result returned in LeaderboardScoresDownloaded_t -// LeaderboardScoresDownloaded_t will contain a handle to pull the results from GetDownloadedLeaderboardEntries() (below) -// You can ask for more entries than exist, and it will return as many as do exist. -// k_ELeaderboardDataRequestGlobal requests rows in the leaderboard from the full table, with nRangeStart & nRangeEnd in the range [1, TotalEntries] -// k_ELeaderboardDataRequestGlobalAroundUser requests rows around the current user, nRangeStart being negate -// e.g. DownloadLeaderboardEntries( hLeaderboard, k_ELeaderboardDataRequestGlobalAroundUser, -3, 3 ) will return 7 rows, 3 before the user, 3 after -// k_ELeaderboardDataRequestFriends requests all the rows for friends of the current user -STEAM_CALL_RESULT(LeaderboardScoresDownloaded_t) -SteamAPICall_t Steam_User_Stats::DownloadLeaderboardEntries(SteamLeaderboard_t hSteamLeaderboard, ELeaderboardDataRequest eLeaderboardDataRequest, int nRangeStart, int nRangeEnd) -{ - PRINT_DEBUG("DownloadLeaderboardEntries %llu %i %i %i\n", hSteamLeaderboard, eLeaderboardDataRequest, nRangeStart, nRangeEnd); - std::lock_guard lock(global_mutex); - LeaderboardScoresDownloaded_t data; - data.m_hSteamLeaderboard = hSteamLeaderboard; - data.m_hSteamLeaderboardEntries = 123; - data.m_cEntryCount = 0; - return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); -} - -// as above, but downloads leaderboard entries for an arbitrary set of users - ELeaderboardDataRequest is k_ELeaderboardDataRequestUsers -// if a user doesn't have a leaderboard entry, they won't be included in the result -// a max of 100 users can be downloaded at a time, with only one outstanding call at a time -STEAM_METHOD_DESC(Downloads leaderboard entries for an arbitrary set of users - ELeaderboardDataRequest is k_ELeaderboardDataRequestUsers) -STEAM_CALL_RESULT(LeaderboardScoresDownloaded_t) -SteamAPICall_t Steam_User_Stats::DownloadLeaderboardEntriesForUsers(SteamLeaderboard_t hSteamLeaderboard, - STEAM_ARRAY_COUNT_D(cUsers, Array of users to retrieve) CSteamID * prgUsers, int cUsers) -{ - PRINT_DEBUG("DownloadLeaderboardEntriesForUsers %i %llu\n", cUsers, cUsers > 0 ? prgUsers[0].ConvertToUint64() : 0); - std::lock_guard lock(global_mutex); - LeaderboardScoresDownloaded_t data; - data.m_hSteamLeaderboard = hSteamLeaderboard; - data.m_hSteamLeaderboardEntries = 123; - data.m_cEntryCount = 0; - return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); -} - - -// Returns data about a single leaderboard entry -// use a for loop from 0 to LeaderboardScoresDownloaded_t::m_cEntryCount to get all the downloaded entries -// e.g. -// void OnLeaderboardScoresDownloaded( LeaderboardScoresDownloaded_t *pLeaderboardScoresDownloaded ) -// { -// for ( int index = 0; index < pLeaderboardScoresDownloaded->m_cEntryCount; index++ ) -// { -// LeaderboardEntry_t leaderboardEntry; -// int32 details[3]; // we know this is how many we've stored previously -// GetDownloadedLeaderboardEntry( pLeaderboardScoresDownloaded->m_hSteamLeaderboardEntries, index, &leaderboardEntry, details, 3 ); -// assert( leaderboardEntry.m_cDetails == 3 ); -// ... -// } -// once you've accessed all the entries, the data will be free'd, and the SteamLeaderboardEntries_t handle will become invalid -bool Steam_User_Stats::GetDownloadedLeaderboardEntry(SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, LeaderboardEntry_t * pLeaderboardEntry, int32 * pDetails, int cDetailsMax) -{ - PRINT_DEBUG("GetDownloadedLeaderboardEntry\n"); - return false; -} - - -// Uploads a user score to the Steam back-end. -// This call is asynchronous, with the result returned in LeaderboardScoreUploaded_t -// Details are extra game-defined information regarding how the user got that score -// pScoreDetails points to an array of int32's, cScoreDetailsCount is the number of int32's in the list -STEAM_CALL_RESULT(LeaderboardScoreUploaded_t) -SteamAPICall_t Steam_User_Stats::UploadLeaderboardScore(SteamLeaderboard_t hSteamLeaderboard, ELeaderboardUploadScoreMethod eLeaderboardUploadScoreMethod, int32 nScore, const int32 * pScoreDetails, int cScoreDetailsCount) -{ - PRINT_DEBUG("UploadLeaderboardScore\n"); - std::lock_guard lock(global_mutex); - LeaderboardScoreUploaded_t data; - data.m_bSuccess = 1; //needs to be success or DOA6 freezes when uploading score. - //data.m_bSuccess = 0; - data.m_hSteamLeaderboard = hSteamLeaderboard; - data.m_nScore = nScore; - //data.m_bScoreChanged = 1; - data.m_bScoreChanged = 0; - //data.m_nGlobalRankNew = 1; - data.m_nGlobalRankNew = 0; - data.m_nGlobalRankPrevious = 0; - return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); -} - -SteamAPICall_t Steam_User_Stats::UploadLeaderboardScore(SteamLeaderboard_t hSteamLeaderboard, int32 nScore, int32 * pScoreDetails, int cScoreDetailsCount) -{ - PRINT_DEBUG("UploadLeaderboardScore old\n"); - return UploadLeaderboardScore(hSteamLeaderboard, k_ELeaderboardUploadScoreMethodKeepBest, nScore, pScoreDetails, cScoreDetailsCount); -} - - -// Attaches a piece of user generated content the user's entry on a leaderboard. -// hContent is a handle to a piece of user generated content that was shared using ISteamUserRemoteStorage::FileShare(). -// This call is asynchronous, with the result returned in LeaderboardUGCSet_t. -STEAM_CALL_RESULT(LeaderboardUGCSet_t) -SteamAPICall_t Steam_User_Stats::AttachLeaderboardUGC(SteamLeaderboard_t hSteamLeaderboard, UGCHandle_t hUGC) -{ - PRINT_DEBUG("AttachLeaderboardUGC\n"); - std::lock_guard lock(global_mutex); - LeaderboardUGCSet_t data = {}; - if (hSteamLeaderboard > leaderboards.size() || hSteamLeaderboard <= 0) { - data.m_eResult = k_EResultFail; - } - else { - data.m_eResult = k_EResultOK; - } - - data.m_hSteamLeaderboard = hSteamLeaderboard; - return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); -} - - -// Retrieves the number of players currently playing your game (online + offline) -// This call is asynchronous, with the result returned in NumberOfCurrentPlayers_t -STEAM_CALL_RESULT(NumberOfCurrentPlayers_t) -SteamAPICall_t Steam_User_Stats::GetNumberOfCurrentPlayers() -{ - PRINT_DEBUG("GetNumberOfCurrentPlayers\n"); - std::lock_guard lock(global_mutex); - NumberOfCurrentPlayers_t data; - data.m_bSuccess = 1; - data.m_cPlayers = 69; - return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); -} - - -// Requests that Steam fetch data on the percentage of players who have received each achievement -// for the game globally. -// This call is asynchronous, with the result returned in GlobalAchievementPercentagesReady_t. -STEAM_CALL_RESULT(GlobalAchievementPercentagesReady_t) -SteamAPICall_t Steam_User_Stats::RequestGlobalAchievementPercentages() -{ - PRINT_DEBUG("RequestGlobalAchievementPercentages\n"); -} - - -// Get the info on the most achieved achievement for the game, returns an iterator index you can use to fetch -// the next most achieved afterwards. Will return -1 if there is no data on achievement -// percentages (ie, you haven't called RequestGlobalAchievementPercentages and waited on the callback). -int Steam_User_Stats::GetMostAchievedAchievementInfo(char* pchName, uint32 unNameBufLen, float* pflPercent, bool* pbAchieved) -{ - PRINT_DEBUG("GetMostAchievedAchievementInfo\n"); -} - - -// Get the info on the next most achieved achievement for the game. Call this after GetMostAchievedAchievementInfo or another -// GetNextMostAchievedAchievementInfo call passing the iterator from the previous call. Returns -1 after the last -// achievement has been iterated. -int Steam_User_Stats::GetNextMostAchievedAchievementInfo(int iIteratorPrevious, char* pchName, uint32 unNameBufLen, float* pflPercent, bool* pbAchieved) -{ - PRINT_DEBUG("GetNextMostAchievedAchievementInfo\n"); -} - - -// Returns the percentage of users who have achieved the specified achievement. -bool Steam_User_Stats::GetAchievementAchievedPercent(const char* pchName, float* pflPercent) -{ - PRINT_DEBUG("GetAchievementAchievedPercent\n"); -} - - -// Requests global stats data, which is available for stats marked as "aggregated". -// This call is asynchronous, with the results returned in GlobalStatsReceived_t. -// nHistoryDays specifies how many days of day-by-day history to retrieve in addition -// to the overall totals. The limit is 60. -STEAM_CALL_RESULT(GlobalStatsReceived_t) -SteamAPICall_t Steam_User_Stats::RequestGlobalStats(int nHistoryDays) -{ - PRINT_DEBUG("RequestGlobalStats %i\n", nHistoryDays); - std::lock_guard lock(global_mutex); - GlobalStatsReceived_t data; - data.m_nGameID = settings->get_local_game_id().ToUint64(); - data.m_eResult = k_EResultOK; - return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); -} - - -// Gets the lifetime totals for an aggregated stat -bool Steam_User_Stats::GetGlobalStat(const char* pchStatName, int64 * pData) -{ - PRINT_DEBUG("GetGlobalStat %s\n", pchStatName); - return false; -} - -bool Steam_User_Stats::GetGlobalStat(const char* pchStatName, double* pData) -{ - PRINT_DEBUG("GetGlobalStat %s\n", pchStatName); - return false; -} - - -// Gets history for an aggregated stat. pData will be filled with daily values, starting with today. -// So when called, pData[0] will be today, pData[1] will be yesterday, and pData[2] will be two days ago, -// etc. cubData is the size in bytes of the pubData buffer. Returns the number of -// elements actually set. -int32 Steam_User_Stats::GetGlobalStatHistory(const char* pchStatName, STEAM_ARRAY_COUNT(cubData) int64 * pData, uint32 cubData) -{ - PRINT_DEBUG("GetGlobalStatHistory int64 %s\n", pchStatName); - return 0; -} - -int32 Steam_User_Stats::GetGlobalStatHistory(const char* pchStatName, STEAM_ARRAY_COUNT(cubData) double* pData, uint32 cubData) -{ - PRINT_DEBUG("GetGlobalStatHistory double %s\n", pchStatName); - return 0; -} diff --git a/dll/steam_user_stats.h b/dll/steam_user_stats.h index 974b854..744488c 100644 --- a/dll/steam_user_stats.h +++ b/dll/steam_user_stats.h @@ -19,6 +19,7 @@ #define __INCLUDED_STEAM_USER_STATS_H__ #include "base.h" +#include "../overlay_experimental/steam_overlay.h" #include #include @@ -31,236 +32,825 @@ struct Steam_Leaderboard { }; class Steam_User_Stats : - public ISteamUserStats003, - public ISteamUserStats004, - public ISteamUserStats005, - public ISteamUserStats006, - public ISteamUserStats007, - public ISteamUserStats008, - public ISteamUserStats009, - public ISteamUserStats010, - public ISteamUserStats +public ISteamUserStats003, +public ISteamUserStats004, +public ISteamUserStats005, +public ISteamUserStats006, +public ISteamUserStats007, +public ISteamUserStats008, +public ISteamUserStats009, +public ISteamUserStats010, +public ISteamUserStats { public: static constexpr auto achievements_user_file = "achievements.json"; private: - Local_Storage* local_storage; - Settings* settings; - SteamCallResults* callback_results; - class SteamCallBacks* callbacks; + Local_Storage *local_storage; + Settings *settings; + SteamCallResults *callback_results; + class SteamCallBacks *callbacks; + class Steam_Overlay* overlay; + std::vector leaderboards; - + nlohmann::json defined_achievements; nlohmann::json user_achievements; - unsigned int find_leaderboard(std::string name); +unsigned int find_leaderboard(std::string name) +{ + unsigned index = 1; + for (auto &leaderboard : leaderboards) { + if (leaderboard.name == name) return index; + ++index; + } - void load_achievements_db(); - void load_achievements(); - void save_achievements(); + return 0; +} + +void load_achievements_db() +{ + std::string file_path = Local_Storage::get_game_settings_path() + achievements_user_file; + local_storage->load_json(file_path, defined_achievements); +} + +void load_achievements() +{ + local_storage->load_json_file("", achievements_user_file, user_achievements); +} + +void save_achievements() +{ + local_storage->write_json_file("", achievements_user_file, user_achievements); +} public: - Steam_User_Stats(Settings* settings, Local_Storage* local_storage, class SteamCallResults* callback_results, class SteamCallBacks* callbacks); +Steam_User_Stats(Settings *settings, Local_Storage *local_storage, class SteamCallResults *callback_results, class SteamCallBacks *callbacks, Steam_Overlay* overlay): + settings(settings), + local_storage(local_storage), + callback_results(callback_results), + callbacks(callbacks), + defined_achievements(nlohmann::json::object()), + user_achievements(nlohmann::json::object()), + overlay(overlay) +{ + load_achievements_db(); // achievements db + load_achievements(); // achievements per user +} - nlohmann::json const& GetAchievementsDb() const; +// Ask the server to send down this user's data and achievements for this game +STEAM_CALL_BACK( UserStatsReceived_t ) +bool RequestCurrentStats() +{ + PRINT_DEBUG("Steam_User_Stats::RequestCurrentStats\n"); + std::lock_guard lock(global_mutex); - // Ask the server to send down this user's data and achievements for this game - STEAM_CALL_BACK(UserStatsReceived_t) - bool RequestCurrentStats(); - - // Data accessors - bool GetStat(const char* pchName, int32* pData); - bool GetStat(const char* pchName, float* pData); - - // Set / update data - bool SetStat(const char* pchName, int32 nData); - bool SetStat(const char* pchName, float fData); - bool UpdateAvgRateStat(const char* pchName, float flCountThisSession, double dSessionLength); - - // Achievement flag accessors - bool GetAchievement(const char* pchName, bool* pbAchieved); - bool SetAchievement(const char* pchName); - bool ClearAchievement(const char* pchName); + UserStatsReceived_t data; + data.m_nGameID = settings->get_local_game_id().ToUint64(); + data.m_eResult = k_EResultOK; + data.m_steamIDUser = settings->get_local_steam_id(); + callbacks->addCBResult(data.k_iCallback, &data, sizeof(data), 0.1); + return true; +} - // Get the achievement status, and the time it was unlocked if unlocked. - // If the return value is true, but the unlock time is zero, that means it was unlocked before Steam - // began tracking achievement unlock times (December 2009). Time is seconds since January 1, 1970. - bool GetAchievementAndUnlockTime(const char* pchName, bool* pbAchieved, uint32* punUnlockTime); +// Data accessors +bool GetStat( const char *pchName, int32 *pData ) +{ + PRINT_DEBUG("GetStat int32 %s\n", pchName); + if (!pchName || !pData) return false; + std::lock_guard lock(global_mutex); + auto stats_config = settings->getStats(); + auto stats_data = stats_config.find(pchName); + if (stats_data != stats_config.end()) { + if (stats_data->second.type != Stat_Type::STAT_TYPE_INT) return false; + } - // Store the current data on the server, will get a callback when set - // And one callback for every new achievement - // - // If the callback has a result of k_EResultInvalidParam, one or more stats - // uploaded has been rejected, either because they broke constraints - // or were out of date. In this case the server sends back updated values. - // The stats should be re-iterated to keep in sync. - bool StoreStats(); + int read_data = local_storage->get_data(Local_Storage::stats_storage_folder, pchName, (char* )pData, sizeof(*pData)); + if (read_data == sizeof(int32)) + return true; - // Achievement / GroupAchievement metadata + if (stats_data != stats_config.end()) { + *pData = stats_data->second.default_value_int; + return true; + } - // Gets the icon of the achievement, which is a handle to be used in ISteamUtils::GetImageRGBA(), or 0 if none set. - // A return value of 0 may indicate we are still fetching data, and you can wait for the UserAchievementIconFetched_t callback - // which will notify you when the bits are ready. If the callback still returns zero, then there is no image set for the - // specified achievement. - int GetAchievementIcon(const char* pchName); + return false; +} + +bool GetStat( const char *pchName, float *pData ) +{ + PRINT_DEBUG("GetStat float %s\n", pchName); + if (!pchName || !pData) return false; + std::lock_guard lock(global_mutex); + auto stats_config = settings->getStats(); + auto stats_data = stats_config.find(pchName); + if (stats_data != stats_config.end()) { + if (stats_data->second.type == Stat_Type::STAT_TYPE_INT) return false; + } + + int read_data = local_storage->get_data(Local_Storage::stats_storage_folder, pchName, (char* )pData, sizeof(*pData)); + if (read_data == sizeof(float)) + return true; + + if (stats_data != stats_config.end()) { + *pData = stats_data->second.default_value_float; + return true; + } + + return false; +} - // Get general attributes for an achievement. Accepts the following keys: - // - "name" and "desc" for retrieving the localized achievement name and description (returned in UTF8) - // - "hidden" for retrieving if an achievement is hidden (returns "0" when not hidden, "1" when hidden) - const char* GetAchievementDisplayAttribute(const char* pchName, const char* pchKey); +// Set / update data +bool SetStat( const char *pchName, int32 nData ) +{ + PRINT_DEBUG("SetStat int32 %s\n", pchName); + if (!pchName) return false; + std::lock_guard lock(global_mutex); - // Achievement progress - triggers an AchievementProgress callback, that is all. - // Calling this w/ N out of N progress will NOT set the achievement, the game must still do that. - bool IndicateAchievementProgress(const char* pchName, uint32 nCurProgress, uint32 nMaxProgress); + return local_storage->store_data(Local_Storage::stats_storage_folder, pchName, (char* )&nData, sizeof(nData)) == sizeof(nData); +} - // Used for iterating achievements. In general games should not need these functions because they should have a - // list of existing achievements compiled into them - uint32 GetNumAchievements(); +bool SetStat( const char *pchName, float fData ) +{ + PRINT_DEBUG("SetStat float %s\n", pchName); + if (!pchName) return false; + std::lock_guard lock(global_mutex); - // Get achievement name iAchievement in [0,GetNumAchievements) - const char* GetAchievementName(uint32 iAchievement); + return local_storage->store_data(Local_Storage::stats_storage_folder, pchName, (char* )&fData, sizeof(fData)) == sizeof(fData); +} - // Friends stats & achievements +bool UpdateAvgRateStat( const char *pchName, float flCountThisSession, double dSessionLength ) +{ + PRINT_DEBUG("UpdateAvgRateStat %s\n", pchName); + std::lock_guard lock(global_mutex); - // downloads stats for the user - // returns a UserStatsReceived_t received when completed - // if the other user has no stats, UserStatsReceived_t.m_eResult will be set to k_EResultFail - // these stats won't be auto-updated; you'll need to call RequestUserStats() again to refresh any data - STEAM_CALL_RESULT(UserStatsReceived_t) - SteamAPICall_t RequestUserStats(CSteamID steamIDUser); + char data[sizeof(float) + sizeof(float) + sizeof(double)]; + int read_data = local_storage->get_data(Local_Storage::stats_storage_folder, pchName, (char* )data, sizeof(*data)); + float oldcount = 0; + double oldsessionlength = 0; + if (read_data == sizeof(data)) { + memcpy(&oldcount, data + sizeof(float), sizeof(oldcount)); + memcpy(&oldsessionlength, data + sizeof(float) + sizeof(double), sizeof(oldsessionlength)); + } + + oldcount += flCountThisSession; + oldsessionlength += dSessionLength; + + float average = oldcount / oldsessionlength; + memcpy(data, &average, sizeof(average)); + memcpy(data + sizeof(float), &oldcount, sizeof(oldcount)); + memcpy(data + sizeof(float) * 2, &oldsessionlength, sizeof(oldsessionlength)); + + return local_storage->store_data(Local_Storage::stats_storage_folder, pchName, data, sizeof(data)) == sizeof(data); +} - // requests stat information for a user, usable after a successful call to RequestUserStats() - bool GetUserStat(CSteamID steamIDUser, const char* pchName, int32* pData); - bool GetUserStat(CSteamID steamIDUser, const char* pchName, float* pData); +// Achievement flag accessors +bool GetAchievement( const char *pchName, bool *pbAchieved ) +{ + PRINT_DEBUG("GetAchievement %s\n", pchName); + if (pchName == nullptr) return false; + std::lock_guard lock(global_mutex); - bool GetUserAchievement(CSteamID steamIDUser, const char* pchName, bool* pbAchieved); + try { + auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName]( nlohmann::json &item ) { + return item["name"].get() == pchName; + }); + auto ach = user_achievements.find(pchName); + if (it != defined_achievements.end() && ach != user_achievements.end()) { + if(pbAchieved != nullptr) *pbAchieved = (*ach)["earned"]; + return true; + } + } catch (...) {} - // See notes for GetAchievementAndUnlockTime above - bool GetUserAchievementAndUnlockTime(CSteamID steamIDUser, const char* pchName, bool* pbAchieved, uint32* punUnlockTime); + if (pbAchieved != nullptr)* pbAchieved = false; - // Reset stats - bool ResetAllStats(bool bAchievementsToo); + return false; +} - // Leaderboard functions +bool SetAchievement( const char *pchName ) +{ + PRINT_DEBUG("SetAchievement %s\n", pchName); + if (pchName == nullptr) return false; + std::lock_guard lock(global_mutex); - // asks the Steam back-end for a leaderboard by name, and will create it if it's not yet - // This call is asynchronous, with the result returned in LeaderboardFindResult_t - STEAM_CALL_RESULT(LeaderboardFindResult_t) - SteamAPICall_t FindOrCreateLeaderboard(const char* pchLeaderboardName, ELeaderboardSortMethod eLeaderboardSortMethod, ELeaderboardDisplayType eLeaderboardDisplayType); + try { + auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { + return item["name"].get() == pchName; + }); + if (it != defined_achievements.end()) { + if (user_achievements.find(pchName) == user_achievements.end() || user_achievements[pchName].value("earned", false) == false) { + user_achievements[pchName]["earned"] = true; + user_achievements[pchName]["earned_time"] = std::chrono::duration_cast>(std::chrono::system_clock::now().time_since_epoch()).count(); +#ifdef EMU_OVERLAY + overlay->AddAchievementNotification(it.value()); +#endif + save_achievements(); + } - // as above, but won't create the leaderboard if it's not found - // This call is asynchronous, with the result returned in LeaderboardFindResult_t - STEAM_CALL_RESULT(LeaderboardFindResult_t) - SteamAPICall_t FindLeaderboard(const char* pchLeaderboardName); + return true; + } + } catch (...) {} - // returns the name of a leaderboard - const char* GetLeaderboardName(SteamLeaderboard_t hSteamLeaderboard); + return false; +} - // returns the total number of entries in a leaderboard, as of the last request - int GetLeaderboardEntryCount(SteamLeaderboard_t hSteamLeaderboard); +bool ClearAchievement( const char *pchName ) +{ + PRINT_DEBUG("ClearAchievement %s\n", pchName); + if (pchName == nullptr) return false; + std::lock_guard lock(global_mutex); - // returns the sort method of the leaderboard - ELeaderboardSortMethod GetLeaderboardSortMethod(SteamLeaderboard_t hSteamLeaderboard); + try { + auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { + return static_cast(item["name"]) == pchName; + }); + if (it != defined_achievements.end()) { + user_achievements[pchName]["earned"] = false; + user_achievements[pchName]["earned_time"] = static_cast(0); + save_achievements(); + return true; + } + } catch (...) {} - // returns the display type of the leaderboard - ELeaderboardDisplayType GetLeaderboardDisplayType(SteamLeaderboard_t hSteamLeaderboard); + return false; +} - // Asks the Steam back-end for a set of rows in the leaderboard. - // This call is asynchronous, with the result returned in LeaderboardScoresDownloaded_t - // LeaderboardScoresDownloaded_t will contain a handle to pull the results from GetDownloadedLeaderboardEntries() (below) - // You can ask for more entries than exist, and it will return as many as do exist. - // k_ELeaderboardDataRequestGlobal requests rows in the leaderboard from the full table, with nRangeStart & nRangeEnd in the range [1, TotalEntries] - // k_ELeaderboardDataRequestGlobalAroundUser requests rows around the current user, nRangeStart being negate - // e.g. DownloadLeaderboardEntries( hLeaderboard, k_ELeaderboardDataRequestGlobalAroundUser, -3, 3 ) will return 7 rows, 3 before the user, 3 after - // k_ELeaderboardDataRequestFriends requests all the rows for friends of the current user - STEAM_CALL_RESULT(LeaderboardScoresDownloaded_t) - SteamAPICall_t DownloadLeaderboardEntries(SteamLeaderboard_t hSteamLeaderboard, ELeaderboardDataRequest eLeaderboardDataRequest, int nRangeStart, int nRangeEnd); - // as above, but downloads leaderboard entries for an arbitrary set of users - ELeaderboardDataRequest is k_ELeaderboardDataRequestUsers - // if a user doesn't have a leaderboard entry, they won't be included in the result - // a max of 100 users can be downloaded at a time, with only one outstanding call at a time - STEAM_METHOD_DESC(Downloads leaderboard entries for an arbitrary set of users - ELeaderboardDataRequest is k_ELeaderboardDataRequestUsers) - STEAM_CALL_RESULT(LeaderboardScoresDownloaded_t) - SteamAPICall_t DownloadLeaderboardEntriesForUsers(SteamLeaderboard_t hSteamLeaderboard, - STEAM_ARRAY_COUNT_D(cUsers, Array of users to retrieve) CSteamID* prgUsers, int cUsers); +// Get the achievement status, and the time it was unlocked if unlocked. +// If the return value is true, but the unlock time is zero, that means it was unlocked before Steam +// began tracking achievement unlock times (December 2009). Time is seconds since January 1, 1970. +bool GetAchievementAndUnlockTime( const char *pchName, bool *pbAchieved, uint32 *punUnlockTime ) +{ + PRINT_DEBUG("GetAchievementAndUnlockTime\n"); + if (pchName == nullptr) return false; + std::lock_guard lock(global_mutex); - // Returns data about a single leaderboard entry - // use a for loop from 0 to LeaderboardScoresDownloaded_t::m_cEntryCount to get all the downloaded entries - // e.g. - // void OnLeaderboardScoresDownloaded( LeaderboardScoresDownloaded_t *pLeaderboardScoresDownloaded ) - // { - // for ( int index = 0; index < pLeaderboardScoresDownloaded->m_cEntryCount; index++ ) - // { - // LeaderboardEntry_t leaderboardEntry; - // int32 details[3]; // we know this is how many we've stored previously - // GetDownloadedLeaderboardEntry( pLeaderboardScoresDownloaded->m_hSteamLeaderboardEntries, index, &leaderboardEntry, details, 3 ); - // assert( leaderboardEntry.m_cDetails == 3 ); - // ... - // } - // once you've accessed all the entries, the data will be free'd, and the SteamLeaderboardEntries_t handle will become invalid - bool GetDownloadedLeaderboardEntry(SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, LeaderboardEntry_t* pLeaderboardEntry, int32* pDetails, int cDetailsMax); + try { + auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { + return static_cast(item["name"]) == pchName; + }); + auto ach = user_achievements.find(pchName); + if (it != defined_achievements.end() && ach != user_achievements.end()) { + if(pbAchieved != nullptr) *pbAchieved = (*ach)["earned"]; + if(punUnlockTime != nullptr) *punUnlockTime = (*ach)["earned_time"]; + return true; + } + } catch (...) {} - // Uploads a user score to the Steam back-end. - // This call is asynchronous, with the result returned in LeaderboardScoreUploaded_t - // Details are extra game-defined information regarding how the user got that score - // pScoreDetails points to an array of int32's, cScoreDetailsCount is the number of int32's in the list - STEAM_CALL_RESULT(LeaderboardScoreUploaded_t) - SteamAPICall_t UploadLeaderboardScore(SteamLeaderboard_t hSteamLeaderboard, ELeaderboardUploadScoreMethod eLeaderboardUploadScoreMethod, int32 nScore, const int32* pScoreDetails, int cScoreDetailsCount); + if(pbAchieved != nullptr) *pbAchieved = false; + if(punUnlockTime != nullptr) *punUnlockTime = 0; + return true; +} - SteamAPICall_t UploadLeaderboardScore(SteamLeaderboard_t hSteamLeaderboard, int32 nScore, int32* pScoreDetails, int cScoreDetailsCount); - // Attaches a piece of user generated content the user's entry on a leaderboard. - // hContent is a handle to a piece of user generated content that was shared using ISteamUserRemoteStorage::FileShare(). - // This call is asynchronous, with the result returned in LeaderboardUGCSet_t. - STEAM_CALL_RESULT(LeaderboardUGCSet_t) - SteamAPICall_t AttachLeaderboardUGC(SteamLeaderboard_t hSteamLeaderboard, UGCHandle_t hUGC); +// Store the current data on the server, will get a callback when set +// And one callback for every new achievement +// +// If the callback has a result of k_EResultInvalidParam, one or more stats +// uploaded has been rejected, either because they broke constraints +// or were out of date. In this case the server sends back updated values. +// The stats should be re-iterated to keep in sync. +bool StoreStats() +{ + PRINT_DEBUG("StoreStats\n"); + std::lock_guard lock(global_mutex); - // Retrieves the number of players currently playing your game (online + offline) - // This call is asynchronous, with the result returned in NumberOfCurrentPlayers_t - STEAM_CALL_RESULT(NumberOfCurrentPlayers_t) - SteamAPICall_t GetNumberOfCurrentPlayers(); + UserStatsStored_t data; + data.m_nGameID = settings->get_local_game_id().ToUint64(); + data.m_eResult = k_EResultOK; + callbacks->addCBResult(data.k_iCallback, &data, sizeof(data)); + return true; +} - // Requests that Steam fetch data on the percentage of players who have received each achievement - // for the game globally. - // This call is asynchronous, with the result returned in GlobalAchievementPercentagesReady_t. - STEAM_CALL_RESULT(GlobalAchievementPercentagesReady_t) - SteamAPICall_t RequestGlobalAchievementPercentages(); - // Get the info on the most achieved achievement for the game, returns an iterator index you can use to fetch - // the next most achieved afterwards. Will return -1 if there is no data on achievement - // percentages (ie, you haven't called RequestGlobalAchievementPercentages and waited on the callback). - int GetMostAchievedAchievementInfo(char* pchName, uint32 unNameBufLen, float* pflPercent, bool* pbAchieved); +// Achievement / GroupAchievement metadata - // Get the info on the next most achieved achievement for the game. Call this after GetMostAchievedAchievementInfo or another - // GetNextMostAchievedAchievementInfo call passing the iterator from the previous call. Returns -1 after the last - // achievement has been iterated. - int GetNextMostAchievedAchievementInfo(int iIteratorPrevious, char* pchName, uint32 unNameBufLen, float* pflPercent, bool* pbAchieved); +// Gets the icon of the achievement, which is a handle to be used in ISteamUtils::GetImageRGBA(), or 0 if none set. +// A return value of 0 may indicate we are still fetching data, and you can wait for the UserAchievementIconFetched_t callback +// which will notify you when the bits are ready. If the callback still returns zero, then there is no image set for the +// specified achievement. +int GetAchievementIcon( const char *pchName ) +{ + PRINT_DEBUG("GetAchievementIcon\n"); + if (pchName == nullptr) return 0; + std::lock_guard lock(global_mutex); - // Returns the percentage of users who have achieved the specified achievement. - bool GetAchievementAchievedPercent(const char* pchName, float* pflPercent); + return 0; +} - // Requests global stats data, which is available for stats marked as "aggregated". - // This call is asynchronous, with the results returned in GlobalStatsReceived_t. - // nHistoryDays specifies how many days of day-by-day history to retrieve in addition - // to the overall totals. The limit is 60. - STEAM_CALL_RESULT(GlobalStatsReceived_t) - SteamAPICall_t RequestGlobalStats(int nHistoryDays); - // Gets the lifetime totals for an aggregated stat - bool GetGlobalStat(const char* pchStatName, int64* pData); - bool GetGlobalStat(const char* pchStatName, double* pData); +// Get general attributes for an achievement. Accepts the following keys: +// - "name" and "desc" for retrieving the localized achievement name and description (returned in UTF8) +// - "hidden" for retrieving if an achievement is hidden (returns "0" when not hidden, "1" when hidden) +const char * GetAchievementDisplayAttribute( const char *pchName, const char *pchKey ) +{ + PRINT_DEBUG("GetAchievementDisplayAttribute %s %s\n", pchName, pchKey); + if (pchName == nullptr) return ""; + if (pchKey == nullptr) return ""; - // Gets history for an aggregated stat. pData will be filled with daily values, starting with today. - // So when called, pData[0] will be today, pData[1] will be yesterday, and pData[2] will be two days ago, - // etc. cubData is the size in bytes of the pubData buffer. Returns the number of - // elements actually set. - int32 GetGlobalStatHistory(const char* pchStatName, STEAM_ARRAY_COUNT(cubData) int64* pData, uint32 cubData); - int32 GetGlobalStatHistory(const char* pchStatName, STEAM_ARRAY_COUNT(cubData) double* pData, uint32 cubData); + std::lock_guard lock(global_mutex); + + if (strcmp (pchKey, "name") == 0) { + try { + auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { + return static_cast(item["name"]) == pchName; + }); + if (it != defined_achievements.end()) { + return it.value()["displayName"].get_ptr()->c_str(); + } + } catch (...) {} + } + + if (strcmp (pchKey, "desc") == 0) { + try { + auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { + return static_cast(item["name"]) == pchName; + }); + if (it != defined_achievements.end()) { + return it.value()["description"].get_ptr()->c_str(); + } + } catch (...) {} + } + + if (strcmp (pchKey, "hidden") == 0) { + try { + auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { + return static_cast(item["name"]) == pchName; + }); + if (it != defined_achievements.end()) { + return it.value()["hidden"].get_ptr()->c_str(); + } + } catch (...) {} + } + + return ""; +} + + +// Achievement progress - triggers an AchievementProgress callback, that is all. +// Calling this w/ N out of N progress will NOT set the achievement, the game must still do that. +bool IndicateAchievementProgress( const char *pchName, uint32 nCurProgress, uint32 nMaxProgress ) +{ + PRINT_DEBUG("IndicateAchievementProgress\n"); + if (pchName == nullptr) return false; + std::lock_guard lock(global_mutex); + + try { + auto it = std::find_if(defined_achievements.begin(), defined_achievements.end(), [pchName](nlohmann::json& item) { + return static_cast(item["name"]) == pchName; + }); + auto ach = user_achievements.find(pchName); + if (it != defined_achievements.end()) { + bool achieved = false; + if ( ach != user_achievements.end()) { + bool achieved = ach->value("earned", false); + } + + UserAchievementStored_t data = {}; + data.m_nGameID = settings->get_local_game_id().ToUint64(); + data.m_bGroupAchievement = false; + strncpy(data.m_rgchAchievementName, pchName, k_cchStatNameMax); + + if (achieved) { + data.m_nCurProgress = 0; + data.m_nMaxProgress = 0; + } else { + user_achievements[pchName]["progress"] = nCurProgress; + user_achievements[pchName]["max_progress"] = nMaxProgress; + data.m_nCurProgress = nCurProgress; + data.m_nMaxProgress = nMaxProgress; + } + + save_achievements(); + callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); + return true; + } + } catch (...) {} + + return false; +} + + +// Used for iterating achievements. In general games should not need these functions because they should have a +// list of existing achievements compiled into them +uint32 GetNumAchievements() +{ + PRINT_DEBUG("GetNumAchievements\n"); + std::lock_guard lock(global_mutex); + return defined_achievements.size(); +} + +// Get achievement name iAchievement in [0,GetNumAchievements) +const char * GetAchievementName( uint32 iAchievement ) +{ + PRINT_DEBUG("GetAchievementName\n"); + try { + static std::string achievement_name; + achievement_name = defined_achievements[iAchievement]["name"].get(); + return achievement_name.c_str(); + } catch (...) {} + return ""; +} + + +// Friends stats & achievements + +// downloads stats for the user +// returns a UserStatsReceived_t received when completed +// if the other user has no stats, UserStatsReceived_t.m_eResult will be set to k_EResultFail +// these stats won't be auto-updated; you'll need to call RequestUserStats() again to refresh any data +STEAM_CALL_RESULT( UserStatsReceived_t ) +SteamAPICall_t RequestUserStats( CSteamID steamIDUser ) +{ + PRINT_DEBUG("Steam_User_Stats::RequestUserStats %llu\n", steamIDUser.ConvertToUint64()); + std::lock_guard lock(global_mutex); + + // Enable this to allow hot reload achievements status + //if (steamIDUser == settings->get_local_steam_id()) { + // load_achievements(); + //} + + + UserStatsReceived_t data; + data.m_nGameID = settings->get_local_game_id().ToUint64(); + data.m_eResult = k_EResultOK; + data.m_steamIDUser = steamIDUser; + return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data), 0.1); +} + + +// requests stat information for a user, usable after a successful call to RequestUserStats() +bool GetUserStat( CSteamID steamIDUser, const char *pchName, int32 *pData ) +{ + PRINT_DEBUG("GetUserStat %s %llu\n", pchName, steamIDUser.ConvertToUint64()); + if (pchName == nullptr) return false; + + std::lock_guard lock(global_mutex); + + if (steamIDUser == settings->get_local_steam_id()) { + GetStat(pchName, pData); + } else { + *pData = 0; + } + + return true; +} + +bool GetUserStat( CSteamID steamIDUser, const char *pchName, float *pData ) +{ + PRINT_DEBUG("GetUserStat %s %llu\n", pchName, steamIDUser.ConvertToUint64()); + if (pchName == nullptr) return false; + + std::lock_guard lock(global_mutex); + + if (steamIDUser == settings->get_local_steam_id()) { + GetStat(pchName, pData); + } else { + *pData = 0; + } + + return true; +} + +bool GetUserAchievement( CSteamID steamIDUser, const char *pchName, bool *pbAchieved ) +{ + PRINT_DEBUG("GetUserAchievement %s\n", pchName); + if (pchName == nullptr) return false; + std::lock_guard lock(global_mutex); + + if (steamIDUser == settings->get_local_steam_id()) { + return GetAchievement(pchName, pbAchieved); + } + + return false; +} + +// See notes for GetAchievementAndUnlockTime above +bool GetUserAchievementAndUnlockTime( CSteamID steamIDUser, const char *pchName, bool *pbAchieved, uint32 *punUnlockTime ) +{ + PRINT_DEBUG("GetUserAchievementAndUnlockTime %s\n", pchName); + if (pchName == nullptr) return false; + std::lock_guard lock(global_mutex); + + if (steamIDUser == settings->get_local_steam_id()) { + return GetAchievementAndUnlockTime(pchName, pbAchieved, punUnlockTime); + } + return false; +} + + +// Reset stats +bool ResetAllStats( bool bAchievementsToo ) +{ + PRINT_DEBUG("ResetAllStats\n"); + std::lock_guard lock(global_mutex); + //TODO + if (bAchievementsToo) { + std::for_each(user_achievements.begin(), user_achievements.end(), [](nlohmann::json& v) { + v["earned"] = false; + v["earned_time"] = 0; + }); + } + + return true; +} + + +// Leaderboard functions + +// asks the Steam back-end for a leaderboard by name, and will create it if it's not yet +// This call is asynchronous, with the result returned in LeaderboardFindResult_t +STEAM_CALL_RESULT(LeaderboardFindResult_t) +SteamAPICall_t FindOrCreateLeaderboard( const char *pchLeaderboardName, ELeaderboardSortMethod eLeaderboardSortMethod, ELeaderboardDisplayType eLeaderboardDisplayType ) +{ + PRINT_DEBUG("FindOrCreateLeaderboard %s\n", pchLeaderboardName); + std::lock_guard lock(global_mutex); + + unsigned int leader = find_leaderboard(pchLeaderboardName); + if (!leader) { + struct Steam_Leaderboard leaderboard; + leaderboard.name = std::string(pchLeaderboardName); + leaderboard.sort_method = eLeaderboardSortMethod; + leaderboard.display_type = eLeaderboardDisplayType; + leaderboards.push_back(leaderboard); + leader = leaderboards.size(); + } + + LeaderboardFindResult_t data; + data.m_hSteamLeaderboard = leader; + data.m_bLeaderboardFound = 1; + return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); +} + + +// as above, but won't create the leaderboard if it's not found +// This call is asynchronous, with the result returned in LeaderboardFindResult_t +STEAM_CALL_RESULT( LeaderboardFindResult_t ) +SteamAPICall_t FindLeaderboard( const char *pchLeaderboardName ) +{ + PRINT_DEBUG("FindLeaderboard %s\n", pchLeaderboardName); + std::lock_guard lock(global_mutex); + + auto settings_Leaderboards = settings->getLeaderboards(); + if (settings_Leaderboards.count(pchLeaderboardName)) { + auto config = settings_Leaderboards[pchLeaderboardName]; + return FindOrCreateLeaderboard(pchLeaderboardName, config.sort_method, config.display_type); + } else if (settings->createUnknownLeaderboards()) { + return FindOrCreateLeaderboard(pchLeaderboardName, k_ELeaderboardSortMethodDescending, k_ELeaderboardDisplayTypeNumeric); + } else { + LeaderboardFindResult_t data; + data.m_hSteamLeaderboard = find_leaderboard(pchLeaderboardName);; + data.m_bLeaderboardFound = !!data.m_hSteamLeaderboard; + return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); + } +} + + +// returns the name of a leaderboard +const char * GetLeaderboardName( SteamLeaderboard_t hSteamLeaderboard ) +{ + PRINT_DEBUG("GetLeaderboardName\n"); + std::lock_guard lock(global_mutex); + + if (hSteamLeaderboard > leaderboards.size() || hSteamLeaderboard <= 0) return ""; + return leaderboards[hSteamLeaderboard - 1].name.c_str(); +} + + +// returns the total number of entries in a leaderboard, as of the last request +int GetLeaderboardEntryCount( SteamLeaderboard_t hSteamLeaderboard ) +{ + PRINT_DEBUG("GetLeaderboardEntryCount\n"); + return 0; +} + + +// returns the sort method of the leaderboard +ELeaderboardSortMethod GetLeaderboardSortMethod( SteamLeaderboard_t hSteamLeaderboard ) +{ + PRINT_DEBUG("GetLeaderboardSortMethod\n"); + std::lock_guard lock(global_mutex); + if (hSteamLeaderboard > leaderboards.size() || hSteamLeaderboard <= 0) return k_ELeaderboardSortMethodNone; + return leaderboards[hSteamLeaderboard - 1].sort_method; +} + + +// returns the display type of the leaderboard +ELeaderboardDisplayType GetLeaderboardDisplayType( SteamLeaderboard_t hSteamLeaderboard ) +{ + PRINT_DEBUG("GetLeaderboardDisplayType\n"); + std::lock_guard lock(global_mutex); + if (hSteamLeaderboard > leaderboards.size() || hSteamLeaderboard <= 0) return k_ELeaderboardDisplayTypeNone; + return leaderboards[hSteamLeaderboard - 1].display_type; +} + + +// Asks the Steam back-end for a set of rows in the leaderboard. +// This call is asynchronous, with the result returned in LeaderboardScoresDownloaded_t +// LeaderboardScoresDownloaded_t will contain a handle to pull the results from GetDownloadedLeaderboardEntries() (below) +// You can ask for more entries than exist, and it will return as many as do exist. +// k_ELeaderboardDataRequestGlobal requests rows in the leaderboard from the full table, with nRangeStart & nRangeEnd in the range [1, TotalEntries] +// k_ELeaderboardDataRequestGlobalAroundUser requests rows around the current user, nRangeStart being negate +// e.g. DownloadLeaderboardEntries( hLeaderboard, k_ELeaderboardDataRequestGlobalAroundUser, -3, 3 ) will return 7 rows, 3 before the user, 3 after +// k_ELeaderboardDataRequestFriends requests all the rows for friends of the current user +STEAM_CALL_RESULT( LeaderboardScoresDownloaded_t ) +SteamAPICall_t DownloadLeaderboardEntries( SteamLeaderboard_t hSteamLeaderboard, ELeaderboardDataRequest eLeaderboardDataRequest, int nRangeStart, int nRangeEnd ) +{ + PRINT_DEBUG("DownloadLeaderboardEntries %llu %i %i %i\n", hSteamLeaderboard, eLeaderboardDataRequest, nRangeStart, nRangeEnd); + std::lock_guard lock(global_mutex); + LeaderboardScoresDownloaded_t data; + data.m_hSteamLeaderboard = hSteamLeaderboard; + data.m_hSteamLeaderboardEntries = 123; + data.m_cEntryCount = 0; + return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); +} + +// as above, but downloads leaderboard entries for an arbitrary set of users - ELeaderboardDataRequest is k_ELeaderboardDataRequestUsers +// if a user doesn't have a leaderboard entry, they won't be included in the result +// a max of 100 users can be downloaded at a time, with only one outstanding call at a time +STEAM_METHOD_DESC(Downloads leaderboard entries for an arbitrary set of users - ELeaderboardDataRequest is k_ELeaderboardDataRequestUsers) + STEAM_CALL_RESULT( LeaderboardScoresDownloaded_t ) +SteamAPICall_t DownloadLeaderboardEntriesForUsers( SteamLeaderboard_t hSteamLeaderboard, + STEAM_ARRAY_COUNT_D(cUsers, Array of users to retrieve) CSteamID *prgUsers, int cUsers ) +{ + PRINT_DEBUG("DownloadLeaderboardEntriesForUsers %i %llu\n", cUsers, cUsers > 0 ? prgUsers[0].ConvertToUint64() : 0); + std::lock_guard lock(global_mutex); + LeaderboardScoresDownloaded_t data; + data.m_hSteamLeaderboard = hSteamLeaderboard; + data.m_hSteamLeaderboardEntries = 123; + data.m_cEntryCount = 0; + return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); +} + + +// Returns data about a single leaderboard entry +// use a for loop from 0 to LeaderboardScoresDownloaded_t::m_cEntryCount to get all the downloaded entries +// e.g. +// void OnLeaderboardScoresDownloaded( LeaderboardScoresDownloaded_t *pLeaderboardScoresDownloaded ) +// { +// for ( int index = 0; index < pLeaderboardScoresDownloaded->m_cEntryCount; index++ ) +// { +// LeaderboardEntry_t leaderboardEntry; +// int32 details[3]; // we know this is how many we've stored previously +// GetDownloadedLeaderboardEntry( pLeaderboardScoresDownloaded->m_hSteamLeaderboardEntries, index, &leaderboardEntry, details, 3 ); +// assert( leaderboardEntry.m_cDetails == 3 ); +// ... +// } +// once you've accessed all the entries, the data will be free'd, and the SteamLeaderboardEntries_t handle will become invalid +bool GetDownloadedLeaderboardEntry( SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, LeaderboardEntry_t *pLeaderboardEntry, int32 *pDetails, int cDetailsMax ) +{ + PRINT_DEBUG("GetDownloadedLeaderboardEntry\n"); + return false; +} + + +// Uploads a user score to the Steam back-end. +// This call is asynchronous, with the result returned in LeaderboardScoreUploaded_t +// Details are extra game-defined information regarding how the user got that score +// pScoreDetails points to an array of int32's, cScoreDetailsCount is the number of int32's in the list +STEAM_CALL_RESULT( LeaderboardScoreUploaded_t ) +SteamAPICall_t UploadLeaderboardScore( SteamLeaderboard_t hSteamLeaderboard, ELeaderboardUploadScoreMethod eLeaderboardUploadScoreMethod, int32 nScore, const int32 *pScoreDetails, int cScoreDetailsCount ) +{ + PRINT_DEBUG("UploadLeaderboardScore\n"); + std::lock_guard lock(global_mutex); + LeaderboardScoreUploaded_t data; + data.m_bSuccess = 1; //needs to be success or DOA6 freezes when uploading score. + //data.m_bSuccess = 0; + data.m_hSteamLeaderboard = hSteamLeaderboard; + data.m_nScore = nScore; + //data.m_bScoreChanged = 1; + data.m_bScoreChanged = 0; + //data.m_nGlobalRankNew = 1; + data.m_nGlobalRankNew = 0; + data.m_nGlobalRankPrevious = 0; + return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); +} + +SteamAPICall_t UploadLeaderboardScore( SteamLeaderboard_t hSteamLeaderboard, int32 nScore, int32 *pScoreDetails, int cScoreDetailsCount ) +{ + PRINT_DEBUG("UploadLeaderboardScore old\n"); + return UploadLeaderboardScore(hSteamLeaderboard, k_ELeaderboardUploadScoreMethodKeepBest, nScore, pScoreDetails, cScoreDetailsCount); +} + + +// Attaches a piece of user generated content the user's entry on a leaderboard. +// hContent is a handle to a piece of user generated content that was shared using ISteamUserRemoteStorage::FileShare(). +// This call is asynchronous, with the result returned in LeaderboardUGCSet_t. +STEAM_CALL_RESULT( LeaderboardUGCSet_t ) +SteamAPICall_t AttachLeaderboardUGC( SteamLeaderboard_t hSteamLeaderboard, UGCHandle_t hUGC ) +{ + PRINT_DEBUG("AttachLeaderboardUGC\n"); + std::lock_guard lock(global_mutex); + LeaderboardUGCSet_t data = {}; + if (hSteamLeaderboard > leaderboards.size() || hSteamLeaderboard <= 0) { + data.m_eResult = k_EResultFail; + } else { + data.m_eResult = k_EResultOK; + } + + data.m_hSteamLeaderboard = hSteamLeaderboard; + return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); +} + + +// Retrieves the number of players currently playing your game (online + offline) +// This call is asynchronous, with the result returned in NumberOfCurrentPlayers_t +STEAM_CALL_RESULT( NumberOfCurrentPlayers_t ) +SteamAPICall_t GetNumberOfCurrentPlayers() +{ + PRINT_DEBUG("GetNumberOfCurrentPlayers\n"); + std::lock_guard lock(global_mutex); + NumberOfCurrentPlayers_t data; + data.m_bSuccess = 1; + data.m_cPlayers = 69; + return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); +} + + +// Requests that Steam fetch data on the percentage of players who have received each achievement +// for the game globally. +// This call is asynchronous, with the result returned in GlobalAchievementPercentagesReady_t. +STEAM_CALL_RESULT( GlobalAchievementPercentagesReady_t ) +SteamAPICall_t RequestGlobalAchievementPercentages() +{ + PRINT_DEBUG("RequestGlobalAchievementPercentages\n"); +} + + +// Get the info on the most achieved achievement for the game, returns an iterator index you can use to fetch +// the next most achieved afterwards. Will return -1 if there is no data on achievement +// percentages (ie, you haven't called RequestGlobalAchievementPercentages and waited on the callback). +int GetMostAchievedAchievementInfo( char *pchName, uint32 unNameBufLen, float *pflPercent, bool *pbAchieved ) +{ + PRINT_DEBUG("GetMostAchievedAchievementInfo\n"); +} + + +// Get the info on the next most achieved achievement for the game. Call this after GetMostAchievedAchievementInfo or another +// GetNextMostAchievedAchievementInfo call passing the iterator from the previous call. Returns -1 after the last +// achievement has been iterated. +int GetNextMostAchievedAchievementInfo( int iIteratorPrevious, char *pchName, uint32 unNameBufLen, float *pflPercent, bool *pbAchieved ) +{ + PRINT_DEBUG("GetNextMostAchievedAchievementInfo\n"); +} + + +// Returns the percentage of users who have achieved the specified achievement. +bool GetAchievementAchievedPercent( const char *pchName, float *pflPercent ) +{ + PRINT_DEBUG("GetAchievementAchievedPercent\n"); +} + + +// Requests global stats data, which is available for stats marked as "aggregated". +// This call is asynchronous, with the results returned in GlobalStatsReceived_t. +// nHistoryDays specifies how many days of day-by-day history to retrieve in addition +// to the overall totals. The limit is 60. +STEAM_CALL_RESULT( GlobalStatsReceived_t ) +SteamAPICall_t RequestGlobalStats( int nHistoryDays ) +{ + PRINT_DEBUG("RequestGlobalStats %i\n", nHistoryDays); + std::lock_guard lock(global_mutex); + GlobalStatsReceived_t data; + data.m_nGameID = settings->get_local_game_id().ToUint64(); + data.m_eResult = k_EResultOK; + return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data)); +} + + +// Gets the lifetime totals for an aggregated stat +bool GetGlobalStat( const char *pchStatName, int64 *pData ) +{ + PRINT_DEBUG("GetGlobalStat %s\n", pchStatName); + return false; +} + +bool GetGlobalStat( const char *pchStatName, double *pData ) +{ + PRINT_DEBUG("GetGlobalStat %s\n", pchStatName); + return false; +} + + +// Gets history for an aggregated stat. pData will be filled with daily values, starting with today. +// So when called, pData[0] will be today, pData[1] will be yesterday, and pData[2] will be two days ago, +// etc. cubData is the size in bytes of the pubData buffer. Returns the number of +// elements actually set. +int32 GetGlobalStatHistory( const char *pchStatName, STEAM_ARRAY_COUNT(cubData) int64 *pData, uint32 cubData ) +{ + PRINT_DEBUG("GetGlobalStatHistory int64 %s\n", pchStatName); + return 0; +} + +int32 GetGlobalStatHistory( const char *pchStatName, STEAM_ARRAY_COUNT(cubData) double *pData, uint32 cubData ) +{ + PRINT_DEBUG("GetGlobalStatHistory double %s\n", pchStatName); + return 0; +} }; #endif//__INCLUDED_STEAM_USER_STATS_H__ diff --git a/download_glew.sh b/download_glew.sh deleted file mode 100755 index 7214a1b..0000000 --- a/download_glew.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -rm -rf glew* - -URL="https://downloads.sourceforge.net/project/glew/glew/2.1.0/glew-2.1.0-win32.zip?r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Fglew%2Ffiles%2Fglew%2F2.1.0%2Fglew-2.1.0-win32.zip%2Fdownload&ts=1565791827" - -wget "$URL" -O glew.zip -unzip glew.zip -rm glew.zip -mv glew-* glew -# Fix libraries name -sed -i "s/LIBCMT/libcmt/;s/OLDNAMES/oldnames/" glew/lib/Release/*/glew32s.lib diff --git a/files_example/steam_settings.EXAMPLE/disable_overlay.EXAMPLE.txt b/files_example/steam_settings.EXAMPLE/disable_overlay.EXAMPLE.txt new file mode 100644 index 0000000..005893c --- /dev/null +++ b/files_example/steam_settings.EXAMPLE/disable_overlay.EXAMPLE.txt @@ -0,0 +1 @@ +Rename this to: disable_overlay.EXAMPLE.txt to disable the overlay. \ No newline at end of file diff --git a/overlay_experimental/Base_Hook.cpp b/overlay_experimental/Base_Hook.cpp index e660729..21867b8 100644 --- a/overlay_experimental/Base_Hook.cpp +++ b/overlay_experimental/Base_Hook.cpp @@ -3,7 +3,7 @@ #include -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #ifdef STEAM_WIN32 #include "../detours/detours.h" @@ -85,4 +85,4 @@ void Base_Hook::UnhookAll() #endif -#endif//NO_OVERLAY +#endif//EMU_OVERLAY diff --git a/overlay_experimental/Base_Hook.h b/overlay_experimental/Base_Hook.h index 55028f7..54396cf 100644 --- a/overlay_experimental/Base_Hook.h +++ b/overlay_experimental/Base_Hook.h @@ -1,7 +1,7 @@ #ifndef __INCLUDED_BASE_HOOK_H__ #define __INCLUDED_BASE_HOOK_H__ -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include @@ -45,6 +45,6 @@ public: } }; -#endif//NO_OVERLAY +#endif//EMU_OVERLAY #endif//__INCLUDED_BASE_HOOK_H__ \ No newline at end of file diff --git a/overlay_experimental/Hook_Manager.cpp b/overlay_experimental/Hook_Manager.cpp index b1888e5..3462c98 100644 --- a/overlay_experimental/Hook_Manager.cpp +++ b/overlay_experimental/Hook_Manager.cpp @@ -1,7 +1,7 @@ #include "../dll/dll.h" #include "Hook_Manager.h" -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY Hook_Manager::Hook_Manager() {} @@ -33,4 +33,4 @@ void Hook_Manager::RemoveHook(Base_Hook* hook) } } -#endif//NO_OVERLAY \ No newline at end of file +#endif//EMU_OVERLAY \ No newline at end of file diff --git a/overlay_experimental/Hook_Manager.h b/overlay_experimental/Hook_Manager.h index 29a56b7..24c7995 100644 --- a/overlay_experimental/Hook_Manager.h +++ b/overlay_experimental/Hook_Manager.h @@ -3,7 +3,7 @@ #include "Base_Hook.h" -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include @@ -24,6 +24,6 @@ public: void RemoveHook(Base_Hook* hook); }; -#endif//NO_OVERLAY +#endif//EMU_OVERLAY #endif//__INCLUDED_HOOK_BASE_H__ \ No newline at end of file diff --git a/overlay_experimental/Renderer_Detector.h b/overlay_experimental/Renderer_Detector.h index 544e441..92f6771 100644 --- a/overlay_experimental/Renderer_Detector.h +++ b/overlay_experimental/Renderer_Detector.h @@ -4,7 +4,7 @@ #include "Base_Hook.h" #include -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #ifdef __WINDOWS__ struct IDXGISwapChain; @@ -101,5 +101,5 @@ public: }; #endif//__WINDOWS__ -#endif//NO_OVERLAY +#endif//EMU_OVERLAY #endif//__INCLUDED_RENDERER_DETECTOR_H__ diff --git a/overlay_experimental/linux/OpenGLX_Hook.cpp b/overlay_experimental/linux/OpenGLX_Hook.cpp index 5968fc5..ffbb706 100644 --- a/overlay_experimental/linux/OpenGLX_Hook.cpp +++ b/overlay_experimental/linux/OpenGLX_Hook.cpp @@ -4,7 +4,7 @@ #include "../dll/dll.h" #ifdef __LINUX__ -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include @@ -171,5 +171,5 @@ void OpenGLX_Hook::loadFunctions(decltype(glXSwapBuffers)* pfnglXSwapBuffers) _glXSwapBuffers = pfnglXSwapBuffers; } -#endif//NO_OVERLAY +#endif//EMU_OVERLAY #endif//__LINUX__ diff --git a/overlay_experimental/linux/OpenGLX_Hook.h b/overlay_experimental/linux/OpenGLX_Hook.h index dcef025..f0e3aea 100644 --- a/overlay_experimental/linux/OpenGLX_Hook.h +++ b/overlay_experimental/linux/OpenGLX_Hook.h @@ -4,7 +4,7 @@ #include "../Base_Hook.h" #ifdef __LINUX__ -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include @@ -44,6 +44,6 @@ public: void loadFunctions(decltype(glXSwapBuffers)* pfnglXSwapBuffers); }; -#endif//NO_OVERLAY +#endif//EMU_OVERLAY #endif//__LINUX__ #endif//__INCLUDED_OPENGLX_HOOK_H__ diff --git a/overlay_experimental/linux/X11_Hook.cpp b/overlay_experimental/linux/X11_Hook.cpp index f3dee1e..76c0ca5 100644 --- a/overlay_experimental/linux/X11_Hook.cpp +++ b/overlay_experimental/linux/X11_Hook.cpp @@ -3,7 +3,7 @@ #include "../dll/dll.h" #ifdef __LINUX__ -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include @@ -201,5 +201,5 @@ const char* X11_Hook::get_lib_name() const return DLL_NAME; } -#endif//NO_OVERLAY +#endif//EMU_OVERLAY #endif//#__LINUX__ diff --git a/overlay_experimental/linux/X11_Hook.h b/overlay_experimental/linux/X11_Hook.h index 08a0aba..12b3416 100644 --- a/overlay_experimental/linux/X11_Hook.h +++ b/overlay_experimental/linux/X11_Hook.h @@ -4,7 +4,7 @@ #include "../Base_Hook.h" #ifdef __LINUX__ -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include // XEvent types #include // XEvent structure @@ -58,6 +58,6 @@ public: virtual const char* get_lib_name() const; }; -#endif//NO_OVERLAY +#endif//EMU_OVERLAY #endif//__LINUX__ #endif//__INCLUDED_X11_HOOK_H__ diff --git a/overlay_experimental/steam_overlay.cpp b/overlay_experimental/steam_overlay.cpp index 143443d..04ac3f2 100644 --- a/overlay_experimental/steam_overlay.cpp +++ b/overlay_experimental/steam_overlay.cpp @@ -1,6 +1,6 @@ #include "steam_overlay.h" -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include diff --git a/overlay_experimental/steam_overlay.h b/overlay_experimental/steam_overlay.h index 86613fb..227cb62 100644 --- a/overlay_experimental/steam_overlay.h +++ b/overlay_experimental/steam_overlay.h @@ -68,7 +68,7 @@ struct Notification std::pair* frd; }; -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY class Steam_Overlay { diff --git a/overlay_experimental/windows/DX10_Hook.cpp b/overlay_experimental/windows/DX10_Hook.cpp index 800b123..2a122d1 100644 --- a/overlay_experimental/windows/DX10_Hook.cpp +++ b/overlay_experimental/windows/DX10_Hook.cpp @@ -3,7 +3,7 @@ #include "../Renderer_Detector.h" #include "../../dll/dll.h" -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include @@ -169,4 +169,4 @@ void DX10_Hook::loadFunctions(IDXGISwapChain *pSwapChain) #undef LOAD_FUNC } -#endif//NO_OVERLAY \ No newline at end of file +#endif//EMU_OVERLAY \ No newline at end of file diff --git a/overlay_experimental/windows/DX10_Hook.h b/overlay_experimental/windows/DX10_Hook.h index ddfaffa..2e06e10 100644 --- a/overlay_experimental/windows/DX10_Hook.h +++ b/overlay_experimental/windows/DX10_Hook.h @@ -2,7 +2,7 @@ #define __INCLUDED_DX10_HOOK_H__ #include "../Base_Hook.h" -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include "DirectX_VTables.h" @@ -46,6 +46,6 @@ public: void loadFunctions(IDXGISwapChain *pSwapChain); }; -#endif//NO_OVERLAY +#endif//EMU_OVERLAY #endif//__INCLUDED_DX10_HOOK_H__ diff --git a/overlay_experimental/windows/DX11_Hook.cpp b/overlay_experimental/windows/DX11_Hook.cpp index dc56b14..7f1fc0e 100644 --- a/overlay_experimental/windows/DX11_Hook.cpp +++ b/overlay_experimental/windows/DX11_Hook.cpp @@ -3,7 +3,7 @@ #include "../Renderer_Detector.h" #include "../../dll/dll.h" -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include @@ -183,4 +183,4 @@ void DX11_Hook::loadFunctions(IDXGISwapChain *pSwapChain) #undef LOAD_FUNC } -#endif//NO_OVERLAY \ No newline at end of file +#endif//EMU_OVERLAY \ No newline at end of file diff --git a/overlay_experimental/windows/DX11_Hook.h b/overlay_experimental/windows/DX11_Hook.h index f8025c9..243de79 100644 --- a/overlay_experimental/windows/DX11_Hook.h +++ b/overlay_experimental/windows/DX11_Hook.h @@ -2,7 +2,7 @@ #define __INCLUDED_DX11_HOOK_H__ #include "../Base_Hook.h" -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include "DirectX_VTables.h" @@ -46,6 +46,6 @@ public: void loadFunctions(IDXGISwapChain *pSwapChain); }; -#endif//NO_OVERLAY +#endif//EMU_OVERLAY #endif//__INCLUDED_DX11_HOOK_H__ diff --git a/overlay_experimental/windows/DX12_Hook.cpp b/overlay_experimental/windows/DX12_Hook.cpp index d5de26b..c89d83f 100644 --- a/overlay_experimental/windows/DX12_Hook.cpp +++ b/overlay_experimental/windows/DX12_Hook.cpp @@ -3,7 +3,7 @@ #include "../Renderer_Detector.h" #include "../../dll/dll.h" -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include @@ -316,4 +316,4 @@ void DX12_Hook::loadFunctions(ID3D12CommandQueue* pCommandQueue, IDXGISwapChain #undef LOAD_FUNC } -#endif//NO_OVERLAY \ No newline at end of file +#endif//EMU_OVERLAY \ No newline at end of file diff --git a/overlay_experimental/windows/DX12_Hook.h b/overlay_experimental/windows/DX12_Hook.h index f2a301f..39e3ed3 100644 --- a/overlay_experimental/windows/DX12_Hook.h +++ b/overlay_experimental/windows/DX12_Hook.h @@ -2,7 +2,7 @@ #define __INCLUDED_DX12_HOOK_H__ #include "../Base_Hook.h" -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include @@ -56,5 +56,5 @@ public: void loadFunctions(ID3D12CommandQueue* pCommandQueue, IDXGISwapChain* pSwapChain); }; -#endif//NO_OVERLAY +#endif//EMU_OVERLAY #endif//__INCLUDED_DX12_HOOK_H__ diff --git a/overlay_experimental/windows/DX9_Hook.cpp b/overlay_experimental/windows/DX9_Hook.cpp index 5e7421d..bc7710a 100644 --- a/overlay_experimental/windows/DX9_Hook.cpp +++ b/overlay_experimental/windows/DX9_Hook.cpp @@ -3,7 +3,7 @@ #include "../Renderer_Detector.h" #include "../../dll/dll.h" -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include @@ -169,4 +169,4 @@ void DX9_Hook::loadFunctions(IDirect3DDevice9* pDevice, bool ex) #undef LOAD_FUNC } -#endif//NO_OVERLAY \ No newline at end of file +#endif//EMU_OVERLAY \ No newline at end of file diff --git a/overlay_experimental/windows/DX9_Hook.h b/overlay_experimental/windows/DX9_Hook.h index 3e42b99..5a76f35 100644 --- a/overlay_experimental/windows/DX9_Hook.h +++ b/overlay_experimental/windows/DX9_Hook.h @@ -2,7 +2,7 @@ #define __INCLUDED_DX9_HOOK_H__ #include "../Base_Hook.h" -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include "DirectX_VTables.h" @@ -47,6 +47,6 @@ public: void loadFunctions(IDirect3DDevice9 *pDevice, bool ex); }; -#endif//NO_OVERLAY +#endif//EMU_OVERLAY #endif//__INCLUDED_DX9_HOOK_H__ diff --git a/overlay_experimental/windows/OpenGL_Hook.cpp b/overlay_experimental/windows/OpenGL_Hook.cpp index 934066a..51f856a 100644 --- a/overlay_experimental/windows/OpenGL_Hook.cpp +++ b/overlay_experimental/windows/OpenGL_Hook.cpp @@ -3,7 +3,7 @@ #include "../Renderer_Detector.h" #include "../../dll/dll.h" -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include @@ -144,4 +144,4 @@ void OpenGL_Hook::loadFunctions(wglSwapBuffers_t pfnwglSwapBuffers) wglSwapBuffers = pfnwglSwapBuffers; } -#endif//NO_OVERLAY \ No newline at end of file +#endif//EMU_OVERLAY \ No newline at end of file diff --git a/overlay_experimental/windows/OpenGL_Hook.h b/overlay_experimental/windows/OpenGL_Hook.h index a2c9c7f..60f6d08 100644 --- a/overlay_experimental/windows/OpenGL_Hook.h +++ b/overlay_experimental/windows/OpenGL_Hook.h @@ -2,7 +2,7 @@ #define __INCLUDED_OPENGL_HOOK_H__ #include "../Base_Hook.h" -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY class OpenGL_Hook : public Base_Hook { @@ -38,5 +38,5 @@ public: void loadFunctions(wglSwapBuffers_t pfnwglSwapBuffers); }; -#endif//NO_OVERLAY +#endif//EMU_OVERLAY #endif//__INCLUDED_OPENGL_HOOK_H__ diff --git a/overlay_experimental/windows/Windows_Hook.cpp b/overlay_experimental/windows/Windows_Hook.cpp index 53106df..fcbdc42 100644 --- a/overlay_experimental/windows/Windows_Hook.cpp +++ b/overlay_experimental/windows/Windows_Hook.cpp @@ -2,7 +2,7 @@ #include "../Renderer_Detector.h" #include "../../dll/dll.h" -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY #include #include @@ -206,4 +206,4 @@ const char* Windows_Hook::get_lib_name() const return DLL_NAME; } -#endif//NO_OVERLAY \ No newline at end of file +#endif//EMU_OVERLAY \ No newline at end of file diff --git a/overlay_experimental/windows/Windows_Hook.h b/overlay_experimental/windows/Windows_Hook.h index a05a339..d612acc 100644 --- a/overlay_experimental/windows/Windows_Hook.h +++ b/overlay_experimental/windows/Windows_Hook.h @@ -4,7 +4,7 @@ #include "../Base_Hook.h" #ifdef __WINDOWS__ -#ifndef NO_OVERLAY +#ifdef EMU_OVERLAY class Windows_Hook : public Base_Hook { @@ -45,6 +45,6 @@ public: virtual const char* get_lib_name() const; }; -#endif//NO_OVERLAY +#endif//EMU_OVERLAY #endif//__WINDOWS__ #endif//__INCLUDED_WINDOWS_HOOK_H__