In certain cases, a spread move that KOed an opponent would send an
incorrect message which could crash the client. This fixes that while
also simplifying the code.
Sometimes when the server gets killed, the TCP closing handshake on
sockets currently open never actually gets completed, screwing with
things like bots that don't implement keepalive/timeouts of any kind.
Global types are defined differently for `.ts` files than for `.js`
files, leading to some confusion for past refactors.
This commit defines them correctly.
I'm also considering making certain global types only available under
namespaces, but I don't want to do that to `User` or `Room`, so for
now, there are no changes there, besides putting streams in the
`Streams` namespace (so `WriteStream` is now `Streams.WriteStream`).
Created distinctions between:
Role Cop and Role Cop (Classic)
Red Goo and Red Goo (Cracking Idea)
Neapolitan and Vanilla Cop
Also clarified some roles and standardized how Idea Variant roles are listed.
Added a distinction between Silencer and Silencer (Greater Idea) and between Grey Goo and Grey Goo (Cracking Idea). Also added the (xxx Idea) tag to the roles in their respective ideas.
Added:
- nate-dueldisk
- rosa-dueldisk
- bianca-pwt
We only had dueldisk versions before, so they've been swapped for their
regular avatars (previously, `nate` was the duel disk version, now, it's
the normal version, and `nate-dueldisk` is the duel disk version).
In addition, wally-gen7 has been removed - it was a duplicate of the
normal wally.
- Ensure the first card of the dealer is on the top of the turnlog
- Don't allow people to use the command to start the game if the game has already started
- Use user names instead of user ids in the initial playerlist for join messages
- Modlog conditionally if the game was ended forcibly or not