Play UNI!

Changelog · v0.6.0

UI Glow Up, 3D Table, 16 Players!

0.6 is a makeover. The table is now a 3D scene, a match can hold up to 16 players, and nearly every screen around the game got reworked to match. Read more in: “Rebuilding the game in 3D”.

The new 3D table mid-match
A 16-player Race match on the new table. The loop of arrows on the playmat shows which way play is running.

2D -> 3D

  • The whole board is now a top-down 3D scene! Opponents, your hand, both piles and the playmat are real objects on a table instead of flat page elements.
  • The layout fits any screen shape, from narrow phones to wide monitors. This was a real pain point before this update, and now you can play from anywhere!
  • A new red, green, blue and yellow palette, defined once and used everywhere: cards, the colour picker, seat colours and the victory popup. Much better, amirite?
  • Every match opens with a dealing cinematic. Each card flies to its seat and the first discard turns over. Click to skip it.
  • You can now change match preferences. Hate misclicking cards? Uncheck the click-to-play option.
  • When your hand outgrows the screen it scrolls instead of squeezing, with the end cards fading out.
  • Changing colour sends a dithered ripple across the playmat, with dust drifting over the table.
  • Play direction is shown as a loop of arrows marching around the playmat, and it got that Three.js glow-up too.
The direction loop and colour ripple
A blue reverse lands on a blue reverse, then a yellow reverse flips the loop and ripples the playmat yellow.

Cards with weight

  • Skip, reverse, +2, wild and wild +4 hit the table with a short hit-stop, a small camera punch and a flash of the card’s colour.
  • The +N draw badge pops every time the stack grows and changes colour as the debt climbs. The draw pile shakes with it.
  • Your seat pulses when it becomes your turn, then keeps a faint glow while the turn is yours.
  • Animations now come straight from the server, so cards fly where they really went instead of where the client guessed.

All of it respects the reduced motion and animation settings.

Up to 16 players

  • Hosts set the player cap per lobby, from 2 to 16, with a new slider in lobby settings.
  • Starting cards are clamped so the deck always covers everyone.
  • The lobby list shows a proportional occupancy gauge instead of one icon per seat.
  • A bar along the bottom edge of the screen drains to show how long you have left, whether it’s your turn clock or another player’s move.
  • Matches wait for every player to finish loading before the first turn clock starts.

Race mode

A new way to play: a race to empty your hand!

The Race mode lobby setting
The host chooses what share of the table wins.
  • The first players to empty their hand finish 1st, 2nd and so on, and win. Everyone else loses.
  • The host picks how many win, from 5% to 95% of the players.
  • Finished players drop out of turn order and watch (yes, spectators!). The rest are ranked by fewest cards left.

Chat and play log

The play log is something I wanted for a long time, a kind of funny commentary on what is happening in the match. This is its first release! Each joke was written in English and then machine-translated, so unfortunately they might not be as funny in other languages. Still, it adds some flair! Oh, and you can now chat during a match too. For now, mods have no way to add play log entries. That will change in the next release, as the architecture moves from client to server side.

I also added something to help first-timers: a glossary. Right-clicking or long-pressing a card shows information about that card and about anything it mentions! I hope you like the new tooltip. The old one looked like Minecraft’s, haha.

  • The chat button now stays available during a match, in the free top-right corner.
  • Chat gains a play log: skips, reverses, draw stacks, wild colour picks, and near-wins write short contextual lines.
  • Every card played shows up as a keyword you can tap to open its glossary entry.
  • Streaks escalate. Get skipped three times in a row, or watch the draw stack hit 8, and the log will notice.

Performance

  • A full load of everything but your language is roughly 0.8 MB over the wire, down from about 4.8 MB in 0.5.5. That’s around 80% less, even with a whole 3D table now in the game.
  • Assets are served compressed: Brotli where your browser supports it, gzip otherwise. Brotli takes roughly another 15-20% off the big 3D bundle.
  • Languages load on demand. English is built in, and every other language is its own ~11 kB download that only arrives when you pick it. The first screen carries roughly a third less script.
  • The animated home background no longer competes with the page. It starts loading once everything else is done, then fades in.
  • Music streams instead of downloading whole, waits until your first click or key press, and isn’t fetched at all if the music volume is 0. Sound effects at volume 0 are skipped too. That’s about 2 MB less on a first visit.
  • Every image, sound and icon now carries a content hash in its name, so your browser keeps it for a year and an update still takes effect immediately. Repeat visits are mostly served from cache.
  • Dead weight is gone from the build: about 3 MB of source art files and about 1 MB of unused 3D decoders no longer ship with the game.
  • A loading screen now appears before a match, making sure all players load in at the same time and reducing frame spikes from loading assets during gameplay.

These are rough numbers from my own browser’s network panel, not a benchmark, so treat them as ballpark.

For modders

Matches now run on a data-driven engine. Cards, decks and rules are content that the server assembles, instead of the previous compiled behaviour. In future versions, I’ll be opening up the ability for users to create their own experiences, a few capabilities at a time, to see what works and what does not. Hopefully, by v1.0, there will be a fully working mod/rule-set workshop!

Security

I fixed A LOT of security bugs and, more generally, bugs that let a single malformed JSON or WS message crash the entire server. Each release hardens the server a little more, which is always a plus!

  • WebSocket connections from unlisted origins are rejected.
  • The server refuses to start with weak or missing secrets.
  • Responses now carry stricter browser security headers.
  • Direct messages are encrypted and tied to their sender and recipient, and the server now runs with fewer privileges.

Known issues

  • Mods can’t write their own play-log lines yet, so modded cards show up without a reaction.
  • The profile screen is rough and still waiting for its own makeover.
  • Past four seats, player colours repeat in red, green, blue, yellow order. A proper profile colour is planned!
← All versions