156 Commits

Author SHA1 Message Date
acidicoala
9acf7312d3 Fixed static order init fiasco 2026-01-02 21:57:41 +05:00
acidicoala
3b8635d16b Version bump to 4.1.0 2025-12-27 20:45:44 +05:00
acidicoala
e430350ffd Added instructions on adding support for new Steamworks SDK 2025-12-27 19:04:38 +05:00
acidicoala
0341c97d4f Fix README [skip ci] 2025-12-26 20:17:57 +05:00
acidicoala
c6aefbc460 Fallback to original DLC count 2025-12-26 20:02:56 +05:00
acidicoala
1f7a31d938 Update interface lookup 2025-12-26 19:59:18 +05:00
acidicoala
5910de7f27 Fix steamworks headers and binaries 2025-12-26 19:55:02 +05:00
acidicoala
5aa97db828 Fix steamworks downloader 2025-12-26 19:38:24 +05:00
acidicoala
e09cd7cef2 Added Steamworks SDK v1.63 2025-12-26 19:38:09 +05:00
acidicoala
e69734f9e7 Sync KoalaBox 2025-12-24 23:35:55 +05:00
acidicoala
bfc59ab64f Sync KoalaBox 2025-12-24 23:06:24 +05:00
acidicoala
a6f43d80e6 Sync KoalaBox 2025-12-24 22:46:34 +05:00
acidicoala
db58468823 Sync KoalaBox 2025-12-24 22:25:29 +05:00
acidicoala
15ba0ed447 KoalaBox sync 2025-12-23 03:02:45 +05:00
acidicoala
aa0504ff14 Sync KoalaBox 2025-10-13 02:20:28 +05:00
acidicoala
3312e92dce Sync KoalaBox 2025-10-13 01:58:36 +05:00
acidicoala
e6dbffb671 Sync KoalaBox 2025-10-12 17:31:21 +05:00
acidicoala
ef3b8894e3 Bump config schema version URL 2025-10-12 16:25:32 +05:00
acidicoala
009d839ec3 Updated Linux instructions 2025-10-12 16:23:24 +05:00
acidicoala
70160206b8 Sync KoalaBox 2025-10-12 03:40:31 +05:00
acidicoala
86eb2085e7 Sync KoalaBox 2025-10-11 02:50:31 +05:00
acidicoala
5f07cec291 Sync KoalaBox 2025-10-09 16:07:15 +05:00
acidicoala
4bf9898f83 Update CI 2025-10-07 03:16:11 +05:00
acidicoala
1f8fab7b48 Remove linux sources from windows build 2025-10-07 01:12:47 +05:00
acidicoala
36d5143463 Fix #if directives 2025-10-07 00:54:52 +05:00
acidicoala
d5db62c2f2 Generate proxy exports on demand 2025-10-07 00:41:49 +05:00
acidicoala
7e9c4c42b9 Added debug logs 2025-10-06 23:57:44 +05:00
acidicoala
cc17984702 Added debug logs 2025-10-06 23:46:33 +05:00
acidicoala
293f490e1d Added debug logs 2025-10-06 23:22:49 +05:00
acidicoala
060d6e15a3 Implemented tag release 2025-10-06 23:01:40 +05:00
acidicoala
96ec32228c Removed debug log 2025-10-06 20:01:58 +05:00
acidicoala
725be9f346 Sync KoalaBox 2025-10-06 19:49:04 +05:00
acidicoala
5382c84906 Setup Github user in dockerfile 2025-10-06 19:32:53 +05:00
acidicoala
5629b7b5e2 Added debug logs in CI 2025-10-06 19:02:20 +05:00
acidicoala
673cd11e47 Added init & shutdown checks 2025-10-06 18:53:22 +05:00
acidicoala
ec99d79bf7 Update README [skip ci] 2025-10-06 01:52:02 +05:00
acidicoala
fb17902116 Update CI 2025-10-06 01:21:35 +05:00
acidicoala
fce11580d6 Sync KoalaBox 2025-10-06 01:00:00 +05:00
acidicoala
2fad0ee43f Updated CI 2025-10-05 23:47:15 +05:00
acidicoala
73fab4020d Sync KoalaBox 2025-10-05 23:38:23 +05:00
acidicoala
bdbd1ff540 Updated CI 2025-10-05 23:10:37 +05:00
acidicoala
477f019b49 Updated CI 2025-10-05 22:53:04 +05:00
acidicoala
8d3d2c13d8 Updated CI 2025-10-05 22:29:31 +05:00
acidicoala
b362bb2828 Updated CI 2025-10-05 22:27:43 +05:00
acidicoala
06809b2c5d Updated CI 2025-10-05 22:14:32 +05:00
acidicoala
85710cce37 Updated CI 2025-10-05 22:08:00 +05:00
acidicoala
fe7eef72bd Updated CI 2025-10-05 19:43:43 +05:00
acidicoala
1572a0fd4a Updated CI 2025-10-05 19:42:00 +05:00
acidicoala
7e744f5492 Updated CI 2025-10-05 19:40:36 +05:00
acidicoala
c29445126b Updated CI 2025-10-05 19:38:54 +05:00
acidicoala
c6767419e4 Updated CI 2025-10-05 19:38:27 +05:00
acidicoala
dac3cad5e2 Updated CI 2025-10-05 19:37:54 +05:00
acidicoala
62071a1489 Fix CI 2025-10-05 19:35:59 +05:00
acidicoala
f8de04812a Updated CI 2025-10-05 19:29:51 +05:00
acidicoala
df43442fce Updated CI 2025-10-05 19:09:45 +05:00
acidicoala
76cf15126c Updated CI 2025-10-05 19:04:49 +05:00
acidicoala
8194a3333d Updated CI 2025-10-05 19:03:15 +05:00
acidicoala
599749a799 Use docker container in CI 2025-10-05 18:46:31 +05:00
acidicoala
ef5bc217b0 Fix Linux build 2025-10-05 16:31:53 +05:00
acidicoala
9f1a5edd5f Fix Linux build 2025-10-05 16:10:15 +05:00
acidicoala
d879b21bd4 Fix Linux build 2025-10-05 16:00:15 +05:00
acidicoala
5aa9ffef85 Refactored lib and module namespaces 2025-10-05 07:31:05 +05:00
acidicoala
0c6c8e02b6 Fix Build CI 2025-10-04 21:29:43 +05:00
acidicoala
0f5d98e42b Fix Build CI 2025-10-04 21:15:33 +05:00
acidicoala
2da049ec2a Fix Build CI 2025-10-04 21:02:31 +05:00
acidicoala
227a920e11 Fix Build CI 2025-10-04 21:01:00 +05:00
acidicoala
21a4f56145 Fix Build CI 2025-10-04 21:00:02 +05:00
acidicoala
3ab61365ce Fix Build CI 2025-10-04 20:59:37 +05:00
acidicoala
2ce8967257 Fix Build CI 2025-10-04 20:57:13 +05:00
acidicoala
83623841bd Fix Build CI 2025-10-04 20:56:42 +05:00
acidicoala
d46acb56e8 Fix Build CI 2025-10-04 20:53:25 +05:00
acidicoala
7ec6f5b277 Fix Build CI 2025-10-04 20:50:03 +05:00
acidicoala
7758663b2e Fix Build CI 2025-10-04 20:39:32 +05:00
acidicoala
3d5261e293 Fix Build CI 2025-10-04 20:37:48 +05:00
acidicoala
469299340f Fix Build CI 2025-10-04 20:35:26 +05:00
acidicoala
e3505e48fb Fix Build CI 2025-10-04 17:40:44 +05:00
acidicoala
35ea324898 Reworked lib::get_exports 2025-10-04 17:24:36 +05:00
acidicoala
b4c12f5a37 Fix Build CI 2025-10-04 05:22:37 +05:00
acidicoala
8a92c50fd3 Fix Build CI 2025-10-04 05:13:11 +05:00
acidicoala
fe5c4cede4 Fix Build CI 2025-10-04 04:55:27 +05:00
acidicoala
d7d5eb349b Fix Build CI 2025-10-04 04:39:39 +05:00
acidicoala
7b20bde2fc Fix Build CI 2025-10-04 04:22:50 +05:00
acidicoala
02e66ed624 Fix Build CI 2025-10-04 03:46:21 +05:00
acidicoala
23ee93464a Fix Build CI 2025-10-04 03:43:18 +05:00
acidicoala
ca5fcf8cb0 Added debug steps 2025-10-04 02:55:45 +05:00
acidicoala
2b3930031f Added debug steps 2025-10-04 02:41:27 +05:00
acidicoala
debb44c138 Added missing Linux dependencies 2025-10-04 01:39:56 +05:00
acidicoala
21cab6c469 Fix Build CI 2025-10-04 01:28:24 +05:00
acidicoala
7cb32f84db Added missing Linux dev dependencies 2025-10-04 01:16:00 +05:00
acidicoala
9a0ab12b86 Added missing Linux dev dependencies 2025-10-04 01:03:37 +05:00
acidicoala
05569a4019 Switch to clang compiler on Linux 2025-10-04 00:52:09 +05:00
acidicoala
49efd831bf Implemented get_section using elfio 2025-10-04 00:42:13 +05:00
acidicoala
9944f3bd3f Added missing header 2025-10-04 00:14:25 +05:00
acidicoala
53868e8bed Fix Build CI 2025-10-04 00:06:00 +05:00
acidicoala
842387bb2f Updated readme 2025-10-04 00:01:42 +05:00
acidicoala
c062696706 Fix build error 2025-10-03 23:46:00 +05:00
acidicoala
aea513fbd1 Fix missing optional include 2025-10-03 23:29:57 +05:00
acidicoala
99564ae4b7 Fix build CI, update major version 2025-10-03 23:12:32 +05:00
acidicoala
046df29a6b Fix Build CI 2025-10-03 23:06:38 +05:00
acidicoala
5012ed3da8 Added Linux instructions 2025-10-03 22:59:38 +05:00
acidicoala
297382f6a2 Fix build CI 2025-10-03 21:51:48 +05:00
acidicoala
e6fe7ad22e Fix build CI 2025-10-03 21:45:11 +05:00
acidicoala
548ba0fe00 Fix build CI 2025-10-03 21:42:05 +05:00
acidicoala
cd8be9f80a Fix build CI 2025-10-03 21:39:57 +05:00
acidicoala
ca4457556c Fix build CI 2025-10-03 21:37:29 +05:00
acidicoala
509b70c0b0 New build CI 2025-10-03 21:34:20 +05:00
acidicoala
ac9c1a3fcc Implement get_bitness on windows 2025-09-29 00:32:56 +05:00
acidicoala
265829f434 Full support for 64-bit Linux 2025-09-28 21:05:01 +05:00
acidicoala
d03f95adb7 Added notes about self-hook mode 2025-09-26 22:59:18 +05:00
acidicoala
d8e1333d42 Refactored tool deps into KoalaBoxTools 2025-09-26 22:49:10 +05:00
acidicoala
922b649fc3 Reworked configure_linker_exports 2025-09-26 00:16:15 +05:00
acidicoala
d829396c08 Refactored linux exports generator with inja 2025-09-25 01:24:53 +05:00
acidicoala
59d45c9dab 64-bit proxy mode for Linux 2025-09-24 22:37:53 +05:00
acidicoala
81a8ef42ab Version bump 2025-09-24 19:40:18 +05:00
acidicoala
e72bc29635 Replaced get_module_version_info with non-throwing variant 2025-09-23 18:29:55 +05:00
acidicoala
593c0cb4bc Added win::check_self_duplicates 2025-09-23 15:00:00 +05:00
acidicoala
d3fd17779c Updated readme [skip ci] 2025-09-22 23:07:37 +05:00
acidicoala
f5b8c0c89f Added support for self-injection via winhttp.dll 2025-09-22 22:47:53 +05:00
acidicoala
8decbafb53 Reworked algorithm for finding App ID 2025-09-22 21:31:47 +05:00
acidicoala
7ab9895b58 Added winmm.dll for self-injection 2025-09-22 03:57:11 +05:00
acidicoala
c75bbcf636 Fix CI 2025-09-22 01:45:26 +05:00
acidicoala
c409ff3202 Sync KoalaBox 2025-09-21 23:39:07 +05:00
acidicoala
8a6c8d0fba Sync KoalaBox 2025-09-21 23:37:21 +05:00
acidicoala
7781636335 Fix CI 2025-09-21 22:34:04 +05:00
acidicoala
e0ba771d52 Fix CI 2025-09-21 22:26:59 +05:00
acidicoala
b0a4ea0f24 Version bump 2025-09-21 22:18:27 +05:00
acidicoala
c5f8a37702 Fixed late hooking 2025-09-21 21:48:24 +05:00
acidicoala
50b7792375 Replaced local ntapi.hpp with winsiderss/phnt 2025-09-21 07:00:04 +05:00
acidicoala
bdbd02087c Restored Steamworks SDK v1.62 + linux bin fixer 2025-09-20 23:27:03 +05:00
acidicoala
f30aee0da9 Use init_null_logger 2025-09-20 07:54:13 +05:00
acidicoala
b4a9e8fd79 Switch to DLL_MAIN helper 2025-09-20 07:36:49 +05:00
acidicoala
89fbd9e06c Added sync config 2025-09-19 22:53:57 +05:00
acidicoala
1fe86ef1de Fixed Windows build 2025-09-19 19:55:11 +05:00
acidicoala
d8cdf41439 Fix linux build 2025-09-19 17:03:11 +05:00
acidicoala
a7b95fc907 Sync with KoalaBox 2025-09-19 02:14:17 +05:00
acidicoala
3544436df7 Save dll_listener context 2025-09-18 06:36:17 +05:00
acidicoala
d80fd562ca Version bump 2025-09-18 00:50:23 +05:00
acidicoala
d7b13bdd30 Fixed windows build 2025-09-18 00:33:37 +05:00
acidicoala
3a186da49d Restored PolyHook2 link 2025-09-17 23:29:18 +05:00
acidicoala
53afd78574 Fix proxy & hook mode on linux-x64 2025-09-16 21:41:06 +05:00
acidicoala
51709b53ad [WIP] Linux support 2025-09-14 14:52:16 +05:00
acidicoala
69e7af6dae [WIP] Linux support 2025-09-13 01:16:21 +05:00
acidicoala
b102faa287 Extracted linux binaries 2025-09-13 01:16:08 +05:00
acidicoala
a15dae42a8 Extracted steam headers with original file endings 2025-09-12 18:52:43 +05:00
acidicoala
5debdc819f Bump to v3.1.2 2025-09-11 19:14:08 +05:00
acidicoala
24b381a834 Fixed build issues 2025-09-11 18:32:18 +05:00
acidicoala
904dfb9fbb Removed steamclient unhooking 2025-09-11 18:20:47 +05:00
acidicoala
cd17470117 Fixed readme reference 2025-09-11 15:15:24 +05:00
acidicoala
b2ab3c3116 Replaced ascii-doc readme with one generated by sync 2025-09-11 15:11:22 +05:00
acidicoala
8ee2d77115 Fixed build errors 2025-09-07 02:36:14 +05:00
acidicoala
4c08816eb6 Reworked late hooking 2025-09-07 02:02:59 +05:00
acidicoala
6b4b7610f4 Fix proxy mode 2 2025-09-05 18:05:30 +05:00
acidicoala
61ff1df065 Fix proxy mode 2025-09-04 23:49:54 +05:00
acidicoala
141a0bcc58 Version bump 2025-09-04 23:05:53 +05:00
acidicoala
bdab9b574f Moved get_app_id() 2025-09-04 19:01:16 +05:00
acidicoala
4581c36913 Deactivated steam_api exports 2025-09-04 18:53:05 +05:00
254 changed files with 53190 additions and 5692 deletions

