diff --git a/Distribution.md b/Distribution.md index 2430da5..457d9f3 100644 --- a/Distribution.md +++ b/Distribution.md @@ -40,6 +40,28 @@ dotnet publish ytLive.csproj -c Release -r win-x64 --self-contained true \ ## 2. Steamworks setup, once +**The SDK zip is the only download.** It is ~24 MB and contains the runtime +(`sdk/redistributable_bin/win64/steam_api64.dll`) *and* the release tooling +(`sdk/tools/ContentBuilder/` → `steamcmd.exe` for Windows, `steamcmd.sh` for Linux/macOS, plus the +`app_build_*.vdf` / `depot_build_*.vdf` templates). There is no separate "ContentBuilder download" +on the partner dashboard — the dashboard's Downloads page only re-offers the SDK. + +**Reference links, so nobody hunts again:** + +| What | Where | +|---|---| +| SDK zip (sign in to partner first) | `partner.steamgames.com/downloads/steamworks_sdk.zip` | +| Docs home | `partner.steamgames.com/doc/home` | +| SteamPipe upload (steamcmd + VDF fields) | `partner.steamgames.com/doc/sdk/uploading` | +| DLC configuration | `partner.steamgames.com/doc/store/application/dlc` | +| `BIsDlcInstalled` | `partner.steamgames.com/doc/api/ISteamApps` | +| Store artwork sizes | `partner.steamgames.com/doc/store/assets/standard` | +| Coming Soon / 2-week public window | `partner.steamgames.com/doc/store/coming_soon` | +| Wallet rule (in-app purchases) | `partner.steamgames.com/doc/features/microtransactions` | +| Recurring subscriptions | `partner.steamgames.com/doc/store/pricing/subscriptions` | +| Partner support | `help.steampowered.com/en/wizard/HelpWithPublishing` | +| Steamworks.NET (managed wrapper) | `nuget.org/packages/Steamworks.NET` | + 1. **Steamworks account** → onboarding (NDA, identity, company details, tax interview, payout bank, then the **$100 Steam Direct fee** per app). The store page cannot be configured before the fee. 2. **App IDs.** One **base app** (free) and one **DLC app** (the lifetime Pro). Note both numbers: @@ -49,9 +71,10 @@ dotnet publish ytLive.csproj -c Release -r win-x64 --self-contained true \ 4. **Steamworks SDK.** `./scripts/steam-sdk.sh ~/Downloads/steamworks_sdk_165.zip` extracts `steam_api64.dll` from `sdk/redistributable_bin/win64/` into `steam/` (gitignored) and stages `steam_appid.txt` = 480 — Valve's Spacewar app, so `SteamAPI.Init()` works locally before - LlamaCasty has an App ID. The csproj copies the DLL **beside the exe** (`Link`) with - `ExcludeFromSingleFile`, and copies `steam_appid.txt` in Debug only — never into a depot. The - managed side is the `Steamworks.NET` package (`SteamApps.BIsDlcInstalled`). + LlamaCasty has an App ID. Add `--contentbuilder` on the machine that uploads a depot. The csproj + copies the DLL **beside the exe** (`Link`) with `ExcludeFromSingleFile`, and copies + `steam_appid.txt` in Debug only — never into a depot. The managed side is the `Steamworks.NET` + package (`SteamApps.BIsDlcInstalled`). 5. **Store page** configured and made public **two weeks before release** — Valve's rule, and it is the window where wishlists accumulate. diff --git a/scripts/steam-sdk.sh b/scripts/steam-sdk.sh index 3a109a0..dd5cdc2 100644 --- a/scripts/steam-sdk.sh +++ b/scripts/steam-sdk.sh @@ -7,6 +7,11 @@ # is only needed on the machine that uploads a depot. # # ./scripts/steam-sdk.sh ~/Downloads/steamworks_sdk_165.zip +# ./scripts/steam-sdk.sh ~/Downloads/steamworks_sdk_165.zip --contentbuilder +# +# --contentbuilder also extracts sdk/tools/ContentBuilder into steam/contentbuilder/ — that is +# the release tooling (steamcmd + the app_build/depot vdf templates). It is a separate opt-in +# because it is only needed on the machine that uploads a depot, and it is ~12 MB of binaries. # # steam_api64.dll is Valve's redistributable — shipping it beside a Steam-published exe is # permitted by the Steamworks terms. It is NOT committed: steam/ is gitignored, like ffmpeg/. @@ -14,6 +19,7 @@ set -euo pipefail ZIP="${1:-$HOME/Downloads/steamworks_sdk_165.zip}" +WANT_CONTENTBUILDER="${2:-}" ROOT="$(cd "$(dirname "$0")/.." && pwd)" [ -f "$ZIP" ] || { echo "❌ SDK zip not found: $ZIP" >&2; echo " Download it from partner.steamgames.com/downloads/steamworks_sdk.zip while signed in." >&2; exit 1; } @@ -41,5 +47,29 @@ PY printf '480\n' > "$ROOT/steam/steam_appid.txt" echo "✓ steam/steam_appid.txt = 480 (Spacewar, local Debug testing only)" +if [ "$WANT_CONTENTBUILDER" = "--contentbuilder" ]; then + python3 - "$ZIP" "$ROOT" <<'PY' +import sys, zipfile, pathlib + +zip_path, root = sys.argv[1], pathlib.Path(sys.argv[2]) +prefix = "sdk/tools/ContentBuilder/" +dest = root / "steam" / "contentbuilder" + +count = 0 +with zipfile.ZipFile(zip_path) as z: + for name in z.namelist(): + if not name.startswith(prefix) or name.endswith("/"): + continue + target = dest / name[len(prefix):] + target.parent.mkdir(parents=True, exist_ok=True) + with z.open(name) as src, open(target, "wb") as out: + out.write(src.read()) + count += 1 + +print(f"✓ steam/contentbuilder/ ({count} files)") +print(" Windows upload: steam/contentbuilder/builder/steamcmd.exe +login +run_app_build ") +PY +fi + echo "" echo "Next: the entitlement seam (IEntitlement + SteamApps.BIsDlcInstalled)."