Files
2026-08-21 18:52:07 +01:00

2.4 KiB

Steam development setup

Steam support is optional. The default Godot build and every Phase 6 Docker check use ENet; they do not need a Steam client, SDK, or App ID. Selecting transport="steam" never falls back to ENet: a missing custom build or failed Steam initialization returns an error with the missing prerequisite.

Pinned inputs

The exact expected build inputs live in steam-dependencies.lock.json. They are not committed to this repository because the Steamworks SDK is governed by Valve's partner access and the engine binaries are platform-specific. Use the matching GodotSteam client build, server build, and SteamMultiplayerPeer extension from that lock file; do not mix release families.

Place the resulting custom executables/templates outside this checkout and set:

export COSMIC_CLASH_STEAM_CLIENT_GODOT=/absolute/path/to/godotsteam
export COSMIC_CLASH_STEAM_SERVER_GODOT=/absolute/path/to/godotsteam-server
make verify-steam-templates

The command imports the project with each custom build, checks the steam feature plus the Steam/SteamServer singleton and SteamMultiplayerPeer, then exports Linux Steam Client and Linux Steam Dedicated Server. It refuses to use a normal Godot binary, so a green result proves the expected native pieces are in the supplied builds. It writes only ignored steam/build/ artifacts.

App IDs and scope

The local-development default is Valve's Spacewar App ID 480. To use a different development App ID, set COSMIC_CLASH_STEAM_APP_ID to a positive integer and place steam_appid.txt beside the executable (never commit that file). Spacewar is only for local bootstrap/transport tests: it must not be used to advertise servers, validate ownership/VAC, or ship.

A project-owned Steamworks App ID and its server credentials are required before Phase 7 server browser, BeginAuthSession, identity-backed slot reclaim, bans, or public hosting. Until then, Phase 6's external test is controlled-only because display-name slot reclaim is insecure.

Transport contract

NetworkManager.host() and NetworkManager.join() default to "enet". Passing "steam" explicitly creates a SteamMultiplayerPeer over SDR; for this foundation the join address is the server's numeric Steam ID and the virtual port is zero. Discovery and server advertisement intentionally remain unimplemented until the project-owned App ID exists.