April 8, 2021, 9:23 pm

Hey everyone it's been a while, but we have a huge patch for you guys today!

The headline feature is Tabletop Simulator now supports translations for all 29 languages supported by Steam. The game has been translated with the help of google translate but we also added support for creating your own translations and sharing them on the Workshop. Using google translate is an exciting jumping off point for a more global user friendly experience, however, recognizing google translate’s limitations we are also excited to see what native speakers in the community can come up with for the most authentic multilingual game play experience. Furthermore, the translation support is extended to all of your great mods out there. Now players can participate in the same game with different localized text or assets based on their selected language.

We've also upgraded the game's engine (everything should run smoother), added layout zones (automatically lay out cards easily), and added object tags (easily filter system interactions).

We have a bunch of other great new features, upgrades, and fixes you can read about all below.

Finally we are launching a new method for collecting user feedback and bug reports found at https://tabletopsimulator.nolt.io/. This will allow us to better connect with the community for a more fluid and streamlined feedback loop, including increased visibility into our process. The new system allows you to easily make suggestions and upvote and downvote other community member ideas in a similar style to reddit. Additionally, the community will now be able to see our progress on implementing suggestions, fixes, and new features through the roadmap tool.

Updates, Optimizations, and Cleanup

  • Updated Unity version to 2019.4 LTS.
  • Enable graphics jobs, free performance by multi-threading the rendering (benchmarked up to 25% increase in fps).
  • PhysX version upgrade gives better accuracy and performance in a variety of cases.
  • Video player is now using hardware decoding on the gpu making video textures more performant.
  • Updated tablet chromium version which now supports mp3.
  • Updated Dissonance voice chat plugin.
  • Voice chat is now working on Linux again.
  • Updated Lua Moonsharp to 2.0.
  • Lots of code refractoring and cleanup to facilitate faster updates in the future.
  • Reduced ram usage, by lower the number of variants for our custom DXT5nm Standard shader.
  • Optimized a lot of physics code to use non gc allocing functions.
  • Greatly sped up updating Workshop mods on initial load.
  • Optimized the netcode to be more performant on the cpu.

Translation

  • Added translations for most common languages using google translate. Access Language menu via the button in the bottom right of the main menu, or in the menu bar of the Configuration window.
  • Added the ability to create your own translations for the default UI and share them on the Workshop.
  • Added localization support for your text fields. This allows you to translate your mods for different languages. Example: {en}Hello {fr}Bonjour {de}Hallo
  • This also works in url fields if you need to change assets based on the language. Example: {en}url1 {fr}url2
  • Supported languages: [en]English, [zh-cn]Chinese (Simplified), [ru]Russian, [es]Spanish, [pt-br]Portuguese (Brazil), [de]German, [fr]French, [ko]Korean, [pl]Polish, [tr]Turkish, [ja]Japanese, [zh-tw]Chinese (Traditional), [th]Thai, [it]Italian, [pt]Portuguese, [cs]Czech, [hu]Hungarian, [sv]Swedish, [nl]Dutch, [es-419]Spanish (Latin America), [da]Danish, [fi]Finnish, [nb]Norwegian, [ro]Romanian, [uk]Ukrainian, [el]Greek, [vi]Vietnamese, [bg]Bulgarian, [arb] Arabic

Object Tags

New mechanics which allows objects to selectively interact with game systems. If a system (e.g. a hidden zone, a hand zone, etc.) has a tag set, then only objects which share a tag with it will interact with it.

Taggable systems:

  • Hidden zones
  • Randomize zones
  • Hand zones
  • Layout zones
  • Fog-of-War zones
  • Scripting zones
  • Snap points

Set what tags a object or system has by right-clicking it and selecting Tags from the menu. You may access all tags present at the table via the Modding->Tags window. Added Snap-Point Creation Tags window: new snap points will automatically gain whatever tags you set here.

Zones

  • Hand, Hidden, and Random zones should perform much faster and no longer slow down the game.
  • Zones now work correctly when there are multiple colliders attached to the same Object. (TODO: LayoutZone and FogOfWarZone)
  • Zones now all have a right-click context menu. Left-click will open the zone-specific menu that used to be on right-click.

Layout Zones

New Zone tool (in the zone tool popout) which allows you to automatically lay out objects (primarily cards) across the table. Deploy like any other zone, then left-click and hit the cog to change its settings. Especially useful for card games in which you lay melds on the table (like Gin) or which have trick-taking (Whist, Bridge, etc.), but can also be used to simply arrange a bunch of objects in a grid without locking them to it.

Features include:

  • Filter affected objects (face-up/down, non-cards, etc)
  • Split/Combine decks.
  • Set to Manual Only for one-off arranging.
  • Automatic sorting of objects inside groups based on Name, Description, etc.

Layout Zones can triggered by using the Layout Zone tool and left-clicking the zone then hitting the big Layout button, or by right-clicking a object inside a zone it interacts with and selecting the Layout option in its context menu. Mouse pointer shows icon indicating when you are holding an object inside a layout zone: will also show the zone's name if it has one.

Hotseat

  • Improved turn transitions.
  • Added ability to set player names.
  • End Turn button now shows current player instead.
  • Added some Misc Settings, detailed below.
  • Fixed object visibility.
  • Fixed a bunch of bugs in the Lua API relating to Hotseat mode.

