Tabletop Simulator
by Berserk Games · 5 Jun, 2015
101 downloads
About the Game

Endless Games
Tabletop Simulator has it all. The base game includes 15 classics like Chess, Poker, Jigsaw Puzzles, Dominoes, and Mahjong. Additionally, there are thousands of community created content on the Workshop. If you’re the tabletop gaming type, we include an RPG Kit which has tilesets & furniture, as well as animated figurines that you can set up and battle with your friends, with even more options in the Chest. There’s even an option for Game Masters so they can control the table!

Create Games
If you’re into creativity and prototyping, you can easily create your own games by importing images onto custom boards & tables, create custom decks, import 3D models, create scripts, and much more. You can choose to upload your creations on the Steam Workshop or share them privately with your friends.

Fun For All Ages
Everyone can play Tabletop Simulator! Play a classic board game with grandma, have poker night with the guys, or start your epic RPG adventure with your crew. Play almost any tabletop game you can think of! Being a multiplayer-focused game, up to 10 players can play at any given time.

DLCs
Our downloadable content (DLCs) are different from other games, as we partner with developers and publishers to bring their games into Tabletop Simulator. Each DLC is custom created with high quality assets and special themes that match their games. And best of all, only the host needs to own the DLC for everyone at the table to play.

Key Features:
- Online sandbox with unlimited games to play how you want.
- Multiplayer physics with objects that collide and interact just how you would expect.
- Create your own mods easily with full Steam Workshop support and 3D model importing.
- Take games to the next level with Lua scripting support.
- Play just like you do in real life; pick up, rotate, shake, and throw any object.
- Up to 10 people can play together on the same table.
- Team system with voice and text chat.
- Save & load individual objects and complete games.
- Hotseat allows you to play locally on the same computer with your friends.
- Browse the internet, listen to music, and watch videos in multiplayer, in-game on a tablet.
- Perfect for RPGs - build your very own roleplaying dungeons with our modular tileset, RPG Kit, Multiple States and Tablet (useful for character sheets).
- Great admin tools to enable or disable player permissions and to eliminate griefing in public games.
- 360° panoramic backgrounds that change the lighting and atmosphere.
- Included games: Backgammon, Cards, Chess, Checkers, Chinese Checkers, Custom Board, Dice, Dominoes, Go, Jigsaw Puzzles, Mahjong, Pachisi, Piecepack, Poker, Reversi, RPG Kit, Sandbox, Solitaire, and Tablet.
Screenshots
13 images
Version Information
Steam Patch Notes
Official update history
https://i.imgur.com/mXWYwUV.png
Music Player
- The music player let's you play audio files (.mp3, .wav, .ogg, ogv) which are synced for all players.
- Great for room music or so your DnD campaign has the right mood!
- Supports playlists with ordering, shuffling, and looping.
Custom PDF
- New object Custom PDF, that allows you import a PDF onto a tile.
- This converts the PDF into a series of images, to make it easy to import your rule books!
- Supports multiple pages: swap between them with the contextual menu, next/previous state hotkeys, or the buttons on the left and right side.
- Can popout the PDF to the screen by hitting the hidden UI button on the top left of the PDF object.
- You can joint this to any objects to add any visual flair you would like to match the game.
Cloud Manager Folders
- Cloud manager now supports folders just like Saved Games/Objects.
- When you import all loaded assets into cloud it puts them in a folder defaulting to the Game name.
- Can now name files that are uploaded to the Cloud instead of just using the file name on disk.
Sound Improvements
- Custom Objects that are set to dice or coin will now get that correct sounds for their selected material type.
- Improved sounds for objects interacting with locked objects.
- Added glass material type for Custom AssetBundle and Custom Model.
Alpha Transparency Support
- Added alpha support to the color picker.
- Can now draw with semi tranparency.
- Can color tint objects to have alpha transparency, which goes nicely with the new glass material type.
- Objects with alpha transparency will not cast shadows.
Magnify Revamp
- Magnify (hotkey m) overhauled to be round.
- Scroll up or down to control the zoom level of the magnify.
- Fixed visual issues with previous magnify.
General Improvements
- Added loading percent next to the player names on the top right.
- For the top bar in-game the Scripting, Workshop Upload, and Cloud Manager menus have been moved under "Modding".
- Improved auto-raise to work better with overhangs.
- Added a workshop indicator next to the chat window that you can hover over and get info about how far along the workshop subscription check is at.
- Moved physics mode (semi-lock, locked, etc) from Configuration to Server Options.
- Greatly improved compatibility with old AssetBundles shaders. This will fix a lot of broken DLCs.
- Improved Fog of War performance.
- File Browser now remembers the last opened path.
- Updated Voice Chat plugin.
- Voice chat is now using a higher quality setting.
- Added hidden zone opacity sliders to Misc settings.
Scripting Improvements
- New global class Vector:
Constructors:
Vector(num, num, num) --> return a vector with specified (x, y, z) components
Vector(table) --> return a vector with x/y/z or 1/2/3 conponents from source table (x/y/z first)
Vector.new(...) --> same as Vector(...)
Vector.max(vec1, vec2) --> return a vector with max components between vec1 and vec2
Vector.min(vec1, vec2) --> return a vector with min components between vec1 and vec2
Vector.between(vec1, vec2) --> return a vector pointing from vec1 to vec2
vec:copy() --> copy self into a new vector and retur it
Component access:
vec.x, vec.y, vec.z --> read/write component
v, v, v --> read/write component
vec:get() => num, num, num --> returns x, y, z components of self
Methods modifying self and returning self:
vec:setAt(key, num) --> same as "vec = num"
vec:set(num, num, num) --> set x, y, z components to passed values
vec:add(otherVec) --> adds components of otherVec to self
vec:sub(otherVec) --> subtracts components of otherVec from self
vec:scale(otherVec) --> multiplies self components by corresponding compnents from otherVec
vec:scale(num) --> multiplies self components by a numeric factor
vec:clamp(num) --> if self magnitude is higher than provided limit, scale self down to match it
vec:normalize() --> scale self to magnitude of 1
vec:project(otherVec) --> make self into projection on another vector
vec:reflect(otherVec) --> reflect self over a plane defined through a normal vector arg
vec:inverse() --> multiply self components by -1
vec:moveTowards(otherVec, num) --> move self towards another vector, but only up to a provided distance limit
vec:rotateTowards(otherVec, num) --> rotate self towards another vector, but only up to a provided angle limit
vec:projectOnPlane(otherVec) --> project self on a plane defined through a normal vector arg
Methods not modifying self:
vec:dot(otherVec) --> return a dot product of self with otherVec
vec:magnitude() --> return self magnitude (length)
vec:sqrMagnitude() --> return self magnitude (length) squared
vec:distance(otherVec) --> returns distance between self and otherVec
vec:sqrDistance(otherVec) --> returns squared distance between self and otherVec
vec:equals(otherVec, num) --> returns true if otherVec same as self (optional numeric tolerance param), false otherwise
vec:string(str) --> return string describing self, optional string prefix
vec:angle(otherVec) --> return an angle between self and otherVec, in degrees [0, 180]
vec:cross(otherVec) --> return a cross-product vector of self and otherVec
vec:lerp(otherVec, num) --> return a vector some part of the way between self and otherVec, numeric arg [0, 1] is the fraction
vec:normalized() --> return a new vector that is normalized (length 1) version of self
vec:orthoNormalize() --> return three normalized vectors perpendicular to each other, first one being in the same dir as self
vec:orthoNormalize(otherVec) --> same as vec:orthoNormalize(), but second vector is guranteed to be on a self-otherVec plane
Operators:
vecOne + vecTwo --> return a new vector with added components of vecOne and vecTwo
vecOne - vecTwo --> return a new vector with subtracted components of vecTwo from vecOne
vecOne * vecTwo --> return a new vector with multiplied components of vecOne and vecTwo, NOT a dot product (!)
vec * number --> return a new vector with all components from vec scaled by a numeric factor
number * vec --> same as "vec * number"
vecOne == vecTwo --> return true if both vectors identical or within a small margin of each other, false otherwise
tostring(vec) --> return a string description of a vector
- New global class Color:
Constructors:
Color(num, num, num) --> return a color with specified (r, g, b) components
Color(num, num, num, num) --> return a color with specified (r, g, b, a) components
Color(table) --> return a color with r/g/b/a or 1/2/3/4 components from source table (letter keys prioritized)
Color.new(...) --> same as Color(...)
Color.fromString(colorStr) --> return a color from a color string ('Red', 'Green' etc), capitalization ignored
Color.fromHex(hexStr) --> return a color from a hex representation string (e.g. '#ff112233'), hash sign and alpha are optional
col:copy() --> copy self into a new color and return it
Color.Purple --> shorthand for Color.fromString('Purple'), works for all player and added colors, capitalization ignored
Component access:
col.r, col.g, col.b, col.a --> read/write component
col, col, col, col --> read/write component
col:get() => num, num, num, num --> returns r, g, b, a components of self
col:toHex(includeAlpha) --> returns a hex string for self, boolean parameter
col:toString(num) --> returns a color string if matching this instance, nil otherwise, optional numeric tolerance param
Methods modifying self and returning self:
col:setAt(key, num) --> same as "col = num"
col:set(num, num, num, num) --> set r, g, b, a components to passed values
Methods not modifying self:
col:equals(otherCol, num) --> returns true if otherCol same as self, false otherwise, optional numeric tolerance param
col:lerp(otherCol, num) --> return a color some part of the way between self and otherCol, numeric arg [0, 1] is the fraction
Operators:
colOne == colTwo --> return true if both colors identical or within a small margin of each other, false otherwise
tostring(col) --> return a string description of a color
Other:
Color.list --> table of all color strings
Color.Add(name, yourColor) --> add your own color definition to the class (string name, Color instance yourColor)
- Added an overload to UI.setXml() and UI.setXmlTable() to take a CustomAssets as the last param.
- Music Player exposed to Lua.
- Added logString function, which returns a string representation of a lua object (the same representation the log function uses)
- Fixed cleanup issue with Xml custom assets UI from lua for clients.
- Fixed turns not network syncing for Lua.
VR
- Improved movement - added movement inertia. Can be calibrated or disabled in VR settings.
- Grid overlay now renders in VR.
- Fog of War now renders in VR.
- Added VR documentation to api website: https://api.tabletopsimulator.com/vr/
Spectator Mode
- Spectator window may now display the view grey players have (for example, cards in your hand will be hidden). Enable with +spectator_restrict_view
- Spectator window now renders the grid. May be turned off with -spectator_show_grid
System Console
- Added documentation for system console to tabletop api website: https://api.tabletopsimulator.com/systemconsole/
- Inline variable evaluation changed to use { and } (instead of < and >). See above page for details.
- You may now use alias to run commands when a toggle variable's value is changed.
- skip now allows for various comparisons, and fuzzy equality check.
- Added ui_anchor, ui_label and ui_toggle commands (to accompany ui_button), allowing you more options for easily running commands / changing setting during play.
New commands: (for more info see above page, or use help <command>)
- append - Adds text, or the last entered command, to a text variable.
- camera_reset_on_load - Whether the camera resets its position when you do a Save & Play in Atom.
- chat_input - Activates chat input box.
- component_examine - Sets game component currently being examined.
- component_move, component_rotate, component_position, component_rotation - Apply movements to components.
- eval - Evaluates an expression and stores it in a variable.
- examine_position, examine_rotation - Return information on the currently examined component.
- hidden_zone_showing_opacity, hidden_zone_hiding_opacity - Set visual opacity of hidden zones.
- lua - Execute a lua statement.
- music_add, music_mute, music_next, music_pause, music_play, music_prev, music_repeat, music_shuffle, music_timecode - Commands to control new music player.
- spectator_restrict_view - Whether the spectator window shows your view, or that of a grey player.
- spectator_show_grid - Whether the grid is rendered in the spectator window.
- team - Stores / sets team you are currently on.
- ui_anchor - Sets position UI elements are made relative to (default is 0,0 - the center of the screen)
- ui_label - Add static text UI element.
- ui_toggle - Add checkbox UI element.
- vector_x, vector_y, vector_z - Return an individual axis from a vector variable.
- vr_move_with_inertia - Whether you have inertia in VR.
- vr_move_friction - When you have inertia, how quickly you slow down.
- vr_scale_rotate_rate - How much smoothing is applied during scaling/rotating.
Fixes
- Fixed scroll wheel being inverted for Linux.
- Fixed Components menu chess Wood White King being missing.
- Fixed search and expand for Games menu.
- Fixed misc issues with spectator camera.
Unity Engine Upgrade:
- Upgrade Unity version from 5.6.6 to 2019.1.
- Dx11 on Windows, OpenGLCore on Mac and Linux.
- FPS should be overall faster. Can be twice as fast in really specific scenes.
- Physics performance improved.
- Video textures much faster with more formats support (.m4v and .mov)
- Incremental garbage collector greatly reduces the game's stutters.
Changes:
- Dx9 support has been dropped (only 0.01% of players have a gpu that is only Dx9). Dx10 is minimum requirement now.
- Windows Xp support dropped and with Steam not supporting it anymore either this isn't a surprise.
- All custom images are now resized to a power of 2 internal, so avoid using non power of 2 images if you can. This is due to Dx11 bug this might be changed back in the future if Unity fixes this.
- RAW cache from Images and Models had to deleted to due incompatibilities with the engine upgrade.
Known Issues:
- AssetBundles using crunched textures will not load correctly and need to be re-exported from Unity 2019.1 with the updated Modding Project.
- AssetBundle mesh colliders might behave differently due to physx upgrade.
New System Requirements:
- OS: Windows 7 SP1+, macOS 10.12+, Ubuntu 16.04+
- Graphics card with DX10 (shader model 4.0) capabilities.
- CPU: SSE2 instruction set support.
Performance Optimizations:
- Saving mod asset to disk is now async and will not sutter the game.
- Greatly reduced the time it takes to destroy objects reducing the lag when changing mods.
- Made the Games & Saved Objects menu async to fix stutters when opening them.
DLC Improvments:
- DLC are no longer included in the game install and will be downloaded when played the first time.
- This has reduce the install size of the game by 4 gigs.
- We can also now update and add new DLCs without having to update the game.
- Can now have multiple DLCs loaded up at once.
AssetBundle Materials:
- Added support for loading AssetBundle materials into any Custom Object Image slot.
- Create holographic playing cards or add normal maps to your custom dice!
- Works by assigning your material to an AssetBundle and then exporting like normal.
General Improvements:
- Custom Card added so you can create cards one at a time.
- Added /rules to global chat which opens a link to the rules on our knowledge base.
- Update DLC Three Cheers for master with scripted components.
- Disabled being able to load local files with the Tablet due to javascript exploits.
- Opening urls now only open steam links in the overlay and all others open in your default browser.
- Secured many networking related functions from hackers.
- Added .json to Steam Cloud upload file types.
- Steam Cloud now supports uploading files greater than 100mb.
Lua:
- Added filterObjectEnter(object) event: Place it on an object, and it will prevent any objects from being able to enter it. For example, placing it on a deck will not allow cards to enter it. If you return true in the function, the item will be allowed in.
XML UI:
- Updated plugin to the latest version.
- Can now get the click button for events like onClick with the value param passed.
- Xml UI image assets are now no longer compressed to make them look nicer.
- Xml UI errors now print to chat, to make it easier to debug Xml UI.
Caching Improvement:
- Added support for adding {verifycache} in front of your urls to have the game check the last-modified header of a url to update the local cache if it is stale. Only does this check once per game session.
- This is an advanced feature for people that want to host content on there own servers and make sure people get updates without having to change the URLs.
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified
VR
- Added a warning message when you do not have any control bindings (typically because you are using unsupported hardware), instructing you on how to set the bindings up in SteamVR.
- Fixed objects not clumping when you shake the controller.
- Fixed stack/deck grab not working with laser pointer.
Spectator Mode
Spectator mode now works when you use a different resolution than your main display. It has had an overhaul, and now works using these commands:
- displays - Lists all available displays. ID 0 will always be your main game screen.
- spectator_window - Turn on to activate the spectator window.
- spectator_activate_with_resolution - Use instead of above to specify display, resolution, etc.
- vr_spectator_replaces_main_window - In VR, controls whether spectator mode makes its own window or just uses the desktop mirror.
- spectator_camera_follow_player - When ON the camera will follow your point-of-view.
- spectator_camera_attachment - Lets you specify a component or pointer to attach camera to.
- spectator_camera_follow_attachment - When ON the camera will follow the above object.
- spectator_camera_dolly - When camera is following an object, it will be offset this far in the direction it is facing.
- spectator_camera_offset_position - When camera is following an object it will be offset by this X Y Z.
- spectator_camera_offset_rotation - When camera is following an object its facing will be offset by thus X Y Z.
- spectator_camera_load - Set the camera to a saved camera position.
- spectator_camera_load_zero - As above, but the position is zero-indexed (useful when coupled with certain commands like Add).
- spectator_camera_smooth_on_load - Whether smoothing is applied during above.
- spectator_camera_target - Lets you specify a component or pointer for the camera to track.
- spectator_camera_tracking - When ON the camera will track the above object.
- spectator_camera_look_at - Make spectator camera look a component or pointer.
- spectator_camera_override_player_with_look - When ON the look at and track commands will work when camera is following player.
- spectator_show_ui - Whether the UI is displayed on the spectator window.
- spectator_post_processing - Whether post-processing effects are applied to spectator window.
- spectator_camera_smooth_position - Positional smoothing factor.
- spectator_camera_smooth_rotation - Rotational smoothing factor.
- spectator_camera_stay_upright - When ON the camera will not go upside-down.
Example autoexec.cfg:
+spectator_window
-spectator_show_ui
# Make easier to type versions of spectator_camera_ commands.
# i.e. cam_load instead of spectator_camera_load
alias cam_* spectator_camera_*
+cam_stay_upright
# make right control have camera follow player while held
# @ makes it not output to console
bind +right_control @+cam_follow_player
bind -right_control @-cam_follow_player
# make semicolon look at object under pointer
# need to start line with > to stop <hovered> being evaluated,
# and exec to make it evaluate when activated
>bind semicolon exec cam_look_at <hovered>
# make period toggle object tracking, and comma set tracked object
bind period !cam_tracking
>bind comma exec cam_target <hovered>
# make right shift cycle through first 3 camera positions
alias next_camera add cam_load_zero 1 3
bind right_shift next_camera
# make some buttons to load specific camera positions
ui_button 1 600 0 cam_load 1
ui_button 2 600 -30 cam_load 2
ui_button 3 600 -60 cam_load 3
System Console
- '/' commands now worked when typed into console tab
- Fixed color command ignoring permissions
New commands:
- chat_font_size - The size of the font in the chat windows.
- say_global, say_game, say_team - Transmits text to specified chat channel.
- subtract - Like add, but allows you to subtract current value from another (good for ping-ponging between two numbers).
- vr_steamvr_bindings - Lists all current steamVR bindings.
- ui_button - Lets you make a button on your screen which will perform a command.
- highlight - Highlights specified component.
- mod_caching, mod_caching_raw, mod_threading, and mod_thread_count.
Last three variables are typically used as parameters in other commands, buy enclosing them with << and >>. - find - Call with parameters to find a component. Will then be set to that component.
- grabbed - Equals the component you are currently holding.
- hovered - Equals the component you are hovering over.
For example:
find -name "Blue Player Token"
highlight <<find>>
If you want to set up a binding/alias/button in a script then you need to start the line with a >, surround the variable with < and > instead, and use exec.
>bind right_control exec spectator_camera_attachment <hovered>
Fixes:
- Fixed blury comfirmation UI for tablet.
- Fixed saving .rawm to disk when regular caching.
- Fixed random sort for Games and Saved Objects is now actually working correctly.
- Fixed custom objects not probably being positioned on the UI correctly.
- Fixed the black background fade stuttering on when open exist to main menu window.
- Fixed some format stuff for file browser or tooltips. Added back .jpeg.
- Fixed line tool, including flick and joint.
Current Release
22151084
Uploaded Apr 08, 2026
Update already requested
Uploaders have been notified
A newer version is available but not yet uploaded
Help keep this updated
Login Required
You need to be logged in to request game updates. Would you like to go to the login page?
Request Update
Request an update for Tabletop Simulator? This will notify uploaders that this game has an available update.
Request Submitted
Your update request has been submitted successfully! Uploaders will be notified.
Request Failed
Failed to submit update request:
System Requirements
How to Install
Tabletop Simulator.exe to play
Troubleshooting tips
• Run Redist/_CommonRedist installers if game won't start
• Add folder to Windows Defender exclusions
• Run as administrator
Download
Direct link available
1.2 GB
22151084
9D8D1F1A
42d773a23c7a49e2868b3567de8826f967359babad22f1676608ca99c72eb0fb
You May Also Like
View AllDownload Tabletop Simulator for PC with a direct link or via torrent. Get the full version of Tabletop Simulator for free. Tabletop Simulator is a Casual released by Berserk Games.