View File

@@ -70,4 +70,5 @@ misc-*,
-readability-function-cognitive-complexity,
-*-include-cleaner,
-*-lambda-function-name,
-*-err58-cpp'
-*-err58-cpp,
-*-misplaced-const'

3
.gitattributes vendored
View File

@@ -1 +1,4 @@
* text eol=lf
*.dll binary
*.so binary

View File

@@ -1,18 +0,0 @@
name: Continuous Integration
on: push
jobs:
ci:
name: CI
uses: acidicoala/KoalaBox/.github/workflows/build-and-package.yml@1bdfeefa9933092a747c46679b3d872470ef4998
permissions:
contents: write
with:
arch: '[ 32, 64 ]'
config: Release
modules: '[ "SmokeAPI" ]'
zip_command: >
zip -j $ZIP_NAME
artifacts/*/*.dll
res/SmokeAPI.config.json
res/README.txt

11
.github/workflows/dev-build.yml vendored Normal file
View File

@@ -0,0 +1,11 @@
name: '🚧 Development Build'
on:
push:
branches:
- '**' # This prevents dev builds on tag pushes
jobs:
dev-build:
name: '🚧 Development Build'
uses: acidicoala/SmokeAPI/.github/workflows/matrix-build.yml@master

18
.github/workflows/matrix-build.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
name: Matrix Build
on:
workflow_call:
jobs:
build:
strategy:
fail-fast: false
matrix:
os: [ Linux, Windows ]
bitness: [ 32, 64 ]
uses: acidicoala/KoalaBox/.github/workflows/build-cmake.yml@master
with:
module: SmokeAPI
os: ${{ matrix.os }}
bitness: ${{ matrix.bitness }}

20
.github/workflows/tag-release.yml vendored Normal file
View File

@@ -0,0 +1,20 @@
name: '🏷️ Tag Release'
on:
push:
tags:
- '*'
jobs:
build-binaries:
name: '🏗️ Build Binaries'
uses: acidicoala/SmokeAPI/.github/workflows/matrix-build.yml@master
create-release:
name: '📦 Create Release'
uses: acidicoala/KoalaBox/.github/workflows/create-release.yml@master
needs: build-binaries
with:
zip_files: >
res/README.txt
res/SmokeAPI.config.json

2
.idea/SmokeAPI.iml generated
View File

@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CMake" type="CPP_MODULE" version="4" />
<module classpath="CIDR" type="CPP_MODULE" version="4" />

4
.idea/cmake.xml generated
View File

@@ -2,8 +2,8 @@
<project version="4">
<component name="CMakeSharedSettings">
<configurations>
<configuration PROFILE_NAME="Debug [32] (Template: copy and set the 32-bit toolchain)" ENABLED="false" GENERATION_DIR="build/32" CONFIG_NAME="Debug" GENERATION_OPTIONS="-G &quot;Visual Studio 17 2022&quot; -A Win32" />
<configuration PROFILE_NAME="Debug [64] (Template: copy and set the 64-bit toolchain)" ENABLED="false" GENERATION_DIR="build/64" CONFIG_NAME="Debug" GENERATION_OPTIONS="-G &quot;Visual Studio 17 2022&quot; -A x64" />
<configuration PROFILE_NAME="Debug [32] (Template: copy and set the 32-bit toolchain)" ENABLED="false" GENERATION_DIR="build/32-debug" CONFIG_NAME="Debug" GENERATION_OPTIONS="-G &quot;Visual Studio 17 2022&quot; -A Win32 -DCMAKE_BUILD_TYPE=Debug" />
<configuration PROFILE_NAME="Debug [64] (Template: copy and set the 64-bit toolchain)" ENABLED="false" GENERATION_DIR="build/64-debug" CONFIG_NAME="Debug" GENERATION_OPTIONS="-G &quot;Visual Studio 17 2022&quot; -A x64 -DCMAKE_BUILD_TYPE=Debug" />
</configurations>
</component>
</project>

View File

@@ -54,7 +54,6 @@
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_DEREF_IN_TRAILING_RETURN_TYPES/@EntryValue" value="ON_SINGLE_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_BEFORE_FUNCTION_TRY_BLOCK/@EntryValue" value="LINE_BREAK" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COMMA_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_USER_LINEBREAKS/@EntryValue" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_LIMIT/@EntryValue" value="100" type="long" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BRACED_INIT_LIST_STYLE/@EntryValue" value="CHOP_IF_LONG" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BASE_CLAUSE_STYLE/@EntryValue" value="CHOP_IF_LONG" type="string" />
@@ -75,7 +74,6 @@
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_ENUM_INITIALIZERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_BITFIELD_SIZES/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SIMPLE_BLOCK_STYLE/@EntryValue" />
</RiderCodeStyleSettings>
<editorconfig>
<option name="ENABLED" value="false" />

View File

@@ -1,5 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
<option name="PREFERRED_PROJECT_CODE_STYLE" value="acidicoala" />
</state>
</component>

View File

@@ -4,7 +4,16 @@
<w>abcdefghijklmnopqrstuvwxyz</w>
<w>acidicoala</w>
<w>ajaxgetdlclist</w>
<w>cstring</w>
<w>dlmopen</w>
<w>dlopen</w>
<w>dlsym</w>
<w>dynsym</w>
<w>elfio</w>
<w>endfor</w>
<w>ghcr</w>
<w>indicies</w>
<w>inja</w>
<w>inlinentd</w>
<w>isteamapps</w>
<w>isteamclient</w>
@@ -13,9 +22,21 @@
<w>koalabox</w>
<w>koality</w>
<w>koaloader</w>
<w>libgtk</w>
<w>libsteam</w>
<w>memcpy</w>
<w>movabs</w>
<w>movl</w>
<w>peparse</w>
<w>phnt</w>
<w>polyhook</w>
<w>rtld</w>
<w>simplecpp</w>
<w>steamapi</w>
<w>steamapps</w>
<w>steamclient</w>
<w>winhttp</w>
<w>winmm</w>
<w>wstr</w>
</words>
</dictionary>

View File

@@ -0,0 +1,7 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" value="acidicoala" />
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

1
.idea/misc.xml generated
View File

@@ -20,4 +20,5 @@
<option name="useRustfmt" value="true" />
<option name="version" value="2" />
</component>
<component name="WestSettings"><![CDATA[{}]]></component>
</project>

View File

@@ -1,7 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="exports_generator [64]" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="FALSE steam_api64_o $ProjectFileDir$/res/steamworks/*/binaries/steam_api64.dll $ProjectFileDir$/build/64/linker_exports.h $ProjectFileDir$/src/game_mode/exports" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SmokeAPI" TARGET_NAME="exports_generator" CONFIG_NAME="Debug [32]" RUN_TARGET_PROJECT_NAME="SmokeAPI" RUN_TARGET_NAME="exports_generator">
<method v="2">
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@@ -0,0 +1,7 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="linux_exports_generator [32]" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="--input_libs_glob $ProjectFileDir$/res/steamworks/*/binaries/linux32/libsteam_api.so --output_path $ProjectFileDir$/src/generated/32/proxy_exports" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SmokeAPI" TARGET_NAME="linux_exports_generator" CONFIG_NAME="Debug [32]" RUN_TARGET_PROJECT_NAME="SmokeAPI" RUN_TARGET_NAME="linux_exports_generator">
<method v="2">
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@@ -0,0 +1,7 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="linux_exports_generator [64]" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="--input_libs_glob $ProjectFileDir$/res/steamworks/*/binaries/linux64/libsteam_api.so --output_path $ProjectFileDir$/src/generated/64/proxy_exports" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SmokeAPI" TARGET_NAME="linux_exports_generator" CONFIG_NAME="Debug [64]" RUN_TARGET_PROJECT_NAME="SmokeAPI" RUN_TARGET_NAME="linux_exports_generator">
<method v="2">
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@@ -1,5 +1,5 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="steamworks_parser" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$ProjectFileDir$/res/" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SmokeAPI" TARGET_NAME="steamworks_parser" CONFIG_NAME="Debug [32]" RUN_TARGET_PROJECT_NAME="SmokeAPI" RUN_TARGET_NAME="steamworks_parser">
<configuration default="false" name="steamworks_parser" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$ProjectFileDir$/res/" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SmokeAPI" TARGET_NAME="steamworks_parser" CONFIG_NAME="Debug [64]" RUN_TARGET_PROJECT_NAME="SmokeAPI" RUN_TARGET_NAME="steamworks_parser">
<method v="2">
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
</method>

