[b]Example:[/b] [code=cpp]void CInventory::GrantPromoItems() { SteamItemDef_t newItems[2]; newItems[0] = 110; newItems[1] = 111; SteamInventory()->AddPromoItems( &s_GenerateRequestResult, newItems, 2 ); }[/code] [subsection=CheckResultSteamID]CheckResultSteamID[/subsection] [code=cpp]bool CheckResultSteamID( SteamInventoryResult_t resultHandle, CSteamID steamIDExpected );[/code] [table] [tr][th]Name[/th][th]Type[/th][th]Description[/th][/tr] [tr][td][b]resultHandle[/b][/td][td][apitype]ISteamInventory::SteamInventoryResult_t[/apitype][/td][td]The inventory result handle to check the Steam ID on.…
[b]Example:[/b] [code=cpp]void CInventory::GrantTestItems() { SteamItemDef_t newItems[2]; uint32 quantities[2]; newItems[0] = 110; newItems[1] = 111; quantities[0] = 1; quantities[1] = 1; SteamInventory()->GenerateItems( &s_GenerateRequestResult, newItems, quantities, 2 ); }[/code] [subsection=GetAllItems]GetAllItems[/subsection] [code=cpp]bool GetAllItems( SteamInventoryResult_t *pResultHandle );[/code] [table] [tr][th]Name[/th][th]Type[/th][th]Description[/th][/tr] [tr][td][b]pResultHandle[/b][/td][td][apitype]ISteamInventory::SteamInventoryResult_t[/apitype] *[/td][td]Returns a new inventory result handle.…
After you have plugged it in, press the power button to turn it on, then follow the in headset instructions to get through the initial update. After the headset reboots, log into Steam. [docimg={62DA2CEA-FD49-491C-8E01-B983CBEC377F}.png]{62DA2CEA-FD49-491C-8E01-B983CBEC377F}.png[/docimg] [section]Developer Mode[/section] When you get your frame the first thing you will want to do is turn on [b]Developer Mode[/b]. …
Once connected, click this same button to disconnect from wireless streaming. [docimg=steamframe-streamtopc2.png]steamframe-streamtopc2.png[/docimg] [i]Note: SteamVR will automatically reconnect to the last wireless headset it was launched with, so you can just launch SteamVR from the PC rather than needing to initiate from in-headset each time. …
This is the best choice for highly competitive games (such as Dota 2) or games with persistent servers that stay around after players leave (such as Team Fortress 2). [section]Steam Server Browser[/section] A large part of the game server experience on Steam comes from the unified server browser. …
id=<file id> [/code] For example, here are a few examples from Portal 2's [url=https://steamcommunity.com/app/620/workshop/]Workshop[/url] and [url=https://steamcommunity.com/app/620]Community Hub[/url]. …
Here is an example of the first [url=https://steamcommunity.com/games/portal2/announcements/detail/92679896001484067]Portal 2 update event[/url]. [docimg=2019-09-18_13-59-10.png]2019-09-18_13-59-10.png[/docimg] [subsection=medal]Medal.tv[/subsection] It might be fun to share an epic moment from your gaming sessions in your game's announcements. …
It is built upon the Chromium Embedded Framework and supports HTML5 markup.[/td][/tr] [tr][td][doclink=features/inventory][/doclink][/td][td]The Steam Inventory Service is a set of features that allow a game to enable persistent player inventories without having to run special servers to manage users or items.…
We have found that for our own games it works best to release major updates every 1-2 months at most. This let us put together a big enough update to be exciting and compelling, and allowed for time to tease or pre-announce those updates before they ship to build anticipation. …
[/olist] [b]Examples[/b] As an example of the kinds of update announcement pages that we at Valve have put together for some of our own games, you can see the latest updates for Counter-Strike 2 listed down the right-side of the [url=https://www.counter-strike.net/home]CS2 website[/url], or some updates for Dota 2 [url=http://www.dota2.com/700]here[/url] and [url=http://www.dota2.com/darkrift]here[/url]. …
Once you enable Smart Section, you will see a few options for which smart section criteria to use for this section. [subsection]2. Using filters (requires a linked app list)[/subsection] If you have more than about 50 games, and if you want to organize them by genre or tag, you may want to use the linked app list. …
There are a few different options to make the layout interesting. 2/3/4/3 [subsection]Special options for single item-per-row[/subsection] If you choose to display a single (1) item per row, then you'll find a new set of options appears for how to display that single item. …
Example: to take a specific event like TI6, Valve would create a cover image focusing on "The International" rather than a generic use of "Dota 2". Example cover images: [docimg=capsule_examples.jpg]capsule_examples.jpg[/docimg] When viewed inside the Steam Library: [docimg=event_example_home_862.jpg]event_example_home_862.jpg[/docimg] [section]Event/Announcement Detail Page[/section] [b]The guts of your event/announcement.…
So, in addition to text and static images, feel free to include Steam Store widgets or YouTube videos. [docimg=event_example_detail_lg2.jpg]event_example_detail_lg2.jpg[/docimg] [section]Steam Library - Game Details Page[/section] Your game details page in the Steam Library includes three image types to convey information about the state of your game. …
[docimg=action_set_layers_basic_1.png]action_set_layers_basic_1.png[/docimg] When the player selects a class, the appropriate layer is added, e.g. "sniper" [docimg=action_set_layers_sniper_2.png]action_set_layers_sniper_2.png[/docimg] The code for this might look something like: [code=cpp] void changeClass(EClassID myClass) { if(myClass == SNIPER) { SteamInput()->ActivateActionSetLayer( controllerHandle1, sniperLayerHandle ); } //logic for other classes } [/code] If the player enters or exits a vehicle, the controls for the vehicle layer are activated/deactivated on those state changes, adding or removing new controls for vehicle specific functions. …
[docimg=action_set_layers_scope.png]action_set_layers_scope.png[/docimg] [code=cpp] void useScope(bool entering) { if(entering) { SteamInput()->ActivateActionSetLayer( controllerHandle1, scopeHandle ); //apply the scoped-in layer when you scope in } else { SteamInput()->DeactivateActionSetLayer( controllerHandle1, scopeHandle ); //remove the scoped-in layer when you lower the scope } } [/code] Here's how all the layers combine. [docimg=action_set_layers_result_2.png]action_set_layers_result_2.png[/docimg] Note how layers can not only add new actions on top of underyling layers, they can also override previous bindings -- in this case, the vehicle-specific "brake" and "gas" actions override the basic layer's "jump" and "interaction" actions, and "steer" overrides the "move" action bound to the trackpad and joystick on the base layer, and in turn is overriden by the "aim" action from the scoped-in action set layer. …
[section=GetAppList]GetAppList[/section] [code=http]GET https://api.steampowered.com/ISteamApps/GetAppList/v2/[/code] Deprecated - this API can no longer scale to the number of items available on Steam. Please use [doclink=webapi/IStoreService#GetAppList]IStoreService/GetAppList[/doclink] instead. …
When type_filter is blank or not used, all apps are returned. Version 2 will output the app name. [b]NOTE:[/b] This call requires a publisher API key to use this method. As such this API [b]MUST[/b] be called from a secure server, and can never be used directly by clients! …
For example, naming a branch "version_1.4" and another one "version_1.5" [*][b]Enable the Workshop setting "Enable Game Branch Versions"[/b] - This setting under your Steamworks Workshop configuration will allow mod authors to specify ranges of branches that their item works with [*][b]Establish a consistent test-to-deployment process[/b] - It is important to give mod authors a chance to create and upload new versions of their mod, or update version support definition for existing mods if they work well with the latest version of the game. …
. [*]Before your store page or game build can go live, there is a brief review process where we run your game, look at your store page, and check that it is configured correctly and running as expected and not doing anything harmful. This takes between 1-5 days. [*]There are a couple of additional timing requirements before you can release your first few titles on Steam: [list] [*]A 21-day waiting period between when you paid the app fee and when you can release that game. …
Note that the expected item definition id should match the target item's item definition id. [code] SteamItemInstanceID_t inputItems[2] = { unPaintCanItemDefID, unHatItemDefID }; uint32 inputQuantities[2] = { 1, 1 }; SteamItemDef_t outputItems[1] = { unHatItemDefID }; uint32 outputQuantity[1] = { 1 }; SteamInventoryResult_t resultHandle; SteamInventory()->ExchangeItems( &resultHandle, outputItems, outputQuantity, 1, inputItems, inputQuantities, 2 ); [/code] If you wanted to have a tool that just removed a tag, you can define something like this "Paint Stripper.…
[b]Example:[/b] [code=cpp]// Restore the user default color for controller 1: SteamController()->SetLEDColor( controller1Handle, 0, 0, 0, k_ESteamControllerLEDFlag_RestoreUserDefault ); // Set the color to magenta for controller 2: SteamController()->SetLEDColor( controller2Handle, 255, 0, 255, k_ESteamControllerLEDFlag_SetColor );[/code] [subsection=ShowAnalogActionOrigins]ShowAnalogActionOrigins[/subsection] [code=cpp]bool ShowAnalogActionOrigins( ControllerHandle_t controllerHandle, ControllerAnalogActionHandle_t analogActionHandle, float flScale, float flXPosition, float flYPosition );[/code] [table] [tr][th]Name[/th][th]Type[/th][th]Description[/th][/tr] [tr][td][b]controllerHandle[/b][/td][td][apitype]ISteamController::ControllerHandle_t[/apitype][/td][td][/td][/tr] [tr][td][b]analogActionHandle[/b][/td][td][apitype]ISteamController::ControllerAnalogActionHandle_t[/apitype][/td][td][/td][/tr] [tr][td][b]flScale[/b][/td][td]float[/td][td][/td][/tr] [tr][td][b]flXPosition[/b][/td][td]float[/td][td][/td][/tr] [tr][td][b]flYPosition[/b][/td][td]float[/td][td][/td][/tr] [/table] Deprecated. …
[table] [tr][th]Name[/th][th]Value[/th][th]Description[/th][/tr] [tr=k_EControllerActionOrigin_None][td][b]k_EControllerActionOrigin_None[/b][/td][td]0[/td][td][/td][/tr] [tr=k_EControllerActionOrigin_A][td][b]k_EControllerActionOrigin_A[/b][/td][td]1[/td][td](Valve Steam Controller) digital face button A[/td][/tr] [tr=k_EControllerActionOrigin_B][td][b]k_EControllerActionOrigin_B[/b][/td][td]2[/td][td](Valve Steam Controller) digital face button B[/td][/tr] [tr=k_EControllerActionOrigin_X][td][b]k_EControllerActionOrigin_X[/b][/td][td]3[/td][td](Valve Steam Controller) digital face button X[/td][/tr] [tr=k_EControllerActionOrigin_Y][td][b]k_EControllerActionOrigin_Y[/b][/td][td]4[/td][td](Valve Steam Controller) digital face button Y[/td][/tr] [tr=k_EControllerActionOrigin_LeftBumper][td][b]k_EControllerActionOrigin_LeftBumper[/b][/td][td]5[/td][td](Valve Steam Controller) digital left shoulder button (aka "left bumper")[/td][/tr] [tr=k_EControllerActionOrigin_RightBumper][td][b]k_EControllerActionOrigin_RightBumper[/b][/td][td]6[/td][td](Valve Steam Controller) digital right shoulder button (aka "right bumper")[/td][/tr] [tr=k_EControllerActionOrigin_LeftGrip][td][b]k_EControllerActionOrigin_LeftGrip[/b][/td][td]7[/td][td](Valve Steam Controller) digital left grip paddle[/td][/tr] [tr=k_EControllerActionOrigin_RightGrip][td][b]k_EControllerActionOrigin_RightGrip[/b][/td][td]8[/td][td](Valve Steam Controller) digital right grip paddle[/td][/tr] [tr=k_EControllerActionOrigin_Start][td][b]k_EControllerActionOrigin_Start[/b][/td][td]9[/td][td](Valve Steam Controller) digital start button[/td][/tr] [tr=k_EControllerActionOrigin_Back][td][b]k_EControllerActionOrigin_Back[/b][/td][td]10[/td][td](Valve Steam Controller) digital back button[/td][/tr] [tr=k_EControllerActionOrigin_LeftPad_Touch][td][b]k_EControllerActionOrigin_LeftPad_Touch[/b][/td][td]11[/td][td](Valve Steam Controller) left haptic touchpad, in simple contact with a finger[/td][/tr] [tr=k_EControllerActionOrigin_LeftPad_Swipe][td][b]k_EControllerActionOrigin_LeftPad_Swipe[/b][/td][td]12[/td][td](Valve Steam Controller) left haptic touchpad, touch input on any axis[/td][/tr] [tr=k_EControllerActionOrigin_LeftPad_Click][td][b]k_EControllerActionOrigin_LeftPad_Click[/b][/td][td]13[/td][td](Valve Steam Controller) left haptic touchpad, digital click (for the whole thing)[/td][/tr] [tr=k_EControllerActionOrigin_LeftPad_DPadNorth][td][b]k_EControllerActionOrigin_LeftPad_DPadNorth[/b][/td][td]14[/td][td](Valve Steam Controller) left haptic touchpad, digital click (upper quadrant)[/td][/tr] [tr=k_EControllerActionOrigin_LeftPad_DPadSouth][td][b]k_EControllerActionOrigin_LeftPad_DPadSouth[/b][/td][td]15[/td][td](Valve Steam Controller) left haptic touchpad, digital click (lower quadrant)[/td][/tr] [tr=k_EControllerActionOrigin_LeftPad_DPadWest][td][b]k_EControllerActionOrigin_LeftPad_DPadWest[/b][/td][td]16[/td][td](Valve Steam Controller) left haptic touchpad, digital click (left quadrant)[/td][/tr] [tr=k_EControllerActionOrigin_LeftPad_DPadEast][td][b]k_EControllerActionOrigin_LeftPad_DPadEast[/b][/td][td]17[/td][td](Valve Steam Controller) left haptic touchpad, digital click (right quadrant)[/td][/tr] [tr=k_EControllerActionOrigin_RightPad_Touch][td][b]k_EControllerActionOrigin_RightPad_Touch[/b][/td][td]18[/td][td](Valve Steam Controller) right haptic touchpad, in simple contact with a finger[/td][/tr] [tr=k_EControllerActionOrigin_RightPad_Swipe][td][b]k_EControllerActionOrigin_RightPad_Swipe[/b][/td][td]19[/td][td](Valve Steam Controller) right haptic touchpad, touch input on any axis[/td][/tr] [tr=k_EControllerActionOrigin_RightPad_Click][td][b]k_EControllerActionOrigin_RightPad_Click[/b][/td][td]20[/td][td](Valve Steam Controller) right haptic touchpad, digital click (for the whole thing)[/td][/tr] [tr=k_EControllerActionOrigin_RightPad_DPadNorth][td][b]k_EControllerActionOrigin_RightPad_DPadNorth[/b][/td][td]21[/td][td](Valve Steam Controller) right haptic touchpad, digital click (upper quadrant)[/td][/tr] [tr=k_EControllerActionOrigin_RightPad_DPadSouth][td][b]k_EControllerActionOrigin_RightPad_DPadSouth[/b][/td][td]22[/td][td](Valve Steam Controller) right haptic touchpad, digital click (lower quadrant)[/td][/tr] [tr=k_EControllerActionOrigin_RightPad_DPadWest][td][b]k_EControllerActionOrigin_RightPad_DPadWest[/b][/td][td]23[/td][td](Valve Steam Controller) right haptic touchpad, digital click (left quadrant)[/td][/tr] [tr=k_EControllerActionOrigin_RightPad_DPadEast][td][b]k_EControllerActionOrigin_RightPad_DPadEast[/b][/td][td]24[/td][td](Valve Steam Controller) right haptic touchpad, digital click (right quadrant)[/td][/tr] [tr=k_EControllerActionOrigin_LeftTrigger_Pull][td][b]k_EControllerActionOrigin_LeftTrigger_Pull[/b][/td][td]25[/td][td](Valve Steam Controller) left analog trigger, pulled by any amount (analog value)[/td][/tr] [tr=k_EControllerActionOrigin_LeftTrigger_Click][td][b]k_EControllerActionOrigin_LeftTrigger_Click[/b][/td][td]26[/td][td](Valve Steam Controller) left analog trigger, pulled in all the way (digital value)[/td][/tr] [tr=k_EControllerActionOrigin_RightTrigger_Pull][td][b]k_EControllerActionOrigin_RightTrigger_Pull[/b][/td][td]27[/td][td](Valve Steam Controller) right analog trigger, pulled by any amount (analog value)[/td][/tr] [tr=k_EControllerActionOrigin_RightTrigger_Click][td][b]k_EControllerActionOrigin_RightTrigger_Click[/b][/td][td]28[/td][td](Valve Steam Controller) right analog trigger, pulled in all the way (digital value)[/td][/tr] [tr=k_EControllerActionOrigin_LeftStick_Move][td][b]k_EControllerActionOrigin_LeftStick_Move[/b][/td][td]29[/td][td](Valve Steam Controller) left joystick, movement on any axis (analog value)[/td][/tr] [tr=k_EControllerActionOrigin_LeftStick_Cli…
Remember: Seasonal Sales are exempt from Discount Cooldowns created by other discounts, so the Nov 15-22 launch discount would not prevent the game from joining the Dec 17 Winter Sale, even though they are within 30 days of each other. [subsection]Example 2: Joining Multiple Featuring Events with One Discount[/subsection] Later next Spring, things are going well and Bass Ain't Bitin' 2 is invited to three featuring events in the month of June! …
One potential solution would be the following: [list] [*] On September 1st, Bass Ain't Bitin' 2 sets up a 14-day discount on its current Early Access prices. At the same time, it also announces that it intends to increase prices at the end of this sale. …
Examples of Roadmap assets: [docimg=arcraidersroadmap]arcraidersroadmap[/docimg] [docimg=spacemarine2roadmap.jpg]spacemarine2roadmap.jpg[/docimg] [docimg=percentagebasedapproach]percentagebasedapproach[/docimg] [section]Setting up a Roadmap[/section] To start, navigate to your game's app landing page, and click on "Edit Store Page". …
This is the best choice for highly competitive games (such as Dota 2) or games with persistent servers that keep running even after all players leave (such as Team Fortress 2). You can read more about it in the [doclink=features/multiplayer/game_servers][/doclink] documentation.…
They will continue to be usable but it's highly recommended that you use the latest version. Change history: [list] [*] [b]Version 2[/b] - Fixes returning the leaderboard name in XML. [/list] [b]NOTE:[/b] This call requires a publisher API key to use this method. …
They will continue to be usable but it's highly recommended that you use the latest version. Change history: [list] [*] [b]Version 2[/b] - Fixes returning the leaderboard name in XML. [/list] [b]NOTE:[/b] This call requires a publisher API key to use this method. …
[table] [tr] [td]OpenVR (Depth-assisted reprojection)[/td] [td][url=https://github.com/ValveSoftware/openvr/wiki/IVRCompositor::Submit]IVRCompositor::Submit[/url] with [url=https://github.com/ValveSoftware/openvr/blob/v2.15.6/headers/openvr.h#L191]VRTextureWithPoseAndDepth_t[/url][/td] [/tr] [tr] [td]OpenVR (Depth+Motion-assisted reprojection)[/td] [td][url=https://github.com/ValveSoftware/openvr/wiki/IVRCompositor::Submit]IVRCompositor::Submit[/url] with [url=https://github.com/ValveSoftware/openvr/blob/v2.15.6/headers/openvr.h#L202]VRTextureWithMotion_t[/url][/td] [/tr] [tr] [td]OpenXR (Depth-assisted reprojection)[/td] [td][url=https://registry.khronos.org/OpenXR/specs/1.0/man/html/XR_KHR_composition_layer_depth.html]XR_KHR_composition_layer_depth[/url][/td] [/tr] [tr] [td]OpenXR (Depth+Motion-assisted reprojection) Vendor-agnostic[/td] [td][url=https://registry.khronos.org/OpenXR/specs/1.1/man/html/XR_EXT_frame_synthesis.html]XR_EXT_frame_synthesis[/url][/td] [/tr] [tr] [td]OpenXR (Depth+Motion-assisted reprojection) Oculus[/td] [td][url=https://registry.khronos.org/OpenXR/specs/1.0/man/html/XR_FB_space_warp.html]XR_FB_space_warp[/url][/td] [/tr] [/table] You can visualize the depth or motion vectors submitted by using the [doclink=steamframe/debugging#GameTextures]Draw Performance Assessment Game Textures in Headset[/doclink] option. …
To help troubleshoot transient frame time issues with your game, you can look at the [b]perfcriteria.txt[/b] file in the SteamVR logs folder ([b]/home/steamos/.local/share/Steam/logs[/b], or accessible through the alias [b]cdl[/b] from a shell). The first 2 lines recapitulate the Application Name, Steam Application ID, target frame time, effective resolution, etc. The rest of the file is a list of frame times leading to the violation of the threshold set with the target frame time. …
[/td] [/tr] [/table] This can be visualized like this: [docimg=app_trans2.png]app_trans2.png[/docimg] …