I've released my online multiplayer mod for Nuclear Throne just a bit over two weeks ago. That was interesting. I had since received a plenty of feedback, bug reports, and feature requests. Today I've released what can be considered a major public update, and this is a
small average-sized post about interesting things in it.
Character-specific "ultra mutations"
Original game and the initial release of NTT would only offer a choice of two coop-specific "ultra mutations" (character-specific effects picked upon reaching the maximum level in the game) when playing in 2P mode. This is largely due to fact that the original game has these implemented roughly as following (pseudocode):
if (player's race number is X) and (Ultra Mutation number is Y) then (Apply effect)
That's an alright thing to do for a single-player game - when the player picks an UM, you just set the global variable to 1\2\3, and that's it.
However, with multiple players, this approach presents a bit of a trouble - firstly, you can't check if the player's race index is equal to a value, because there are multiple players. And you can't check the number either, because the players would probably want to pick different UMs if they are playing with different characters.
Solution is relatively simple - status of whether the player(s) have a particular UM is now stored in a 2-dimensional array, so the above pseudocode becomes
if (UM obtained[X, Y]) then (Apply effect)
And then there's a small helper function which counts how many characters of a particular kind there are to scale effects accordingly.
Of course, the largest amount of time was spent on deciding how every UM should work with multiple players, but that's a less interesting story full of tough decisions. In the end, character-specific UMs were made to apply only to character(s) of the given race, while the global\passive UMs would apply to everyone.
While this removes a couple of potentially funny combinations, this is about as balanced as it gets.
While seeking through bits of the game related to this, I was also able to revisit how particular abilities work with multiple players, and whether they can\should "stack". So with two "Eyes" characters you can pull enemies even faster, with 2x "Rebel" you can have some ridiculous quantities of allies, and with 2x "Horror" and some planning you can have your very own giant annihilation beam (pictured).
As you may know, conventional game streaming can be hardware and network intensive, since the computer has to record, compress, and transmit a video in realtime. It's not always that you have a computer and an internet connection capable of streaming a game in decent quality.
Spectating is a pleasant alternative - since it uses a similar approach to replays (replicating actions by storing player inputs for each frame), the amount of bandwidth used is minimal (~1KB/second per viewer), and so is the resource usage.
Aside of obvious uses, this also allows for a curious workaround - if you need to stream the game, but cannot do so for technical reasons, you can have a trusted person spectate your session and do the actual video stream of that.
With a bit of technical knowledge (running multiple Steam + game instances via Sandboxie), this can also be used to provide commentary during tournaments on multiple player's views with minimum latency and technical requirements for players.
Overall this is an interesting feature and I'm curious to see what people will do with it.
Fixes and extras
Finally, there's a whole bucket of various smaller fixes, tweaks, and additions.
There's ~80 of these in total so I'll cover a few interesting ones.
"chat bubble" now appears above the players while they are typing. This is a pretty small additions, but regardless useful, as it allows to tell whether the player is trying to say something or they are just waiting for you to proceed.
Non-keyboard controls now also work while chatting, so getting hit by small melee enemies while typing should be less of a problem now.
(mouseover to view GIF)
Another small-but-noticeable tweak is to how weapon pickups work.
"Vanilla" Nuclear Throne would display names of each weapon in ~16px proximity. This is generally okay, but, on a few occasions, multiple weapons may be found lying close enough to mash their captions into a curious pile of symbols. The matter of which weapon you would pick up on such occasion is an even more curious one and dependent on weapon's creation order.
NTT now only displays the name of the weapon that is the nearest to you, and pressing the button will always pick up only that exact weapon.
Combined with a slightly-smarter algorithm for pushing weapons away from each other, this makes it easier to look through any piles of these and pick what is intended.
You can now also play as Y.C. (Yung Cuz) as a second alternative skin to Y.V.
For those unfamiliar, Y.C. is a secret in NT, which makes a brief appearance as an NPC, earnt some popularity with the public, and apparently was being considered to be made a secret playable character.
Unfortunately, for unknown reason(s), the idea of playable character was ultimately scrapped, despite the game assets containing a full set of artwork and audio files for the character.
With little to no data known on what the character's abilities should have been, any implementation would have been a speculation at best, so this is likely the best possible option.
As per usual, there's also a plenty of bugfixes for various issues found.
You can download the update (and/or support mod' development) via ThroneButt or itch.io.