7
.idea/runConfigurations/sync.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="sync" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$ProjectFileDir$" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SmokeAPI" TARGET_NAME="sync" CONFIG_NAME="Debug [32]" RUN_TARGET_PROJECT_NAME="SmokeAPI" RUN_TARGET_NAME="sync">
<method v="2">
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@@ -0,0 +1,7 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="windows_exports_generator [64]" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="--forwarded_dll_name &quot;steam_api64_o&quot; --lib_files_glob &quot;$ProjectFileDir$\res\steamworks\*\binaries\steam_api64.dll&quot; --output_file_path &quot;$CMakeCurrentGenerationDir$\generated\linker_exports_for_steam_api.h&quot; --sources_input_path &quot;&quot;" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SmokeAPI" TARGET_NAME="windows_exports_generator" CONFIG_NAME="Debug [64]" RUN_TARGET_PROJECT_NAME="SmokeAPI" RUN_TARGET_NAME="windows_exports_generator">
<method v="2">
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@@ -1,18 +1,11 @@
cmake_minimum_required(VERSION 3.24)
project(SmokeAPI VERSION 3.1.0)
project(SmokeAPI VERSION 4.1.0)
include(KoalaBox/cmake/KoalaBox.cmake)
add_subdirectory(KoalaBox EXCLUDE_FROM_ALL)
add_subdirectory(KoalaBox)
add_subdirectory(tools)
set_32_and_64(STEAMAPI_DLL steam_api)
set_32_and_64(STEAMCLIENT_DLL steamclient)
set_32_and_64(STEAM_API_DLL steam_api.dll steam_api64.dll)
configure_build_config(extra_build_config)
set(SMOKE_API_STATIC_SOURCES
static/smoke_api/interfaces/steam_apps.hpp
static/smoke_api/interfaces/steam_apps.cpp
@@ -33,13 +26,24 @@ set(SMOKE_API_STATIC_SOURCES
static/smoke_api/steamclient/steamclient.hpp
)
if(IS_LINUX)
set(GENERATED_SOURCES_DIR src/generated/${BITNESS})
file(MAKE_DIRECTORY ${GENERATED_SOURCES_DIR})
set(GENERATED_SOURCES
${GENERATED_SOURCES_DIR}/proxy_exports.hpp
${GENERATED_SOURCES_DIR}/proxy_exports.cpp
)
foreach(SRC IN LISTS GENERATED_SOURCES)
file(TOUCH ${SRC})
endforeach()
endif()
set(SMOKE_API_SOURCES
${SMOKE_API_STATIC_SOURCES}
${GENERATED_SOURCES}
src/smoke_api/smoke_api.cpp
src/smoke_api/smoke_api.hpp
src/steam_api/exports/steam_api.cpp
src/steam_api/exports/steam_api.hpp
src/steam_api/exports/steam_api_unversioned.cpp
src/steam_api/virtuals/isteamapps.cpp
src/steam_api/virtuals/isteamclient.cpp
src/steam_api/virtuals/isteamgameserver.cpp
@@ -49,12 +53,26 @@ set(SMOKE_API_SOURCES
src/steam_api/virtuals/steam_api_virtuals.hpp
src/steam_api/steam_client.hpp
src/steam_api/steam_client.cpp
src/steam_api/steam_interface.cpp
src/steam_api/steam_interface.hpp
src/steam_api/steam_interfaces.cpp
src/steam_api/steam_interfaces.hpp
src/steamclient/steamclient.cpp
src/main.cpp
)
if(WIN32)
set_32_and_64(STEAM_API_MODULE steam_api)
set_32_and_64(STEAMCLIENT_DLL steamclient)
list(APPEND SMOKE_API_SOURCES src/main_win.cpp)
else()
set(STEAM_API_MODULE libsteam_api)
set(STEAMCLIENT_DLL steamclient)
list(APPEND SMOKE_API_SOURCES src/main_linux.cpp)
endif()
set_32_and_64(SMOKE_API_FILENAME smoke_api32 smoke_api64)
configure_build_config(extra_build_config)
### SmokeAPI interface
add_library(SmokeAPI_common INTERFACE)
@@ -65,7 +83,6 @@ target_include_directories(SmokeAPI_common INTERFACE
)
target_link_libraries(SmokeAPI_common INTERFACE KoalaBox $<TARGET_OBJECTS:KoalaBox>)
### Static SmokeAPI
add_library(SmokeAPI_static STATIC ${SMOKE_API_STATIC_SOURCES})
@@ -77,36 +94,51 @@ target_link_libraries(SmokeAPI_static PUBLIC SmokeAPI::common)
add_library(SmokeAPI SHARED ${SMOKE_API_SOURCES})
target_link_libraries(SmokeAPI PUBLIC SmokeAPI::common)
set_target_properties(SmokeAPI PROPERTIES RUNTIME_OUTPUT_NAME ${STEAMAPI_DLL})
configure_version_resource(
TARGET SmokeAPI
FILE_DESC "Steamworks DLC unlocker"
ORIG_NAME SmokeAPI
)
target_include_directories(SmokeAPI PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/src"
"${CMAKE_CURRENT_BINARY_DIR}"
)
set_target_properties(SmokeAPI PROPERTIES OUTPUT_NAME ${SMOKE_API_FILENAME})
configure_include_directories()
## https://github.com/batterycenter/embed
target_compile_definitions(SmokeAPI PUBLIC B_PRODUCTION_MODE)
CPMAddPackage(
URI "gh:batterycenter/embed@1.2.19"
OPTIONS "B_PRODUCTION_MODE ON"
)
b_embed(SmokeAPI "res/interface_lookup.json")
configure_linker_exports(
TARGET SmokeAPI
HEADER_NAME "linker_exports_for_steam_api"
FORWARDED_DLL "${STEAMAPI_DLL}_o"
INPUT_SOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/steam_api/exports"
DLL_FILES_GLOB "${CMAKE_CURRENT_SOURCE_DIR}/res/steamworks/*/binaries/${STEAM_API_DLL}"
)
if(WIN32)
configure_version_resource(
TARGET SmokeAPI
FILE_DESC "Steamworks DLC unlocker"
ORIG_NAME ${SMOKE_API_FILENAME}
)
configure_linker_exports(
TARGET SmokeAPI
HEADER_NAME "linker_exports_for_steam_api.h"
FORWARDED_DLL_NAME "${STEAM_API_MODULE}_o"
LIB_FILES_GLOB "${CMAKE_CURRENT_SOURCE_DIR}/res/steamworks/*/binaries/${STEAM_API_MODULE}.dll"
SOURCES_INPUT_PATH ""
)
configure_linker_exports(
TARGET SmokeAPI
HEADER_NAME "linker_exports_for_version"
FORWARDED_DLL "C:/Windows/System32/version.dll"
INPUT_SOURCES_DIR ""
DLL_FILES_GLOB "C:/Windows/System32/version.dll"
)
set(HEADER_CONTENT "#pragma once\n\n")
foreach(WIN_DLL version winhttp winmm)
set(HEADER_NAME "linker_exports_for_${WIN_DLL}.h")
configure_linker_exports(
TARGET SmokeAPI
HEADER_NAME "${HEADER_NAME}"
FORWARDED_DLL_NAME "C:/Windows/System32/${WIN_DLL}.dll"
LIB_FILES_GLOB "C:/Windows/System32/${WIN_DLL}.dll"
SOURCES_INPUT_PATH ""
)
set(HEADER_CONTENT "${HEADER_CONTENT}#include <${HEADER_NAME}>\n")
endforeach()
file(GENERATE
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/generated/linker_exports_for_windows_dlls.h"
CONTENT "${HEADER_CONTENT}"
)
# Ignore linker warnings regarding COM-related private exports
set_target_properties(SmokeAPI PROPERTIES LINK_FLAGS "/ignore:4104")
endif()

View File

@@ -1,288 +0,0 @@
= SmokeAPI
_Legit DLC Unlocker for Steamworks_
== ✨ Features
* 🔓 Legit DLC Unlocking
* 🛅 Inventory emulation
* 📝 Config-less operation
* 2⃣ installation methods:
** 🪝 Hook mode
** 🔀 Proxy mode
== 🔗 Links
:forum-topic: https://cs.rin.ru/forum/viewtopic.php?p=2597932#p2597932[SmokeAPI forum topic]
* 📥 https://github.com/acidicoala/SmokeAPI/releases/latest[Download the latest release]
* 💬 {forum-topic}
== 📖 Introduction
=== What is SmokeAPI?
SmokeAPI is a DLC unlocker for the games that are legitimately owned in your Steam account.
It attempts to fool games that use Steamworks SDK into believing that you own desired DLCs.
However, SmokeAPI does not modify the rest of the Steamworks SDK, hence features like multiplayer, achievements, etc. remain fully functional.
IMPORTANT: DLC unlocking is possible only in games that specifically use Steamworks SDK for ownership verification.
But games may implement additional ownership checks, which may require custom solutions.
If the check is server-side, as is the case in online-only games, then SmokeAPI cannot help in any way.
Finally, even if you unlock the DLCs, games might still require additional DLC files, which would have to be downloaded from somewhere else.
Check corresponding game topic in the forum for possible download links.
.Supported versions
[%collapsible]
====
SmokeAPI aims to support all released SteamAPI versions.
When it encountered a new, unsupported interface version, it will fall back on the latest supported version.
Below is a list of supported interface versions:
* ISteamClient v6 — v21. (Versions before 6 did not contain any DLC related interfaces)
* ISteamApps v2 — v8. (Version 1 did not contain any DLC related functions)
* ISteamUser v12 — v23. (Versions before 12 did not contain any DLC related functions)
* ISteamInventory v1 — v3.
Steam inventory does not work in all games with steam inventory because of custom implementation, and online checks.
====
== 🛠 Installation Instructions
WARNING: Please proceed with installation at your own risk.
Usage of this unlocker entails breaking one or more terms of service, which might result in a permanent ban/deactivation of your account.
:koaloader: https://github.com/acidicoala/Koaloader[Koaloader]
:smokeapi_release: https://github.com/acidicoala/SmokeAPI/releases/latest[SmokeAPI Releases]
SmokeAPI is loaded into a game process, which limits it to that particular game only.
SmokeAPI supports 2 installation modes: hook mode and proxy mode.
|===
|Mode |Advantages |Disadvantages
|🪝 Hook mode
|Persists after game updates
|Might need an additional DLL (Koaloader)
|🔀 Proxy mode
|Guaranteed to load
|Might need reinstallation if Steam updates affected DLL files
|===
Try installing the unlocker in hook mode first.
If it doesn't work, try installing it in proxy mode.
=== 🪝 Hook mode
. Download the latest SmokeAPI release zip from {smokeapi_release}.
. From SmokeAPI archive unpack `steam_api.dll` or `steam_api64.dll`, depending on the game bitness, rename it to `version.dll`, and place it next to the game exe file.
=== 🪝 Hook mode (Alternative)
If a game doesn't load `version.dll`, you can use one of the {koaloader} DLLs that the game does in fact load.
For example, assuming that the game loads `winmm.dll`:
. Download the latest Koaloader release zip from https://github.com/acidicoala/Koaloader/releases/latest[Koaloader Releases].
. From Koaloader archive unpack `winmm.dll` from `winmm-32` or `winmm-64`, depending on the game bitness, and place it next to the game exe file.
. Download the latest SmokeAPI release zip from {smokeapi_release}.
. From SmokeAPI archive unpack `steam_api.dll` or `steam_api64.dll`, depending on the game bitness, rename it to `SmokeAPI.dll`, and place it next to the game exe file.
==== 🔀 Proxy mode
. Find `steam_api.dll` / `steam_api64.dll` file in game directory, and rename it to `steam_api_o.dll` / `steam_api64_o.dll`.
. Download the latest SmokeAPI release zip from {smokeapi_release}.
. From SmokeAPI archive unpack `steam_api.dll`/`steam_api64.dll`, depending on the game bitness, and place it next to the original steam_api DLL file.
If the unlocker is not working as expected, then please fully read the https://gist.github.com/acidicoala/2c131cb90e251f97c0c1dbeaf2c174dc[Generic Unlocker Installation Instructions] before seeking support in the {forum-topic}.
== ⚙ Configuration
NOTE: This document describes configuration for version 3 of SmokeAPI.
You can find the version 2 documentation https://github.com/acidicoala/SmokeAPI/blob/v2.0.5/README.md#-configuration[here].
:fn-app-id: footnote:fn-app-id[App/DLC IDs can be obtained from https://steamdb.info[SteamDB] or https://steambase.io[Steambase]. Keep in mind that you need to be signed in with a steam account in order to see accurate inventory item IDs on that website.]
SmokeAPI does not require any manual configuration.
By default, it uses the most reasonable options and tries to unlock all DLCs that it can.
However, there might be circumstances in which you need more custom-tailored behaviour, such as disabling certain DLCs, or selectively enabling just a few of them.
In this case you can use a configuration file link:res/SmokeAPI.config.json[SmokeAPI.config.json] that you can find here in this repository or in the release zip.
To use it, simply place it next to the SmokeAPI DLL.
It will be read upon each launch of the game.
In the absence of the config file, default values specified below will be used.
The configuration file is expected to conform to the JSON standard.
All options within the config file are optional.
`logging`:: Toggles generation of a `SmokeAPI.log.log` file.
+
[horizontal]
Type::: Boolean
Default::: `false`
`log_steam_http`:: Toggles logging of _SteamHTTP_ traffic.
+
[horizontal]
Type::: Boolean
Default::: `false`
`default_app_status`:: This option sets the default DLC unlocking behaviour.
+
[horizontal]
Possible values:::
+
[horizontal]
`original`:::: Leaves DLC unlock status unmodified, unless specified otherwise.
`unlocked`:::: Unlocks all DLCs in all games, unless specified otherwise.
Type::: String
Default::: `unlocked`
`override_app_status`:: This option overrides the status of all DLCs that belong to a specified app ID{fn-app-id}.
+
[horizontal]
Possible values::: An object with key-value pairs, where the key corresponds to the app ID, and value to the app status.
Possible app status values are defined in the `default_app_status` option.
Type::: Object
Default::: `{}`
`override_dlc_status`:: This option overrides the status of individual DLCs, regardless of the corresponding app status.
+
[horizontal]
Possible values::: An object with key-value pairs, where the key corresponds to the app ID, and value to the app status.
Possible app status values are defined in the `default_app_status` option.
Furthermore, it is possible to lock even the legitimately locked DLCs by setting the corresponding app status value to `locked`.
Type::: Object
Default::: `{}`
`auto_inject_inventory`:: Toggles whether SmokeAPI should automatically inject a list of all registered inventory items, when a game queries user inventory
+
[horizontal]
Type::: Boolean
Default::: `true`
`extra_inventory_items`:: A list of inventory items IDs{fn-app-id} that will be added in addition to the automatically injected items.
+
[horizontal]
Type::: Array (of Integers)
Default::: `[]`
=== Advanced options
`$version`:: A technical field reserved for use by tools like GUI config editors.
Do not modify this value.
+
[horizontal]
Type::: Integer
Default::: `3`
`extra_dlcs`:: See <<How SmokeAPI works in games with large number of DLCs>> to understand the use case for this option.
+
[horizontal]
Possible values::: An object with key-value pairs, where the key corresponds to the app ID, and value to the object that contains DLC IDs.
The format is the same as in the aforementioned GitHub config.
Type::: Object
Default::: `{}`
.Complete example
[%collapsible]
====
[source,json]
----
{
"$version": 4,
"logging": true,
"log_steam_http": true,
"default_app_status": "unlocked",
"override_app_status": {
"1234": "original",
"4321": "unlocked"
},
"override_dlc_status": {
"1234": "original",
"4321": "unlocked",
"5678": "locked"
},
"auto_inject_inventory": true,
"extra_inventory_items": [],
"extra_dlcs": {
"1234": {
"dlcs": {
"56789": "Example DLC 1"
}
},
"4321": {
"dlcs": {
"98765": "Example DLC 2",
"98766": "Example DLC 3"
}
}
}
}
----
====
== Extra info
=== How SmokeAPI works in games with large number of DLCs
Some games that have a large number of DLCs begin ownership verification by querying the Steamworks API for a list of all available DLCs.
Once the game receives the list, it will go over each item and check the ownership.
The issue arises from the fact that response from Steamworks SDK may max out at 64, depending on how much unowned DLCs the user has.
To alleviate this issue, SmokeAPI will make a web request to Steam API for a full list of DLCs, which works well most of the time.
Unfortunately, even the web API does not solve all of our problems, because it will return only DLCs that are available in Steam store.
This means that DLCs without a dedicated store offer, such as pre-order DLCs will be left out.
That's where the `extra_dlcs` config option comes into play.
You can specify those missing DLC IDs there, and SmokeAPI will make them available to the game.
However, this introduces the need for manual configuration, which goes against the ideals of this project.
To remedy this issue SmokeAPI will also fetch a https://github.com/acidicoala/public-entitlements/blob/main/steam/v2/dlc.json[manually maintained list of extra DLCs] stored in a GitHub repository.
The purpose of this document is to contain all the DLC IDs that are lacking a Steam store page.
This enables SmokeAPI to unlock all DLCs without any config file at all.
Feel free to report in the {forum-topic} games that have more than 64 DLCs,
_and_ have DLCs without a dedicated store page.
They will be added to the list of missing DLC IDs to facilitate config-less operation.
== 🏗️ Building from source
=== 🚦 Requirements
:vs-bt-2022: https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022[Visual Studio Build Tools 2022]
* CMake v3.24 (Make sure that cmake is available from powershell)
* {vs-bt-2022} with `Desktop Development for C++` workload installed
** Tested on Windows 11 SDK (10.0.26100.4188)
=== 👨‍💻 Commands
Build the project
----
.\build.ps1 <arch> <config>
----
where
[horizontal]
arch::: `32` or `64`
config::: `Debug` or `Release`
For example:
----
.\build.ps1 64 Release
----
== 🐞 Known issues
* Crashes on startup in Project Winter in hook mode (proxy mode works fine).
== 📚 Open-Source libraries
* https://github.com/batterycenter/embed[batterycenter/embed]
* https://github.com/bshoshany/thread-pool[bshoshany/thread-pool]
* + https://github.com/acidicoala/Koalabox?tab=readme-ov-file#-open-source-libraries[libraries used by KoalaBox]
== 📄 License
This software is licensed under the https://unlicense.org/[Unlicense], terms of which are available in link:UNLICENSE.txt[UNLICENSE.txt]

453
README.md Normal file
View File

@@ -0,0 +1,453 @@
<!-- Generated by KoalaBox::sync tool. Manual changes to this file will be lost. -->
# SmokeAPI
_Legit DLC ownership emulation for Steamworks._
## ✨ Features
* `🔓` Emulate DLC ownership in legitimately owned games
* `🛅` Emulate Inventory item ownership
* `📄` Optional configuration
* `🐧` Support for 32-bit and 64-bit Windows and Linux systems
## 🔗 Links
* `📥` [Download the latest release](https://github.com/acidicoala/SmokeAPI/releases/latest)
* `🪧` [SmokeAPI forum topic](https://cs.rin.ru/forum/viewtopic.php?p=2597932#p2597932)
* `🗂️` [DLC Database](https://steamdb.info/)
## 📖 Introduction
### ❓ What is SmokeAPI?
SmokeAPI is a tool for Steamworks DLC ownership emulation in games that are _legitimately_ owned in Steam.
It attempts to fool games that use Steamworks SDK (Steamworks) into thinking that you own the game's DLCs.
However, SmokeAPI does not modify the rest of the Steamworks, hence features like multiplayer, achievements, and so on remain fully functional.
### ❔ Which games are supported?
Only games that use Steamworks SDK for the DLC ownership verification are supported.
Hence, if a game's installation directory does not contain any `steam_api.dll` or `steam_api64.dll` files then it's definitely not supported.
Even if a game uses Steamworks DLL, it's not guaranteed to be supported because each game might implement additional custom verification checks.
Therefore, **you have to first research the game's topic**, to see if it supports unlocking.
Additionally, there are several points to bear in mind when it comes to unlocking DLCs with SmokeAPI:
* SmokeAPI most definitely will not work with games that use 3rd party DRM, such as games from Ubisoft, Rockstar, etc.
* SmokeAPI most likely will not work with games that use Denuvo SecureDLC.
* SmokeAPI is unlikely to unlock anything in Free-To-Play games since they typically store all player data on the corresponding game server and hence all the checks are server-side.
* SmokeAPI will not work with games that employ additional ownership protection or if the game is using alternative DLC verification mechanism.
* SmokeAPI is unlikely to work with games that use an anti-cheat, since they typically detect any DLL/EXE that has been tampered with. Sometimes it is possible to disable an anti-cheat, but that typically entails the loss of online capabilities. Search in the respective game topic for more information about how to disable anti-cheat.
* Some games include DLC files in their base game, regardless of whether you own the DLC or not. However, some games download additional DLC files only after a user has bought the corresponding DLC. In this case, not only will you need to install SmokeAPI, but you also have to get the additional DLC files from somewhere else and put them into the game folder. Up-to-date DLC files often can be found in corresponding game topics.
* Some games don't use any DRM at all, in which case SmokeAPI is useless. All you need to do is to download the DLC files and place them in the game folder.
## :shipit: Usage
> [!WARNING]
> Please proceed with usage at your own risk.
> Usage of this unlocker entails breaking one or more terms of service,
> which might result in a permanent loss of your account.
To use SmokeAPI, you need to install it into the game folder following the instructions below.
Once installed, SmokeAPI is automatically loaded by a game every time you launch the game.
SmokeAPI supports **2** installation modes: _Hook mode_ and _Proxy mode_.
### ↔️ Mode comparison
#### 🪝 Hook mode
- **Advantages**:
- Persists after game updates
- Can be loaded by other injectors
- Can sometimes bypass DLL integrity checks
- **Disadvantages**:
- Might need an additional DLL to get injected (like [Koaloader])
#### 🔀 Proxy mode
- **Advantages**:
- Guaranteed to load
- **Disadvantages**:
- Might need reinstallation after a game update
My advice is to try installing the unlocker in hook mode first.
If it doesn't work, try installing it in proxy mode instead.
If that didn't work, refer to the _Troubleshooting_ section below.
## 🛠 Installation instructions (🪟 Windows)
> [!NOTE]
> To determine the bitness of a game you can open _Task Manager_, navigate to _Details_ tab,
> right-click on the column headers, click _Select columns_, tick checkbox next to _Platform_ and click _OK_.
> This will allow you to see a game's bitness in the _Details_ tab while a game is running.
### 🪝 Hook mode
Hook mode itself has two sub-modes: Self-Hook and Hook with injector.
#### 🪝 Self-Hook mode
In self-hook mode SmokeAPI is injected automatically without the help of third-party injectors.
It works best when a game doesn't have any protections against DLL injection.
The main advantage of this mode is its minimal setup, which adds only 1 new DLL to the game folder.
- Download the [latest SmokeAPI release zip].
- From this downloaded zip extract `smoke_api32.dll` or `smoke_api64.dll`, depending on a game's bitness.
- Rename the unzipped DLL to `version.dll` or `winhttp.dll` or `winmm.dll`.
- Place this `version.dll` or `winhttp.dll` or `winmm.dll` next to the game's `.exe` file.
#### 🪝 Hook mode with Koaloader
If a game doesn't load `version.dll` or `winhttp.dll` or `winmm.dll`, you can use an alternative injector to load
SmokeAPI into the game process.
One such injector is [Koaloader], which supports different DLLs that a typical game might load.
For example, assuming that the game loads `d3d11.dll`:
- Install Koaloader:
- Download the [latest Koaloader release zip].
- From this downloaded zip extract `d3d11.dll` from `d3d11-32` or `d3d11-64`, depending on a game's bitness.
- Place `d3d11.dll` next to the game's `.exe` file.
- Install SmokeAPI
- Download the [latest SmokeAPI release zip].
- From this downloaded zip extract `smoke_api32.dll` or `smoke_api64.dll`, depending on a game's bitness.
- Place `smoke_api32.dll` or `smoke_api64.dll` next to the game's `.exe` file.
#### 🪝 Hook mode with Special K
There are games which have extra protections that break hook mode.
In such cases, it might be worth trying [Special K], which can inject SmokeAPI as a [custom plugin].
---
### 🔀 Proxy mode
- Find a `steam_api.dll` or `steam_api64.dll` file in game directory, and rename it to `steam_api_o.dll` or `steam_api64_o.dll`.
- Download the [latest SmokeAPI release zip].
- From this downloaded zip extract `smoke_api32.dll` or `smoke_api64.dll`, depending on a game's bitness.
- Rename this extracted DLL to `steam_api.dll` or `steam_api64.dll`, depending on a game's bitness.
- Place this renamed unlocker DLL next to the `steam_api_o.dll` or `steam_api64_o.dll` file.
[latest SmokeAPI release zip]: https://github.com/acidicoala/SmokeAPI/releases/latest
[latest Koaloader release zip]: https://github.com/acidicoala/Koaloader/releases/latest
[Special K]: https://www.special-k.info
[custom plugin]: https://wiki.special-k.info/en/SpecialK/Tools#custom-plugin
## 🛠️ Installation instructions (🐧 Linux)
> [!NOTE]
> Linux support in SmokeAPI is highly experimental/unstable and has known issues.
> If none of the methods below work for you, then consider running a Windows version of a game
> via Proton compatibility layer and follow the instructions in the Windows section.
### ✔️ Requirements
Linux builds of SmokeAPI depend on several libraries. Make sure they are installed on your system.
The following list features links in Arch Linux repositories, but if you are using a different distribution,
you should use the equivalent package for your distro.
Required libraries:
- [brotli](https://archlinux.org/packages/core/x86_64/brotli/)
[[32-bit](https://archlinux.org/packages/multilib/x86_64/lib32-brotli/)]
- [gcc-libs](https://archlinux.org/packages/core/x86_64/gcc-libs/)
[[32-bit](https://archlinux.org/packages/core/x86_64/lib32-gcc-libs/)]
- [glibc](https://archlinux.org/packages/core/x86_64/glibc/)
[[32-bit](https://archlinux.org/packages/core/x86_64/lib32-glibc/)]
- [libidn2](https://archlinux.org/packages/core/x86_64/libidn2/)
[[32-bit](https://archlinux.org/packages/multilib/x86_64/lib32-libidn2/)]
- [libnghttp2](https://archlinux.org/packages/core/x86_64/libnghttp2/)
[[32-bit](https://archlinux.org/packages/multilib/x86_64/lib32-libnghttp2/)]
- [libssh2](https://archlinux.org/packages/core/x86_64/libssh2/)
[[32-bit](https://archlinux.org/packages/multilib/x86_64/lib32-libssh2/)]
- [openssl](https://archlinux.org/packages/core/x86_64/openssl/)
[[32-bit](https://archlinux.org/packages/multilib/x86_64/lib32-openssl/)]
- [zlib](https://archlinux.org/packages/core/x86_64/zlib/)
[[32-bit](https://archlinux.org/packages/multilib/x86_64/lib32-zlib/)]
- [zstd](https://archlinux.org/packages/core/x86_64/zstd/)
[[32-bit](https://archlinux.org/packages/multilib/x86_64/lib32-zstd/)]
Optional libraries:
- [gtk3](https://archlinux.org/packages/extra/x86_64/gtk3/)
[[32-bit](https://archlinux.org/packages/multilib/x86_64/lib32-gtk3/)]
---
Just like on Windows, SmokeAPI features 32 and 64-bit Linux builds.
In release archive they are named as `libsmoke_api32.so` or `libsmoke_api64.so` respectively.
However, unlike Windows, it is recommended to use proxy mode, rather than hook mode.
This is because the current hook mode installation method has to directly launch game
executable. However, by default Steam doesn't do that, instead it launches certain wrappers
that setup game environment with optimal parameters. Hence, launching a game without those
wrappers might cause issues in theory. However, in practice real tests show that hook mode has higher
chance of success compared to proxy mode. So, at the end of the day, try both modes to see which one works
best for you.
### 🔀 Proxy mode (🐧 Linux)
Same as on Windows:
1. Rename the original `libsteam_api.so` to `libsteam_api_o.so`
2. Extract and paste the `libsmoke_api32.so` or `libsmoke_api64.so` to the same directory, renaming it to `libsteam_api.so`.
### 🪝 Hook mode (🐧 Linux)
Linux doesn't have the same easily exploitable library injection mechanism that Windows has.
However, it is possible to force any Linux executable to load any library by using the
`LD_PRELOAD` environment variable. In fact, Steam itself already uses that to inject its overlay,
hence we can use it as well. But we have to include that overlay library as well when specifying
`LD_PRELOAD`, otherwise the game will be launched with SmokeAPI, but without Steam overlay.
For example:
1. Extract and paste the `libsmoke_api32.so` or `libsmoke_api64.so` in the root of game's installation directory.
2. In Steam _Library_ open game's _Properties_, switch to the _General_ tab, and set the following _LAUNCH OPTIONS_:
| Bitness | Launch Options |
|---------|------------------------------------------------------------------------------------------------------------------------|
| 32-bit | `LD_PRELOAD="./libsmoke_api32.so $HOME/.local/share/Steam/ubuntu12_32/gameoverlayrenderer.so" ./<GameExe32> %command%` |
| 64-bit | `LD_PRELOAD="./libsmoke_api64.so $HOME/.local/share/Steam/ubuntu12_64/gameoverlayrenderer.so" ./<GameExe64> %command%` |
Where `<GameExe32>` and `<GameExe64>` correspond to the actual filename of the game executable. For example:
- `TheEscapists2.x86` (32-bit)
- `TheEscapists2.x86_64` (64-bit)
- `_linux/darkest.bin.x86` (32-bit)
- `_linux/darkest.bin.x86_64` (64-bit)
- `bin/linux_x64/eurotrucks2` (64-bit)
- `binaries/victoria3` (64-bit)
And so on. Notice that Linux executables do not have `.exe` extension like on Windows, so make sure to copy the entire
file name as it is. Naturally, the exact options might change depending on where files are located on your filesystem
and other environment variables you might have specified previously.
If you have other environment variables, and you don't know how to correctly combine them,
then please make extensive use of search engines and LLMs for guidance and examples
before seeking help the official forum topic.
## ⚙ Configuration
SmokeAPI does not require any manual configuration.
By default, it uses the most reasonable options and tries to unlock all DLCs that it can.
However, there might be circumstances in which you need more custom-tailored behaviour, such as disabling certain DLCs, or selectively enabling just a few of them.
In this case you can use a configuration file [SmokeAPI.config.json](res/SmokeAPI.config.json) that you can find here in this repository or in the release zip.
To use it, simply place it next to the SmokeAPI DLL.
It will be read upon each launch of a game.
The config file is expected to conform to the JSON standard. It is recommended to use a text editor with JSON schema supports. This greatly assists with editing since it warns not just about syntax errors, but also about invalid values. One such editor is [Visual Studio Code](https://code.visualstudio.com/).
<details><summary>VS Code demo</summary>
This example showcases how VS code highlights an invalid value and displays a list of valid values that are accepted.
![VS Code demo](https://i.ibb.co/0y45qgtQ/schema-config-demo.jpg)
</details>
Below you can find the detailed description of each available config option. In the absence of the config file, default values specified below will be used.
| Option | Description | Type | Default | Valid values |
|--------|-------------|------|---------|--------------|
| `logging` | Enables logging to SmokeAPI.log.log file. | Boolean | `false` | `true` or `false`. |
| `log_steam_http` | Toggles logging of SteamHTTP traffic | Boolean | `false` | `true` or `false`. |
| `default_app_status` | Specifies default DLC status. | String | `"unlocked"` | `"unlocked"` or `"locked"` or `"original"`. |
| `override_app_status` | Overrides the status of all DLCs that belong to a specified app ID. | Object | `{}` | An object with `"key": "value"` pairs, where key is App ID and value is App status. |
| `override_dlc_status` | Overrides the status of individual DLCs, regardless of the corresponding app status. | Object | `{}` | An object with `"key": "value"` pairs, where key is DLC ID and value is DLC status. |
| `auto_inject_inventory` | Specifies whether SmokeAPI should automatically inject a list of all registered inventory items, when a game queries user inventory | Boolean | `true` | `true` or `false`. |
| `extra_inventory_items` | A list of inventory item IDs that will be added in addition to the automatically injected items. | Array | `[]` | An array of integer App IDs. |
| `extra_dlcs` | See [Extra info](#-how-smokeapi-works-in-games-with-large-number-of-dlcs) to understand the use case for this option. | Object | `{}` | An object with `"key": "value"`, where the key is App ID and value is an object with `"dlcs"` property. See the complete example for more. |
<details><summary>Advanced options</summary>
[//]: # (Admonitions don't work inside collapsible spoilers on GitHub :/)
**NOTE**: These options do not affect the unlocker, and should be left unmodified. They serve as utilities for text or GUI editors.
| Option | Description | Type | Default | Valid values |
|--------|-------------|------|---------|--------------|
| `$schema` | URL of a JSON Schema that corresponds to this config. | String | [SmokeAPI.schema.json](res/SmokeAPI.schema.json) | URL to a valid SmokeAPI config JSON schema. |
| `$version` | Reserved for use by tools like GUI config editors. | Integer | `4` | Integer numbers from 1 and beyond. |
</details>
---
Below you can find an example config where nearly every option has been customized.
<details><summary>Complete example</summary>
```json
{
"$schema": "https://raw.githubusercontent.com/acidicoala/SmokeAPI/refs/tags/v4.0.0/res/SmokeAPI.schema.json",
"$version": 4,
"logging": true,
"log_steam_http": true,
"default_app_status": "unlocked",
"override_app_status": {
"1234": "original",
"4321": "unlocked"
},
"override_dlc_status": {
"1234": "original",
"4321": "unlocked",
"5678": "locked"
},
"auto_inject_inventory": true,
"extra_inventory_items": [
9876,
8765,
7654
],
"extra_dlcs": {
"1234": {
"dlcs": {
"56789": "Example DLC 1"
}
},
"4321": {
"dlcs": {
"98765": "Example DLC 2",
"98766": "Example DLC 3"
}
}
}
}
```
</details>
## 🎓 Extra info
### 🔑 How SmokeAPI works in games with large number of DLCs
Some the games that have a large number of DLCs begin ownership verification by querying the Steamworks API for a list of all available DLCs.
Once the game receives the list, it will go over each item and check the ownership.
The issue arises from the fact that response from Steamworks SDK may max out at 64, depending on how much unowned DLCs the user has.
To alleviate this issue, SmokeAPI will make a web request to Steam API for a full list of DLCs, which works well most of the time.
Unfortunately, even the web API does not solve all of our problems, because it will return only DLCs that are available in Steam store.
This means that DLCs without a dedicated store offer, such as pre-order DLCs will be left out.
That's where the `extra_dlcs` config option comes into play.
You can specify those missing DLC IDs there, and SmokeAPI will make them available to the game.
However, this introduces the need for manual configuration, which goes against the ideals of this project.
To remedy this issue SmokeAPI will also fetch a manually maintained list of [extra DLCs] stored in a GitHub repository.
The purpose of that JSON file is to contain all the DLC IDs that are lacking a Steam store page.
This enables SmokeAPI to unlock all DLCs without any config file at all.
Feel free to report in the {forum-topic} games that have more than 64 DLCs,
_and_ have DLCs without a dedicated store page.
They will be added to the list of missing DLC IDs to facilitate config-less operation.
[extra DLCs]: https://github.com/acidicoala/public-entitlements/blob/main/steam/v2/dlc.json
### 🔢 Supported Steamworks SDK versions
SmokeAPI aims to support all Steamworks SDK version.
At the time of writing, the latest supported version is **1.63**.
## 🔧 Troubleshooting
### 🔐 DLCs are not unlocked
There are many reasons why the DLCs remain locked. In some games DLC unlocking is inherently impossible because of online-only state, profile, etc. In other cases it may be possible, but only after dealing with custom game checks. To learn about the specifics, consult the corresponding game topic in [the forum].
If you are sure that DLC unlocking in a targeted game is inherently possible, then you have to verify that installation was successful. To do that, add the unlocker's config file next to the unlocker DLL and enable logging in it. You should see a `*.log` file being generated upon the game launch, which could provide insight into what went wrong. Use this log file when requesting support in the forum. If after launching the game no `*.log` file was generated, then it means that installation was not performed correctly.
If you installed the unlocker via proxy mode, then make sure that you have renamed the unlocker DLL exactly like the original DLL and placed it exactly in its place. Also verify that the original DLL was renamed by adding `_o` at the end of the filename. Notice that the second symbol is a literal `o` (short for original), not a numeral zero `0`.
If you installed the unlocker via hook mode, then make sure that you have picked a compatible Koaloader DLL. Not all games will try to load `version.dll`, hence you need will need to try another. You can use [Process Monitor] to find out which Koaloader DLL is supported by a game, and where to place it. Click on the cyan funnel icon on the top to open filter editor, and add 3 filters (Process name, Result, and Path), as shown in the screenshot below. Launch the game with the Process Monitor active, and you should see DLLs that a game was trying to load from its directory.
<details><summary>Process Monitor screenshot</summary>
![Process Monitor](https://i.ibb.co/VmdVWLN/image.png)
</details>
[the forum]: https://cs.rin.ru/forum/viewforum.php?f=10
[Process Monitor]: https://docs.microsoft.com/en-us/sysinternals/downloads/procmon
If you have made sure that you picked the right DLL for Koaloader, then try adding Koaloader's config file and enable logging in it. The log file from Koaloader can show if it was able to successfully load the unlocker DLL.
### 💥 The game is crashing
If the game is crashing or not opening as expected after installing an unlocker, then try to download and install the [Latest supported Visual C++ Redistributable version](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#latest-supported-redistributable-version)
<details><summary>Download page screenshot</summary>
![Download page](https://i.ibb.co/PZBXqHpB/vc-redist.jpg)
</details>
## 🏗️ Building from source
### ✔️ Requirements
- [CMake] v3.24 or newer (Make sure that cmake is available from powershell)
- [Visual Studio Build Tools 2022] with `Desktop Development for C++` workload installed
- Tested on Windows 11 SDK (10.0.26100.4188)
### 👨‍💻 Commands
Build the project
```powershell
.\build.ps1 $arch $config
```
where
| Variable | Valid values |
|----------|----------------------|
| $arch | `32` or `64` |
| $config | `Debug` or `Release` |
For example:
```powershell
.\build.ps1 64 Release
```
[Visual Studio Build Tools 2022]: https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022
[CMake]: https://cmake.org/
### 🆕 Adding support for new Steamworks SDK
- Run `steamworks_downloader [prompt]` providing directory which contains Steamworks SDK zip files.
- Run `steamworks_parser`
- Run `linux_exports_generator [32]`
- Run `linux_exports_generator [64]`
## 📚 Acknowledgments
This project makes use of the following open source projects:
- [richgel999/miniz](https://github.com/richgel999/miniz)
- [libcpr/cpr](https://github.com/libcpr/cpr)
- [nlohmann/json](https://github.com/nlohmann/json)
- [stevemk14ebr/PolyHook_2_0](https://github.com/stevemk14ebr/PolyHook_2_0)
- [gabime/spdlog](https://github.com/gabime/spdlog)
- [nsumner/cpp-tree-sitter](https://github.com/nsumner/cpp-tree-sitter)
- [tree-sitter/tree-sitter-cpp](https://github.com/tree-sitter/tree-sitter-cpp)
- [nemtrif/utfcpp](https://github.com/nemtrif/utfcpp)
- [microsoft/wil](https://github.com/microsoft/wil)
- [p-ranav/glob](https://github.com/p-ranav/glob)
- [pantor/inja](https://github.com/pantor/inja)
- [jarro2783/cxxopts](https://github.com/jarro2783/cxxopts)
- [serge1/ELFIO](https://github.com/serge1/ELFIO)
- [bshoshany/thread-pool](https://github.com/bshoshany/thread-pool)
- [batterycenter/embed](https://github.com/batterycenter/embed)
## 📄 License
This software is licensed under the [Unlicense](https://unlicense.org),
terms of which are available in [UNLICENSE.txt](UNLICENSE.txt).
[Koaloader]: https://github.com/acidicoala/Koaloader

67
README.template.md Normal file
View File

@@ -0,0 +1,67 @@
{% extends "./KoalaBox/templates/README.base.md" %}
{% block content %}
_Legit DLC ownership emulation for Steamworks._
## ✨ Features
* `🔓` Emulate DLC ownership in legitimately owned games
* `🛅` Emulate Inventory item ownership
* `📄` Optional configuration
* `🐧` Support for 32-bit and 64-bit Windows and Linux systems
{% include "KoalaBox/templates/markdown/links.md" %}
{% include "KoalaBox/templates/markdown/intro.md" %}
{% include "KoalaBox/templates/markdown/usage.md" %}
{% include "KoalaBox/templates/markdown/install-win.md" %}
{% include "KoalaBox/templates/markdown/install-linux.md" %}
{% include "KoalaBox/templates/markdown/configuration.md" %}
## 🎓 Extra info
### 🔑 How SmokeAPI works in games with large number of DLCs
Some the games that have a large number of DLCs begin ownership verification by querying the Steamworks API for a list of all available DLCs.
Once the game receives the list, it will go over each item and check the ownership.
The issue arises from the fact that response from Steamworks SDK may max out at 64, depending on how much unowned DLCs the user has.
To alleviate this issue, SmokeAPI will make a web request to Steam API for a full list of DLCs, which works well most of the time.
Unfortunately, even the web API does not solve all of our problems, because it will return only DLCs that are available in Steam store.
This means that DLCs without a dedicated store offer, such as pre-order DLCs will be left out.
That's where the `extra_dlcs` config option comes into play.
You can specify those missing DLC IDs there, and SmokeAPI will make them available to the game.
However, this introduces the need for manual configuration, which goes against the ideals of this project.
To remedy this issue SmokeAPI will also fetch a manually maintained list of [extra DLCs] stored in a GitHub repository.
The purpose of that JSON file is to contain all the DLC IDs that are lacking a Steam store page.
This enables SmokeAPI to unlock all DLCs without any config file at all.
Feel free to report in the {forum-topic} games that have more than 64 DLCs,
_and_ have DLCs without a dedicated store page.
They will be added to the list of missing DLC IDs to facilitate config-less operation.
[extra DLCs]: https://github.com/acidicoala/public-entitlements/blob/main/steam/v2/dlc.json
### 🔢 Supported Steamworks SDK versions
{{ project_name }} aims to support all Steamworks SDK version.
At the time of writing, the latest supported version is **1.63**.
{% include "KoalaBox/templates/markdown/troubleshooting.md" %}
{% include "KoalaBox/templates/markdown/building.md" %}
### 🆕 Adding support for new Steamworks SDK
- Run `steamworks_downloader [prompt]` providing directory which contains Steamworks SDK zip files.
- Run `steamworks_parser`
- Run `linux_exports_generator [32]`
- Run `linux_exports_generator [64]`
{% include "KoalaBox/templates/markdown/acknowledgements.md" %}{% block extra_oss_libs %}- [bshoshany/thread-pool](https://github.com/bshoshany/thread-pool)
- [batterycenter/embed](https://github.com/batterycenter/embed)
{% endblock %}

View File

@@ -21,4 +21,4 @@ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <https://unlicense.org>
For more information, please refer to <https://unlicense.org>

View File

@@ -1,3 +1,12 @@
Project page: https://github.com/acidicoala/SmokeAPI?tab=readme-ov-file#smokeapi
Project page: https://github.com/acidicoala/SmokeAPI#readme
Forum topic: https://cs.rin.ru/forum/viewtopic.php?p=2597932#p2597932
DLC Database: https://steamdb.info/
DLC Database: https://steamdb.info/
*** NOTE ***
Do NOT use the SmokeAPI.config.json file unless you have a good reason.
The default config file enables logging, which might have a negative impact on performance in games.
So, unless you really need to see logs for debugging issues, it is advised to either:
disable logging in the config file by setting the "logging" field to false
or
not use the SmokeAPI.config.json file at all.

View File

@@ -1,8 +1,8 @@
{
"$schema": "https://raw.githubusercontent.com/acidicoala/SmokeAPI/refs/tags/v3.1.0/res/SmokeAPI.schema.json",
"$schema": "https://raw.githubusercontent.com/acidicoala/SmokeAPI/refs/tags/v4.0.0/res/SmokeAPI.schema.json",
"$version": 4,
"logging": true,
"log_steam_http": true,
"log_steam_http": false,
"default_app_status": "unlocked",
"override_app_status": {},
"override_dlc_status": {},

View File

@@ -1,71 +1,71 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.com/smokeapi-config.schema.json",
"$id": "https://raw.githubusercontent.com/acidicoala/SmokeAPI/refs/tags/v4.0.0/res/SmokeAPI.schema.json",
"title": "SmokeAPI configuration",
"type": "object",
"additionalProperties": false,
"properties": {
"$schema": {
"type": "string",
"description": "The URI of the JSON Schema used to validate this config."
"description": "URL of a JSON Schema that corresponds to this config.",
"x-default": "[SmokeAPI.schema.json](res/SmokeAPI.schema.json)",
"x-valid-values": "URL to a valid SmokeAPI config JSON schema."
},
"$version": {
"type": "integer",
"description": "Reserved for use by tools like GUI config editors.",
"const": 4,
"description": "A technical field reserved for tools like GUI config editors. Do not modify this value."
"x-valid-values": "Integer numbers from 1 and beyond."
},
"logging": {
"type": "boolean",
"default": false,
"description": "Toggles generation of a SmokeAPI.log.log file."
"x-packaged-default": true,
"description": "Enables logging to SmokeAPI.log.log file.",
"x-valid-values": "`true` or `false`."
},
"log_steam_http": {
"type": "boolean",
"default": false,
"description": "Toggles logging of SteamHTTP traffic"
"description": "Toggles logging of SteamHTTP traffic",
"x-valid-values": "`true` or `false`."
},
"default_app_status": {
"description": "Sets the default DLC unlocking behaviour.",
"type": "string",
"description": "Specifies default DLC status.",
"default": "unlocked",
"$ref": "#/$defs/AppStatus"
"$ref": "#/$defs/AppStatus",
"x-valid-values": "`\"unlocked\"` or `\"locked\"` or `\"original\"`."
},
"override_app_status": {
"type": "object",
"default": {},
"description": "Overrides the status of all DLCs that belong to a specified app ID. Keys are app IDs (as strings).",
"description": "Overrides the status of all DLCs that belong to a specified app ID.",
"patternProperties": {
"^\\d{1,10}$": {
"$ref": "#/$defs/AppStatus"
}
},
"additionalProperties": false
"additionalProperties": false,
"x-valid-values": "An object with `\"key\": \"value\"` pairs, where key is App ID and value is App status."
},
"override_dlc_status": {
"type": "object",
"default": {},
"description": "Overrides the status of individual DLCs, regardless of the corresponding app status. Keys are DLC IDs (as strings).",
"description": "Overrides the status of individual DLCs, regardless of the corresponding app status.",
"patternProperties": {
"^\\d{1,10}$": {
"$ref": "#/$defs/AppStatus"
}
},
"additionalProperties": false
},
"extra_dlcs": {
"type": "object",
"default": {},
"description": "Map of app IDs to objects containing DLC IDs with their display names.",
"patternProperties": {
"^\\d{1,10}$": {
"$ref": "#/$defs/App"
}
},
"additionalProperties": false
"additionalProperties": false,
"x-valid-values": "An object with `\"key\": \"value\"` pairs, where key is DLC ID and value is DLC status."
},
"auto_inject_inventory": {
"type": "boolean",
"default": true,
"description": "Whether SmokeAPI should automatically inject a list of all registered inventory items when a game queries user inventory."
"description": "Specifies whether SmokeAPI should automatically inject a list of all registered inventory items, when a game queries user inventory",
"x-valid-values": "`true` or `false`."
},
"extra_inventory_items": {
"type": "array",
@@ -74,25 +74,30 @@
"items": {
"type": "integer",
"minimum": 0
}
},
"x-valid-values": "An array of integer App IDs."
},
"extra_dlcs": {
"type": "object",
"default": {},
"description": "See [Extra info](#-how-smokeapi-works-in-games-with-large-number-of-dlcs) to understand the use case for this option.",
"patternProperties": {
"^\\d{1,10}$": {
"$ref": "#/$defs/App"
}
},
"additionalProperties": false,
"x-valid-values": "An object with `\"key\": \"value\"`, where the key is App ID and value is an object with `\"dlcs\"` property. See the complete example for more."
}
},
"$defs": {
"AppStatus": {
"description": "Unlock status for apps or DLCs.",
"anyOf": [
{
"type": "string",
"enum": [
"original",
"unlocked",
"locked"
]
},
{
"type": "null",
"description": "Represents UNDEFINED in the enum."
}
"type": "string",
"enum": [
"original",
"unlocked",
"locked"
]
},
"App": {
@@ -115,7 +120,7 @@
},
"examples": [
{
"$schema": "https://raw.githubusercontent.com/acidicoala/SmokeAPI/refs/tags/v3.0.0/res/SmokeAPI.schema.json",
"$schema": "https://raw.githubusercontent.com/acidicoala/SmokeAPI/refs/tags/v4.0.0/res/SmokeAPI.schema.json",
"$version": 4,
"logging": true,
"log_steam_http": true,
@@ -130,7 +135,11 @@
"5678": "locked"
},
"auto_inject_inventory": true,
"extra_inventory_items": [],
"extra_inventory_items": [
9876,
8765,
7654
],
"extra_dlcs": {
"1234": {
"dlcs": {

View File

@@ -1,4 +1,4 @@
#pragma once
#define STEAMAPI_DLL "${STEAMAPI_DLL}"
#define STEAMCLIENT_DLL "${STEAMCLIENT_DLL}"
#define STEAM_API_MODULE "${STEAM_API_MODULE}"
#define STEAMCLIENT_DLL "${STEAMCLIENT_DLL}"

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,4 @@
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//
// Purpose: Main interface for loading and accessing Steamworks API's from the
// Steam client.

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,4 @@
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//
// Purpose: Main interface for loading and accessing Steamworks API's from the
// Steam client.

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,4 @@
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//
// Purpose: Main interface for loading and accessing Steamworks API's from the
// Steam client.

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,4 @@
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//
// Purpose: Main interface for loading and accessing Steamworks API's from the
// Steam client.

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,4 @@
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//
// Purpose: Main interface for loading and accessing Steamworks API's from the
// Steam client.

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,4 @@
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//
// Purpose: Main interface for loading and accessing Steamworks API's from the
// Steam client.

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,4 @@
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//
// Purpose: Main interface for loading and accessing Steamworks API's from the
// Steam client.

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,4 @@
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//
// Purpose: Main interface for loading and accessing Steamworks API's from the
// Steam client.

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,4 @@
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//====== Copyright <20> 1996-2008, Valve Corporation, All rights reserved. =======
//
// Purpose: Main interface for loading and accessing Steamworks API's from the
// Steam client.

Some files were not shown because too many files have changed in this diff Show More