General

  • Added "Order" option to contextual menu for bags (LIFO, FIFO, and Random).
  • Spawn mode now works off objects in the void.
  • Picking up objects that are teleported from out bounds now snap to the mouse nicer.
  • When cloning/spawning objects you may hold the left mouse button down and move the mouse to spawn multiple objects.
  • Buttons will now only appear on Books (i.e. PDF objects) when you hover the mouse over them. This can be disabled in Misc Settings.
  • Decks now have a Spread action in the right-click menu; spreads the cards out across the table. Distance between cards is set in Misc Settings.
  • NGUI now shows up on objects in the onscreen hand view and optimized it when alt zooming. (XML UI still doesn't work)
  • Added description to the tooltip when searching a container.
  • Workshop loading wheel above chat is always spinning now when updating.

Lua:

  • HandZones are now Objects like everything else.
  • Added Lua Hands.getHands() and get/setValue() string Color for Hands Objects.
  • Added Lua WebRequest.custom(string url, string method, bool download, string data, Dictionary<string, string> headers, Closure callbackFunction)
  • Lua getAllObjects() is now instantly updated to add or remove when an object is spawned or destroyed.
  • Added Hands class to Lua with members (bool enable, bool disable_unused, int hiding) sames as the hands menu.
  • Deck no longer populates cards with its script and script state.
  • Added tryRandomize(player_color) and tryObjectRandomize(object, player_color) for when someone tries to shuffle/roll/randomize an object. Returning false will prevent randomization.
  • Added onBlindfold(player, blindfolded) event, triggered when a player puts on or takes off blindfold.
  • Added object.alt_view_angle property: when non-zero the Alt view will use the specified Euler angle to look at the object.
  • Added object.getPositionSmooth() and object.getRotationSmooth() return the current smooth move target and null if not moving.
  • Added object.isDestroyed() returns true if an object is (or will be) destroyed.
  • Deprecated object.tag property: use object.type instead.
  • Deprecated filter... commands: now use prefix try.... e.g. tryObjectEnter.
  • Added object.memo, a string you can store info in on an object.
  • Stopped the ability to spawn Tables using spawnObject.

Added Lua Global classes Tables and Backgrounds. Tables:

  • string getTable()
  • bool setTable(string name)
  • string getCustomURL()
  • bool setCustomURL(string url)
  • Object getTableObject() Backgrounds:
  • string getBackground()
  • bool setBackground(string name)
  • string getCustomURL()
  • bool setCustomURL(string url)

Added Info global static class exposing Info menu.

  • string name
  • string type
  • string complexity
  • int[] playing_time
  • int[] number_of_players
  • List<string> tags

Added calls for working with Tags:

  • object.getTags() -> Table gets the Tags attached to an object.
  • object.setTags(Table tags) sets the Tags attached to an object.
  • object.addTag(string label) adds the Tag to the object.
  • object.removeTag(string label) removes the Tag from the object.
  • object.hasTag(string label) -> bool checks if the object has the Tag.
  • object.hasAnyTag() -> bool checks if the object has any Tags.
  • object.hasMatchingTag(other) -> bool checks if the other object has a matching Tag with this object.
  • scripting_zone.getObjects() will utilize Tags attached to the zone, unless you override with scripting_zone.getObjects(true)
  • deck.spread(distance) uses the spread action on the deck.
  • getObjectsWithTag(string tag)
  • getObjectsWithAnyTags({tag, tag...})
  • getObjectsWithAllTags({tag, tag...})

Fixes:

  • Fixed network sync bug with Xml UI by adding null check to Xml setAttribute(s) and setValue.
  • Fixed object.getSnapPoints() throwing when having no snap points.
  • Fixed loading_custom to work with custom decks and cards.
  • Fixed object.clone() sound parameter not working.
  • Fixed MusicPlayer.playlistIndex to MusicPlayer.playlist_index (old way still works).
  • Fixed Grid calls not working over network.
  • Fixed Grid.snapping not working.
  • Fixed showHotkeyConfig working over network. Added color parameter; dialog will be shown to that player.
  • Fixed onObjectRandomize and onRandomize not returning correct player colour.
  • Fixed Physics.cast not returning list in correct order.
  • Fixed Group action ignoring tryObjectEnter and tryObjectEnterContainer.

System Console

  • Added commands for options detailed in Misc Settings above.
  • Added language, language_... commands for selecting current language.
  • Added translation_export, translation_import, translation_for... commands for working on translations.
  • Added translate command to translate an English term into the current language (if TTS knows it).
  • Added hotseat_name_..., hotseat_start_turn, and hotseat_end_turn commands.
  • Added pointer_position command.
  • Added lift_height and rotation_degrees commands.
  • Added action_spread and action_layout commands.
  • Added ui_clear command to clear UI generated by other commands (e.g. ui_button)

Fixes

  • Fixed major bug when saving stuff to cache not overwriting but writing on top of and maybe deleting garbage at the end.
  • Fixed url redirect issue when trying to load assets from the web with expired certs error. (Curl error 51: Cert verify failed: UNITYTLS_X509VERIFY_FLAG_EXPIRED)
  • Fixed chat breaking and being uninteractable.
  • Fixed bug when uploading steam cloud image thumbnail for Workshop by only allowing local files.
  • Fixed being unable to click through magnify ui to pick up objects.
  • Fixed issues with states number 95 being 96.
  • Fixed rotation values not syncing on connecting client.
  • Fixed null reference when downloading old workshop files that had null width and height deck info.
  • Fixed issue when downloading a bunch of mods with the games menu open causing an insane number of threads to spawn and blow up the game.
  • Fixed bug with FogOfWarZone and child colliders not working correctly.
  • Fixed objects with Measure Movement working on clients.
  • Fixed measuring tool logging revealing hidden object info.
  • Fixed Lift Height slider not hiding when you click away from it.
  • Fixed Pan key not working while holding a object (as long as it is not on the same binding as Flip)
  • Fixed Camera Hold Rotate key not working while holding a object (as long as it is not on the same binding as Tap)