Migrating games from Steam

If your game has been published on Steam, you can use a migration tool. In a wide range of cases, this simplifies connection to the Mail.Ru infrastructure, allowing you to simply copy .dll files. Step-by-step instructions on moving a project from Steam are shown below:

1. Ensure that when you create the project the "Steam emulation mode" checkbox in the developer dashboard is checked.

2. Download the steam_api.dll archive (various versions) from the Game Center using the link http://admin.dl.mail.ru/guptools/steam_api_dlls.zip. Extract the folder from this archive with the name that matches the steam_api.dll version used in your game client.

3. Replace the Steam_api.dll in your client with the dll from the Game Center obtained in p. 2.

4. Protect the game if required.

If the game was previously protected and the protection was extended to the Steam dll, then you must protect the game to match the new dll file. If the game was not protected, it should be sufficient to simply replace the file with the new one.

5. Assemble the new package and upload it to the GC server. This can be done by following the corresponding instructions.

Client API

It is assumed that your game client is already integrated with the Steam SDK. In this case, it is enough to replace steam_api.dll or steam_api64.dll in the game folder with the versions from the Mail.Ru libraries. A small part of the API from Steam is implemented in these libraries. The following methods are implemented:

  • SteamAPI_Init()
  • SteamAPI_Shutdown()
  • SteamAPI_IsSteamRunning()
  • SteamAPI_RegisterCallback()
  • SteamAPI_UnregisterCallback()
  • SteamAPI_RegisterCallResult()
  • SteamAPI_UnregisterCallResult()
  • SteamUser()
  • SteamUser()→GetAuthSessionTicket()
  • SteamUser()→GetSteamID()
  • SteamUser()→BLoggedOn()
  • SteamFriends()
  • SteamFriends()→GetPersonaName()
  • SteamFriends()→GetPersonaState()
  • SteamFriends()→ActivateGameOverlayToWebPage()
  • SteamFriends()→InviteUserToGame()
  • SteamFriends()→GetFriendCount()
  • SteamFriends()→GetFriendByIndex()
  • SteamFriends()→GetFriendPersonaState()
  • SteamFriends()→GetFriendPersonaName()
  • SteamFriends()→GetSmallFriendAvatar()
  • SteamFriends()→GetMediumFriendAvatar()
  • SteamFriends()→GetLargeFriendAvatar()
  • SteamFriends()→GetFriendRichPresence()
  • SteamRemoteStorage()
  • SteamRemoteStorage()→FileWrite()
  • SteamRemoteStorage()→FileRead()
  • SteamRemoteStorage()→FileExists()
  • SteamRemoteStorage()→GetFileSize()
  • SteamRemoteStorage()→FileDelete()
  • SteamRemoteStorage()→GetFileTimestamp()
  • SteamRemoteStorage()→GetFileCount()
  • SteamRemoteStorage()→GetFileNameAndSize()
  • SteamUtils()
  • SteamUtils()→GetAppID()
  • SteamUtils()→GetImageSize()
  • SteamUtils()→GetImageRGBA()
  • GetAuthSessionTicketResponse_t
  • MicroTxnAuthorizationResponse_t
  • GameRichPresenceJoinRequested_t

For the remaining methods, dummy functions have been implemented (i.e. they can be called, but they do nothing). If the game client is server-side, authorization is checked as follows: 

  • ISteamUser::GetAuthSessionTicket() is called on the client
  • a ticket is sent to the game server
  • the game server calls the ISteamUserAuth/AuthenticateUserTicket method at games.mail.ru

The returned SteamId from checking the ticket must be equal to the value returned on the client by the SteamUser()->GetSteamID() call.

Additional possibilities

If your game uses a greater number of Steam SDK/API methods than those specified in this document, contact us and we’ll try to help. Our task is to make linking projects as comfortable as possible for developers. Our contact form can be found here.