--- /dev/null
+#pragma once
+#include "vg_platform.h"
+
+#if defined(__linux__) || defined(__APPLE__)
+/*
+ * The 32-bit version of gcc has the alignment requirement for u64 and double
+ * set to 4 meaning that even with #pragma pack(8) these types will only be
+ * four-byte aligned. The 64-bit version of gcc has the alignment requirement
+ * for these types set to 8 meaning that unless we use #pragma pack(4) our
+ * structures will get bigger. The 64-bit structure packing has to match the
+ * 32-bit structure packing for each platform.
+ */
+ #define VALVE_CALLBACK_PACK_SMALL
+;
+ #pragma pack( push, 4 )
+#else
+ #define VALVE_CALLBACK_PACK_LARGE
+ #pragma pack( push, 8 )
+#endif
+
+typedef i32 HSteamPipe;
+typedef i32 HSteamUser;
+
+typedef int E_iCallBack_t;
+
+typedef u64 u64_steamid;
+typedef u64 SteamAPICall_t;
+
+typedef u32 AppId_t;
+enum { k_uAppIdInvalid = 0x0 };
+
+typedef u32 DepotId_t;
+enum { k_uDepotIdInvalid = 0x0 };
+
+typedef u32 RTime32;
+typedef u32 AccountID_t;
+typedef i8 steamapi_bool;
+
+enum { k_iSteamUserCallbacks = 100 };
+enum { k_iSteamGameServerCallbacks = 200 };
+enum { k_iSteamFriendsCallbacks = 300 };
+enum { k_iSteamBillingCallbacks = 400 };
+enum { k_iSteamMatchmakingCallbacks = 500 };
+enum { k_iSteamContentServerCallbacks = 600 };
+enum { k_iSteamUtilsCallbacks = 700 };
+enum { k_iClientFriendsCallbacks = 800 };
+enum { k_iClientUserCallbacks = 900 };
+enum { k_iSteamAppsCallbacks = 1000 };
+enum { k_iSteamUserStatsCallbacks = 1100 };
+enum { k_iSteamNetworkingCallbacks = 1200 };
+enum { k_iSteamNetworkingSocketsCallbacks = 1220 };
+enum { k_iSteamNetworkingMessagesCallbacks = 1250 };
+enum { k_iSteamNetworkingUtilsCallbacks = 1280 };
+enum { k_iSteamRemoteStorageCallbacks = 1300 };
+enum { k_iClientDepotBuilderCallbacks = 1400 };
+enum { k_iSteamGameServerItemsCallbacks = 1500 };
+enum { k_iClientUtilsCallbacks = 1600 };
+enum { k_iSteamGameCoordinatorCallbacks = 1700 };
+enum { k_iSteamGameServerStatsCallbacks = 1800 };
+enum { k_iSteam2AsyncCallbacks = 1900 };
+enum { k_iSteamGameStatsCallbacks = 2000 };
+enum { k_iClientHTTPCallbacks = 2100 };
+enum { k_iClientScreenshotsCallbacks = 2200 };
+enum { k_iSteamScreenshotsCallbacks = 2300 };
+enum { k_iClientAudioCallbacks = 2400 };
+enum { k_iClientUnifiedMessagesCallbacks = 2500 };
+enum { k_iSteamStreamLauncherCallbacks = 2600 };
+enum { k_iClientControllerCallbacks = 2700 };
+enum { k_iSteamControllerCallbacks = 2800 };
+enum { k_iClientParentalSettingsCallbacks = 2900 };
+enum { k_iClientDeviceAuthCallbacks = 3000 };
+enum { k_iClientNetworkDeviceManagerCallbacks = 3100 };
+enum { k_iClientMusicCallbacks = 3200 };
+enum { k_iClientRemoteClientManagerCallbacks = 3300 };
+enum { k_iClientUGCCallbacks = 3400 };
+enum { k_iSteamUGCCallbacks = 3400 };
+enum { k_iSteamStreamClientCallbacks = 3500 };
+enum { k_IClientProductBuilderCallbacks = 3600 };
+enum { k_iClientShortcutsCallbacks = 3700 };
+enum { k_iClientRemoteControlManagerCallbacks = 3800 };
+enum { k_iSteamAppListCallbacks = 3900 };
+enum { k_iSteamMusicCallbacks = 4000 };
+enum { k_iSteamMusicRemoteCallbacks = 4100 };
+enum { k_iClientVRCallbacks = 4200 };
+enum { k_iClientGameNotificationCallbacks = 4300 };
+enum { k_iSteamGameNotificationCallbacks = 4400 };
+enum { k_iSteamHTMLSurfaceCallbacks = 4500 };
+enum { k_iClientVideoCallbacks = 4600 };
+enum { k_iClientInventoryCallbacks = 4700 };
+enum { k_iClientBluetoothManagerCallbacks = 4800 };
+enum { k_iClientSharedConnectionCallbacks = 4900 };
+enum { k_ISteamParentalSettingsCallbacks = 5000 };
+enum { k_iClientShaderCallbacks = 5100 };
+enum { k_iSteamGameSearchCallbacks = 5200 };
+enum { k_iSteamPartiesCallbacks = 5300 };
+enum { k_iClientPartiesCallbacks = 5400 };
+enum { k_iSteamSTARCallbacks = 5500 };
+enum { k_iClientSTARCallbacks = 5600 };
+enum { k_iSteamRemotePlayCallbacks = 5700 };
+enum { k_iClientCompatCallbacks = 5800 };
+enum { k_iSteamChatCallbacks = 5900 };
+
+// General result codes
+typedef enum EResult
+{
+ k_EResultNone = 0, // no result
+ k_EResultOK = 1, // success
+ k_EResultFail = 2, // generic failure
+ k_EResultNoConnection = 3, // no/failed network connection
+// k_EResultNoConnectionRetry = 4, // OBSOLETE - removed
+ k_EResultInvalidPassword = 5, // password/ticket is invalid
+ k_EResultLoggedInElsewhere = 6, // same user logged in elsewhere
+ k_EResultInvalidProtocolVer = 7, // protocol version is incorrect
+ k_EResultInvalidParam = 8, // a parameter is incorrect
+ k_EResultFileNotFound = 9, // file was not found
+ k_EResultBusy = 10, // called method busy - action not taken
+ k_EResultInvalidState = 11, // called object was in an invalid state
+ k_EResultInvalidName = 12, // name is invalid
+ k_EResultInvalidEmail = 13, // email is invalid
+ k_EResultDuplicateName = 14, // name is not unique
+ k_EResultAccessDenied = 15, // access is denied
+ k_EResultTimeout = 16, // operation timed out
+ k_EResultBanned = 17, // VAC2 banned
+ k_EResultAccountNotFound = 18, // account not found
+ k_EResultInvalidSteamID = 19, // steamID is invalid
+ k_EResultServiceUnavailable = 20,// The requested service is currently
+ // unavailable
+ k_EResultNotLoggedOn = 21, // The user is not logged on
+ k_EResultPending = 22, // Request is pending (may be in process, or
+ // waiting on third party)
+ k_EResultEncryptionFailure = 23, // Encryption or Decryption failed
+ k_EResultInsufficientPrivilege = 24,// Insufficient privilege
+ k_EResultLimitExceeded = 25, // Too much of a good thing
+ k_EResultRevoked = 26, // Access has been revoked (used for revoked
+ // guest passes)
+ k_EResultExpired = 27, // License/Guest pass the user is trying to
+ // access is expired
+ k_EResultAlreadyRedeemed = 28, // Guest pass has already been redeemed by
+ // account, cannot be acked again
+ k_EResultDuplicateRequest = 29, // The request is a duplicate and the action
+ // has already occurred in the past, ignored
+ // this time
+ k_EResultAlreadyOwned = 30, // All the games in this guest pass
+ // redemption request are already owned by
+ // the user
+ k_EResultIPNotFound = 31, // IP address not found
+ k_EResultPersistFailed = 32, // failed to write change to the data store
+ k_EResultLockingFailed = 33, // failed to acquire access lock for this
+ // operation
+ k_EResultLogonSessionReplaced = 34,
+ k_EResultConnectFailed = 35,
+ k_EResultHandshakeFailed = 36,
+ k_EResultIOFailure = 37,
+ k_EResultRemoteDisconnect = 38,
+ k_EResultShoppingCartNotFound = 39, // failed to find the shopping cart
+ // requested
+ k_EResultBlocked = 40, // a user didn't allow it
+ k_EResultIgnored = 41, // target is ignoring sender
+ k_EResultNoMatch = 42, // nothing matching the request found
+ k_EResultAccountDisabled = 43,
+ k_EResultServiceReadOnly = 44, // this service is not accepting content
+ // changes right now
+ k_EResultAccountNotFeatured = 45, // account doesn't have value, so this
+ // feature isn't available
+ k_EResultAdministratorOK = 46, // allowed to take this action, but only
+ // because requester is admin
+ k_EResultContentVersion = 47, // A Version mismatch in content
+ // transmitted within the Steam protocol.
+ k_EResultTryAnotherCM = 48, // The current CM can't service the user
+ // making a request, user should try
+ // another.
+ k_EResultPasswordRequiredToKickSession = 49, // You are already logged in
+ // elsewhere, this cached credential
+ // login has failed.
+ k_EResultAlreadyLoggedInElsewhere = 50, // You are already logged in
+ // elsewhere, you must wait
+ k_EResultSuspended = 51, // Long running operation (content download)
+ // suspended/paused
+ k_EResultCancelled = 52, // Operation canceled (typically by user:
+ // content download)
+ k_EResultDataCorruption = 53, // Operation canceled because data is ill
+ // formed or unrecoverable
+ k_EResultDiskFull = 54, // Operation canceled - not enough disk space.
+ k_EResultRemoteCallFailed = 55, // an remote call or IPC call failed
+ k_EResultPasswordUnset = 56, // Password could not be verified as it's
+ // unset server side
+ k_EResultExternalAccountUnlinked = 57, // External account (PSN, Facebook...)
+ // is not linked to a Steam account
+ k_EResultPSNTicketInvalid = 58, // PSN ticket was invalid
+ k_EResultExternalAccountAlreadyLinked = 59, // External account (PSN,
+ // Facebook...) is already linked to some other account,
+ // must explicitly request to replace/delete the link first
+ k_EResultRemoteFileConflict = 60, // The sync cannot resume due to a conflict
+ // between the local and remote files
+ k_EResultIllegalPassword = 61, // The requested new password is not legal
+ k_EResultSameAsPreviousValue = 62,// new value is the same as the old one (
+ // secret question and answer )
+ k_EResultAccountLogonDenied = 63, // account login denied due to 2nd factor
+ // authentication failure
+ k_EResultCannotUseOldPassword = 64, // The requested new password is not
+ // legal
+ k_EResultInvalidLoginAuthCode = 65, // account login denied due to auth code
+ // invalid
+ k_EResultAccountLogonDeniedNoMail = 66, // account login denied due to 2nd
+ // factor auth failure - and no mail
+ // has been sent
+ k_EResultHardwareNotCapableOfIPT = 67,
+ k_EResultIPTInitError = 68,
+ k_EResultParentalControlRestricted = 69,// operation failed due to parental
+ // control restrictions for current
+ // user
+ k_EResultFacebookQueryError = 70, // Facebook query returned an error
+ k_EResultExpiredLoginAuthCode = 71, // account login denied due to auth
+ // code expired
+ k_EResultIPLoginRestrictionFailed = 72,
+ k_EResultAccountLockedDown = 73,
+ k_EResultAccountLogonDeniedVerifiedEmailRequired = 74,
+ k_EResultNoMatchingURL = 75,
+ k_EResultBadResponse = 76, // parse failure, missing field, etc.
+ k_EResultRequirePasswordReEntry = 77, // The user cannot complete the action
+ // until they re-enter their password
+ k_EResultValueOutOfRange = 78, // the value entered is outside the
+ // acceptable range
+ k_EResultUnexpectedError = 79, // something happened that we didn't expect
+ // to ever happen
+ k_EResultDisabled = 80, // The requested service has been configured
+ // to be unavailable
+ k_EResultInvalidCEGSubmission = 81, // The set of files submitted to the CEG
+ // server are not valid !
+ k_EResultRestrictedDevice = 82, // The device being used is not allowed
+ // to perform this action
+ k_EResultRegionLocked = 83, // The action could not be complete
+ // because it is region restricted
+ k_EResultRateLimitExceeded = 84, // Temporary rate limit exceeded, try
+ // again later, different from
+ // k_EResultLimitExceeded which may be
+ // permanent
+ k_EResultAccountLoginDeniedNeedTwoFactor = 85, // Need two-factor code to
+ // login
+ k_EResultItemDeleted = 86, // The thing we're trying to access has been
+ // deleted
+ k_EResultAccountLoginDeniedThrottle = 87, // login attempt failed, try to
+ // throttle response to possible
+ // attacker
+ k_EResultTwoFactorCodeMismatch = 88, // two factor code mismatch
+ k_EResultTwoFactorActivationCodeMismatch = 89, // activation code for
+ // two-factor didn't match
+ k_EResultAccountAssociatedToMultiplePartners = 90, // account has been
+ // associated with multiple partners
+ k_EResultNotModified = 91, // data not modified
+ k_EResultNoMobileDevice = 92, // the account does not have a mobile
+ // device associated with it
+ k_EResultTimeNotSynced = 93, // the time presented is out of range or
+ // tolerance
+ k_EResultSmsCodeFailed = 94, // SMS code failure (no match, none pending,
+ // etc.)
+ k_EResultAccountLimitExceeded = 95, // Too many accounts access this resource
+ k_EResultAccountActivityLimitExceeded = 96,// Too many changes to
+ // this account
+ k_EResultPhoneActivityLimitExceeded = 97, // Too many changes to this phone
+ k_EResultRefundToWallet = 98, // Cannot refund to payment method, must use
+ // wallet
+ k_EResultEmailSendFailure = 99, // Cannot send an email
+ k_EResultNotSettled = 100, // Can't perform operation till payment
+ // has settled
+ k_EResultNeedCaptcha = 101,// Needs to provide a valid captcha
+ k_EResultGSLTDenied = 102, // a game server login token owned by this token's
+ // owner has been banned
+ k_EResultGSOwnerDenied = 103, // game server owner is denied for other reason
+ // (account lock, community ban, vac ban, missing phone)
+ k_EResultInvalidItemType = 104,// the type of thing we were requested to act
+ // on is invalid
+ k_EResultIPBanned = 105,// the ip address has been banned from taking this
+ // action
+ k_EResultGSLTExpired = 106,// this token has expired from disuse; can be
+ // reset for use
+ k_EResultInsufficientFunds = 107,// user doesn't have enough wallet funds to
+ // complete the action
+ k_EResultTooManyPending = 108, // There are too many of this thing pending
+ // already
+ k_EResultNoSiteLicensesFound = 109, // No site licenses found
+ k_EResultWGNetworkSendExceeded = 110,// the WG couldn't send a response
+ // because we exceeded max network send size
+ k_EResultAccountNotFriends = 111, // the user is not mutually friends
+ k_EResultLimitedUserAccount = 112,// the user is limited
+ k_EResultCantRemoveItem = 113, // item can't be removed
+ k_EResultAccountDeleted = 114, // account has been deleted
+ k_EResultExistingUserCancelledLicense = 115,
+ // A license for this already exists, but cancelled
+ k_EResultCommunityCooldown = 116, // access is denied because of a
+ // community cooldown (probably from support profile data resets)
+ k_EResultNoLauncherSpecified = 117, // No launcher was specified, but a
+ // launcher was needed to choose correct realm for operation.
+ k_EResultMustAgreeToSSA = 118,// User must agree to china SSA or global SSA
+ // before login
+ k_EResultLauncherMigrated = 119, // The specified launcher type is no longer
+ // supported; the user should be directed elsewhere
+ k_EResultSteamRealmMismatch = 120, // The user's realm does not match the
+ // realm of the requested resource
+ k_EResultInvalidSignature = 121, // signature check did not match
+ k_EResultParseFailure = 122, // Failed to parse input
+ k_EResultNoVerifiedPhone = 123, // account does not have a verified phone
+ // number
+} EResult;
+
+typedef struct {
+
+ HSteamUser m_hSteamUser; // Specific user to whom this callback applies.
+ int m_iCallback;
+ u8 *m_pubParam; // Points to the callback structure
+ int m_cubParam; // Size of the data pointed to by m_pubParam
+
+} CallbackMsg_t;
+
+typedef struct {
+
+ SteamAPICall_t m_hAsyncCall;
+ int m_iCallback;
+ u32 m_cubParam;
+
+} SteamAPICallCompleted_t;
+enum { k_iSteamAPICallCompleted = k_iSteamUtilsCallbacks + 3 };
+
+// Steam universes. Each universe is a self-contained Steam instance.
+typedef enum EUniverse {
+ k_EUniverseInvalid = 0,
+ k_EUniversePublic = 1,
+ k_EUniverseBeta = 2,
+ k_EUniverseInternal = 3,
+ k_EUniverseDev = 4,
+ // k_EUniverseRC = 5, // no such universe anymore
+ k_EUniverseMax
+} EUniverse_t;
+
+#pragma pack( push, 1 )
+struct SteamIDComponent_t
+{
+#ifdef VALVE_BIG_ENDIAN
+ EUniverse_t m_EUniverse : 8
+ unsigned int m_EAccountType : 4;
+ unsigned int m_unAccountInstance : 20;
+ u32 m_unAccountID : 32;
+#else
+ u32 m_unAccountID : 32;
+ unsigned int m_unAccountInstance : 20;
+ unsigned int m_EAccountType : 4;
+ EUniverse_t m_EUniverse : 8;
+#endif
+};
+
+typedef struct
+{
+ // 64 bits total
+ union
+ {
+ struct SteamIDComponent_t m_comp;
+ u64 m_unAll64Bits;
+ };
+}
+CSteamID;
+
+typedef struct GameID_t
+{
+#ifdef VALVE_BIG_ENDIAN
+ unsigned int m_nModID : 32;
+ unsigned int m_nType : 8;
+ unsigned int m_nAppID : 24;
+#else
+ unsigned int m_nAppID : 24;
+ unsigned int m_nType : 8;
+ unsigned int m_nModID : 32;
+#endif
+} CGameID;
+#pragma pack( pop )
+#pragma pack( pop )
+
+/*
+ * Standard login
+ * =============================================================================
+ */
+
+int SteamAPI_RestartAppIfNecessary( u32 unOwnAppID );
+int SteamAPI_Init(void);
+void SteamAPI_Shutdown(void);
+
+/*
+ * Server mode login
+ * =============================================================================
+ */
+
+typedef enum EServerMode EServerMode;
+enum EServerMode
+{
+ eServerModeInvalid = 0,
+ eServerModeNoAuthentication = 1,
+ eServerModeAuthentication = 2,
+ eServerModeAuthenticationAndSecure = 3,
+};
+
+int SteamInternal_GameServer_Init( u32 unIP, u16 usLegacySteamPort,
+ u16 usGamePort, u16 usQueryPort,
+ EServerMode eServerMode,
+ const char *pchVersionString );
+
+/* Initialize SteamGameServer client and interface objects, and set server
+ * properties which may not be changed.
+ * After calling this function, you should set any additional server parameters,
+ * and then call ISteamGameServer::LogOnAnonymous() or ISteamGameServer::LogOn()
+ *
+ * - unIP will usually be zero. If you are on a machine with multiple IP
+ * addresses, you can pass a non-zero value here and the relevant sockets will
+ * be bound to that IP. This can be used to ensure that the IP you desire is
+ * the one used in the server browser.
+ * - usGamePort is the port that clients will connect to for gameplay. You will
+ * usually open up your own socket bound to this port.
+ * - usQueryPort is the port that will manage server browser related duties and
+ * info pings from clients. If you pass STEAMGAMESERVER_QUERY_PORT_SHARED for
+ * usQueryPort, then it will use "GameSocketShare" mode, which means that the
+ * game is responsible for sending and receiving UDP packets for the master
+ * server updater. (See ISteamGameServer::HandleIncomingPacket and
+ * ISteamGameServer::GetNextOutgoingPacket.)
+ * - The version string should be in the form x.x.x.x, and is used by the master
+ * server to detect when the server is out of date. (Only servers with the
+ * latest version will be listed.)
+ */
+static inline int SteamGameServer_Init(
+ u32 unIP, u16 usGamePort, u16 usQueryPort,
+ EServerMode eServerMode,
+ const char *pchVersionString )
+{
+ return SteamInternal_GameServer_Init( unIP, 0, usGamePort, usQueryPort,
+ eServerMode, pchVersionString );
+}
+
+void *SteamAPI_SteamGameServer_v014(void);
+static inline void *SteamAPI_SteamGameServer(void)
+{
+ return SteamAPI_SteamGameServer_v014();
+}
+
+void SteamAPI_ISteamGameServer_LogOnAnonymous( void* self );
+void SteamGameServer_Shutdown(void);
+int SteamGameServer_BSecure(void);
+u64 SteamGameServer_GetSteamID(void);
+HSteamPipe SteamAPI_GetHSteamPipe(void);
+HSteamPipe SteamGameServer_GetHSteamPipe(void);
+HSteamUser SteamAPI_GetHSteamUser(void);
+void SteamAPI_ManualDispatch_Init(void);
+void SteamAPI_ManualDispatch_RunFrame( HSteamPipe hSteamPipe );
+steamapi_bool SteamAPI_ManualDispatch_GetNextCallback( HSteamPipe hSteamPipe,
+ CallbackMsg_t *pCallbackMsg );
+void SteamAPI_ManualDispatch_FreeLastCallback( HSteamPipe hSteamPipe );
+steamapi_bool SteamAPI_ManualDispatch_GetAPICallResult( HSteamPipe hSteamPipe,
+ SteamAPICall_t hSteamAPICall, void *pCallback, int cubCallback,
+ int iCallbackExpected, steamapi_bool *pbFailed );
+void SteamAPI_ReleaseCurrentThreadMemory(void);