| function IsDlcOwned(dlc) | |
| return Platform.developer or IsSteamAvailable() and SteamIsDlcAvailable(dlc.steam_dlc_id) | |
| end | |
| function GetPCSaveFolder() | |
| local path = "saves:/" | |
| if IsSteamAvailable() then | |
| path = string.format("saves:/%s/", tostring(SteamGetUserId64())) | |
| end | |
| local ok, err = io.createpath(path) | |
| if not ok then | |
| print("Failed to create save path", err) | |
| end | |
| return path | |
| end | |
| function GetSteamLobbyVisibility(visible) | |
| visible = visible or netGameInfo.visible_to | |
| if not visible or visible == "friends" or visible == "public" then | |
| return "friendsonly" | |
| else | |
| return "invisible" | |
| end | |
| end | |
| function OnMsg.NetGameJoined() | |
| CreateRealTimeThread( function() | |
| if netGameInfo.steam_lobby then | |
| local err = AsyncSteamJoinLobby( tonumber(netGameInfo.steam_lobby) ) | |
| if err then | |
| DebugPrint("AsyncSteamJoinLobby failed: " .. err) | |
| end | |
| else | |
| local err, lobby = AsyncSteamCreateLobby( GetSteamLobbyVisibility(), netGameInfo.max_players or 4 ) | |
| if err then | |
| DebugPrint("AsyncSteamCreateLobby failed: " .. err) | |
| return | |
| end | |
| SteamSetLobbyData(tonumber(lobby), "game_address", tostring(netGameAddress)) | |
| NetChangeGameInfo( { steam_lobby = tonumber(lobby) } ) | |
| end | |
| end) | |
| end | |
| function OnMsg.NetGameLeft() | |
| if netGameInfo.steam_lobby then | |
| SteamLeaveLobby( tonumber(netGameInfo.steam_lobby) ) | |
| end | |
| end | |
| function OnMsg.NetGameInfo(info) | |
| if info.visible_to ~= nil then | |
| CreateRealTimeThread(function() | |
| if netInGame and netGameInfo.steam_lobby then | |
| SteamSetLobbyType(netGameInfo.steam_lobby, GetSteamLobbyVisibility(info.visible_to)) | |
| end | |
| end) | |
| end | |
| end | |
| function OnSteamEnterLobby(lobby) | |
| end | |
| function ProcessSteamInvite(lobby) | |
| CreateRealTimeThread( function() | |
| local lobbyNumber = tonumber(lobby) | |
| local err = AsyncSteamJoinLobby( lobbyNumber ) | |
| if err then | |
| DebugPrint("AsyncSteamJoinLobby failed: " .. err) | |
| return | |
| end | |
| local game_address = tonumber(SteamGetLobbyData(lobbyNumber, "game_address")) | |
| if game_address == 0 then | |
| DebugPrint("invalid game address for lobby") | |
| return | |
| end | |
| local err = NetSteamGameInviteAccepted(game_address, lobbyNumber) | |
| if err then | |
| DebugPrint(err) | |
| return | |
| end | |
| end ) | |
| end | |
| OnSteamGameLobbyJoinRequest = ProcessSteamInvite | |
| function OnMsg.StartAcceptingInvites() | |
| local lobby = GetAppCmdLine():match("%+connect_lobby%s+(%d+)") | |
| if lobby then | |
| ProcessSteamInvite(lobby) | |
| end | |
| end | |
| function NetSteamGameInviteAccepted(game_address, lobby) | |
| print("Steam Invitation accepted for ", game_address, lobby) | |
| return "Need to override NetSteamGameInviteAccepted for current game" | |
| end | |
| function OnMsg.BugReportStart(print_func) | |
| local steam_beta, steam_branch = SteamGetCurrentBetaName() | |
| if (steam_branch or "") ~= "" then | |
| print_func("Steam Branch:", steam_branch) | |
| end | |
| end | |
| if Platform.steam and IsSteamAvailable() then | |
| _InternalFilterUserTexts = function(unfilteredTs) | |
| local filteredTs = {} | |
| local errors = {} | |
| for _, T in ipairs(unfilteredTs) do | |
| local res = SteamFilterText(T._user_text_type or "", T._steam_id or "0", TDevModeGetEnglishText(T, "deep", "no_assert") or "") | |
| if res == nil then | |
| table.insert(errors, { error = "Unknown Steam Error", user_text = T}) | |
| end | |
| filteredTs[T] = res | |
| end | |
| if next(errors) == nil then errors =false end | |
| return errors, filteredTs | |
| end | |
| end |