A quick note from the team: We know it’s been a long time since the last big update. Behind the scenes we’ve been doing a lot of groundwork on the engine and tools, and this patch is the first step to a renewed focus on regular updates and improvements to TTS. Thank you for your patience and for sticking with us ❤️
Thanks to everyone who tried out this update in the public beta—your feedback was invaluable in helping us make it as good as it is. A lot of the new features and fixes came directly from what you shared with us.
Gameplay, rules, and your saves are unchanged. This is primarily an engine + quality-of-life update.
Engine & platform
Rendering & mod assets
Quality of life
Lua / creators
putObject index support, plus stability fixes for scripting and drafting/hand selection workflows.Windows
macOS
Linux
If you're on an older OS than the above, TTS may not launch after this update. Please update your system.
macOS (Apple Silicon)
Windows & Linux
Includes the latest Unity 6 security fixes, addressing known file-loading vulnerabilities in older engine versions.
Combined with code signing, this should reduce security prompts and exploit risk.
Translucency that allows images to support partial translucency (EXPERIMENTAL, please send us feedback on this!).Note: Your RAW image cache will be cleared with this update due to image pipeline changes and new translucency support.
Added search filter for playlists. (Feedback #2143)
Added Clear Playlist button.
Added Export Playlist and Import Playlist
Added Upload Music Folder
TTS will now suggest a name for a song when you provide a URL or file.
Fix: Music player no longer breaks when loading a new mod. (Feedback #2038)
Fix: Music events no longer break when a song ends with no playlist active.
Fix: Music player no longer resets when loading a save file with no music saved on it.
On-screen notes region is now resizable.
New notepad settings for:
New console commands:
ui_notepad_editui_notepad_left_alignui_notepad_lockedui_notepad_fixed_width_fontui_notepad_font_sizeui_notepad_sizeui_notepad_textWhile Grid settings are open, the grid now renders on top of everything, making adjustments easier.
ui_grid_highlight_when_editing (console / Misc setting).New anchor & gizmo mode
Added measure_grid_multiplier command.
Applies to drawn lines, text, and decals.
Non-promoted players
Promoted players
Cloud folder dropdown now has a "Select Folder" button that opens the Cloud Manager folder browser. (Feedback #711)
Starred folders
Cloud search now restricts results to the current folder. (Feedback #1839)
Fix: Resolved several file browser issues and cleaned up its underlying code to improve stability.
Holding ALT while dealing or drawing from a deck will now take the card from the bottom of the deck. (Feedback #2680)
The deck will do a small “hop” animation to make it clear when this happens.
Works both with the number keys and the GUI.
Dealing hand objects will now correctly deal to your new hand if you change the table.
Custom Figurine
Added Reset Scale to an object's scale context menu. (Feedback #2078)
Hotseat player names are now remembered between sessions. (Feedback #2070)
Added vr_floor command / VR setting
fog / "Floor Of Mist". (Feedback #2173)Server browser improvements
New/updated commands:
component_hotkey_state_change
ui_notebook
text_tool_default_font_size
autorun_lua
camera_reset_on_color_change
show_name_in_server_browser
measure_grid_multiplier
Fixes:
Fixed help command not working on commands that have no arguments.
Removed old console commands related to global chat. (Feedback #2117)
Fixed a major networking issue where loading a save file could break the game state. (Feedback #2641)
Fixed rewinds and autosaves not working correctly. (Feedback #2656)
Fixed an issue where XML UI could be blocked by incorrect objects, including the invisible floor at y = 1. (Feedback #2647)
Fixed a 64-depth issue when downloading and loading mods. (Feedback #2640)
Fixed hand selection working incorrectly with the new Lua drafting mechanic.
Fixed an issue where you could erase your drawn lines incorrectly. (Feedback #2702)
Fixed several HandSelectMode issues. (Feedback #2618)
Fixed a bug in Lua Wait.collect. (Feedback #2635)
Fixed an issue where XML UI would not be blocked by objects when it should.
Fixed XML UI not hiding in hidden zones. (Feedback #2673)
Fixed partial transparency when importing UI and decal images for the first time.
Fixed advancing the turn immediately after loading a game always going to the first player instead of the second.
Fixed a macOS issue where text could be entered while the Cmd modifier key was held. (Feedback #2636)
Fixed infinite bags visually breaking after Undo or Reload. (Feedback #2665)
Fixed drop indicator not showing color when dropping with Alt + Right Click for decks and stacks.
Fixed grid size inputs not allowing you to type a . at the end.
Fixed onLoad not executing in Hot Seat Mode. (Feedback #2629)
Fixed RPG tileset snapping preview so it now displays correctly.
Fixed Flick and Combine sometimes requiring a double click when you are a client.
Fixed right click while drawing a line not canceling for everyone else. (Feedback #125)
You can now obtain the "Be Social" achievement using in-game chat. (Feedback #1895)
Fixed game crashing when trying to load a CMYK JPG.
Fixed line tool not converting to cm in component mode. (Feedback #1934)
Fixed "Showing Hand" button displaying incorrect color after seat swap.
Fixed on-screen hand blocking in-game UI. (Feedback #1757)
Fixed hotseat turn not being set to correct player on load. (Feedback #1960)
Fixed hotseat players being unable to drop cards in searched deck. (Feedback #1959)
Fixed hotseat turn incorrectly resetting when loading a Classic game.
When starting a hotseat game, the game now only picks larger tables, so all player colors are immediately selectable.
Fixed context menu not clamping to screen. (Feedback #1966)
Fixed context menu appearing in the wrong position when right-clicking a card in hand. (Feedback #2051)
Fixed unintuitive Text Tool placement behavior.
Fixed appearance of custom card aspect ratios when searching containers. (Feedback #2021)
Fixed cards merging incorrectly with a deck when the deck is on a snap point. (Feedback #2063)
Fixed left edge of search dialog not having a collider. (Feedback #2077)
Fixed Japanese language name in language select. (Feedback #2116)
Fixed shake detector triggering when the user spams Tap.
Fixed Random Domino/Card/Mahjong Tile not generating every possible object. (Feedback #2160, #2154)
Fixed rewind/forward (rwd/fwd) not working correctly. (Feedback #2161)
Fixed game breaking on first launch but working on subsequent launches.
Fixed cards getting cut off onscreen when scaling very large hands.
Fixed deleting a folder in Cloud Manager not deleting all contained files.
Fixed issues when uploading PDF files via "Upload All" in the Cloud Manager.
Fixed a bug where objects with multiple assets (primary/secondary AssetBundles) could think they finished loading too early, breaking on-screen hands, highlighting, and Lua load completion.
Fixed dice behavior when picking up and dropping instantly, so dice now roll correctly in that scenario.
Fixed VR floor setting being inverted for the vr_floor option.
New Lua functions and features for creators:
tryObjectStateChange(object, new_state_index, player_label) and object.tryStateChange(new_state_index, player_label). (Feedback #1822)tryObjectStateChange and tryStateChange to only trigger on valid state indices.Turns.getTurnOrder() which returns the current turn order, including automatic order (in automatic mode) and custom order (in custom mode).onNumberTyped and onObjectNumberTyped.obj.deal(int NumCards, string Color = Colour.SeatedLabel, int HandIndex = 1, bool DealFromBottom = false)
DealFromBottom = true (only works for decks).Automate drafting & hand selection:
chooseInHand(label, minCount, maxCount, prompt, players) -> affectedPlayerschooseInHandOrCancel(label, minCount, maxCount, prompt, players) -> affectedPlayersclearChooseInHand(players) -> affectedPlayerscurrentChooseInHand(player) -> labelonPlayerHandChoice(player_color, label, objects) → Callback triggered when a player confirms their selection.Wait.collectWait.collect(table expected_ids, on_finished, on_add = nil, on_error = nil) -> {table expected, table results, add(id, ...), reset()}.Wait.collect takes a list of expected ids and returns a collect_table:
When the task for a given id is complete, call: collect_table:add(id, ...).
collect_table.results[id] is set to the ... you passed in.on_add, it is called as: on_add(id, ...).Error handling:
add more than once for the same id and you provided on_error, it is called as: on_error(Wait.COLLECT_DUPLICATE, id, ...).add with an id that was not expected and you provided on_error, it is called as: on_error(Wait.COLLECT_UNKNOWN, id, ...).When all expected ids have been added:
on_finished(results) is called with the final results table.You can call:
collect_table:reset() to zero out call counts and clear results so you can reuse the same collector.Rewind states are stored periodically. If a store happens in the middle of a complex scripted change, you can end up with bad intermediate states. These helpers let you control when rewinds are saved. (Feedback #617)
storeRewindState(closure andThen, block_further_stores)
andThen(success, didSave).successtrue → the call completed successfully.false → a rewind state could not be stored. You should always check this before continuing.didSavetrue → a new rewind state was actually written.false → call succeeded but there was nothing new to save.block_further_stores is true and success is true, then no additional rewind states will be recorded until:storeRewindState again, orallowRewindStore(), orallowRewindStore()
Each player’s primary hand zone now has a “stash” where cards in the players hand can be stashed temporarily:
player.drawHandStash() → draws all cards from stash into hand.player.setHandStashLocation(v3 position, int rotation) → set stash position & rotation.card.moveToHandStash() → moves a card in hand into its stash.Use cases: drafting mechanics, temporary hidden piles, etc.
putObject(Obj, index). (Feedback #659)Fixed an issue with Lua GetData() involving the new Steam IDs.
Fixed JSON.encode not working correctly with Unicode. (Feedback #1263)
For issues or feedback, post them here: https://feedback.tabletopsimulator.com/
If you hit problems, attaching your Player.log helps us a lot:
%USERPROFILE%\AppData\LocalLow\Berserk Games\Tabletop Simulator\Player.log~/Library/Logs/Berserk Games\Tabletop Simulator/Player.log~/.config/unity3d/Berserk Games\Tabletop Simulator/Player.logEnable logging with /log in chat or the -log launch option.
Engine upgrades are big and tie in to every platform and a ton of unique hardware configurations. If you run into issues, please include with your report:
And again, thank you for your patience during the long gap of silence. This engine work sets us up for faster, more frequent updates going forward.
We have a big announcement coming soon - keep an eye out for around New Years!