Allow players to select multiple characters

Feature proposal: players could select multiple characters/profiles for the upcoming round, and the round start code could consider all those characters when assigning jobs/roles, and then ensure that each player ended up with only one character actually spawned.

I am willing to take a stab at coding this, though it may take me a while to get to all the pieces of it and actually get a PR ready.

Context: I have been playing on a very small private server with a high concentration of new players. Many of the players have multiple characters and only play specific jobs on specific characters for RP reasons. This means we have fairly high odds of there being important jobs where no one was planning to bring a character that they play that job on. To manage this, one of our admins has been setting up job assignments in advance with a spreadsheet. I would like to see the game able to handle this better without someone doing extra work.

Ideally this would also lead to more varied rounds on servers of all sizes due to there being more candidates for jobs.

I’ve been looking at the job assignment code and talking to players who are more familiar with the game, and I know this would involve at least the following:

  • UI changes in the character setup window to allow a player to select multiple characters
  • Changing the character preview on the lobby screen so it can show multiple characters
  • Considering multiple characters per player during nukie selection
  • Considering multiple characters per player during normal round start job assignment
  • Handling players having multiple characters selected when joining mid-round
  • Ensuring that having multiple characters selected does not allow a player to be considered at high priority for multiple jobs
  • Selecting a valid character for each player after they have been assigned a job

For ensuring players aren’t considered at high priority for multiple jobs, I think it would be simplest to randomly choose one selected character for each player and give that character normal high priority treatment for the round. That character’s high priority job would be treated as high priority for the player; their other characters’ high priority jobs would be treated as medium priority for the player for job selection purposes.

For selecting a valid character, if the player has multiple characters that are suitable for their assigned job, I think a weighted random selection would work well. For instance, if they have one character with high priority for the selected job and one with medium priority for it, the game could have higher odds of choosing the high priority character than the medium priority one, but still non-zero odds of choosing the medium priority character.

I couldn’t find any issues or PRs for this concept on the GitHub, but it is certainly possible my search skills failed me.

4 Likes

I have been looking at related code a little more and can add the preferences storage in the database to the list of things that would require changes.

i like that idea of this. I have a character called Dr Floop Gloob who i’d like to play more and would be my first choice when picking medical however I rarely play them as most of the time Im playing my main character who has prefrences based on what I enjoy or what im in the mood for. as an alterative I could suggest the game could say you’ve been assigned X role, select your character. allowing you to pick without messing around with more menu work.

1 Like

I LOVE the idea of this! I have about 13 characters, and swapping between them 15 seconds before a round starts is always annoying, especially because they all only have 1 department connected to them I also think it would look really cool on the UI, and i’d love to see what it would look like.

1 Like

I appreciate the suggestion, it’s not something I’d thought of.

I think a prompt for selecting your character after role assignment might end up being nearly as much work, though. And just at round start seems like a slightly awkward time for a prompt.

Also, there’d still need to be some way for players to configure what roles they are willing to play in the upcoming round. If they weren’t doing it through the existing character jobs UI then there’d need to be new or changed UI for it.

On the other hand, if people would prefer it to multiple character selection, it’s certainly worth considering.

And manual character selection is probably a good option for people joining mid-round, they’re already doing manual job selection.

+1 to this, I’d like to use one character for certain roles and another character for different roles etc etc.

Another addition to the list of things required, since this seems to be where I’m keeping it at the moment:

  • Either players need to be prevented from ever having no characters selected, or the game needs to handle players with no characters selected, for instance by not letting them mark themselves ready.

Haven’t looked into what it would take code-wise but this exact feature is something that has passed my thoughts before so ill just drop my ideas here.

Functionality wise i can see a couple of ways to actually implement it along these lines.
I believe it would need to be implemented along the lines of assigning jobs based on the combined highest preferences across all “active” characters in such a way where having one character with say medium in both CE and HoS is, for the purpose of job assignment, functionally identical to having one character with medium in CE only and a second character with medium in HoS only.
Once the players job has been assigned i do agree that it would probably be best to either use a weighted random selection or to just pick the active character with the highest preference, random if there is multiple of the same preference.

The way i have imagined the feature as is essentially just the job preference system but for characters. Taking the never-low-medium-high job preference system and allowing the player to not just set it for the individual jobs on each character but also implement an overall character preference system.

As an example of what i’m thinking of i spent way to long in paint on the following mockup:

The way i was thinking it could function was by having low and medium character preferences be “modifiers” to the job preferences of the characters during job assignment.
Essentially medium preference characters would be treated as if their job preferences are set one “level” lower than actuality. I.E. during job assignment high becomes medium, medium becomes low and low becomes never.
And low preference characters would be treated as two “levels” lower with their high job preference being the equivalent of a normal characters low job preference.
This would then also have the restrictions of only one character with high preference which would also indirectly solve the potential problem of multiple jobs at high preferences.

Then again this might just be a little bit of an overcomplicated way to implement it.
An alternate i came up with would be to simplify it down to just primary, secondary and inactive characters.

The idea here is moreso to avoid having the server be the one that gets to picks which one of the players active characters high preferences counts as high instead of the player.
Essentially, instead of doing some potentially overcomplicated mess like my previous ramblings it would just be a simple; from all active character get the highest preferences of each job.
If the highest preference is high and its the primary character keep it at high while if it is a secondary character treat it as if it was set to medium.
Then once the combined preferences of all jobs across all active characters have been collected start assigning jobs.
Then once the jobs have been assigned to the players select one of the players active characters with a preference higher than “never” according to weighted random or something and assign them that character in their assigned job.

And that’s about it for my thoughts. There’s probably details i missed but its starting to get late so ill leave it here.

Different character priorities seem like they’d be reasonably simple to implement, aside from UI, but also more mental overhead for players.

I would also worry that downgrading all the preferences for the lower priority characters might unbalance the selection in favour of the high priority character too much. But balancing that is separate from designing the UI.

My current vague UI thought is to add an edit button to each character above the delete button, and then have the main button work as select/deselect, similar to loadout menus where you can choose multiple things.

In terms of other options to let the player pick which character gets the high priority, I think the simplest UI might be to make the character list re-orderable, and have the job assignment code go from top to bottom looking for the first selected character with a job set to high priority.

But then I’d have to add the ability to re-order the character list, and at this point I haven’t really been playing long enough to know if the game even has any kind of re-orderable list UI. If it does I don’t think I’ve run into it, or if I did I didn’t realize it was re-orderable.

It has been suggested before and might be simpler to just unlink role (and probably, antag) selection from characters.

Simplest way to implement this would be to keep how preround currently works, but upon roundstart there would be a briefpause where the game tells each player what job they got, and then they could pick a different character to play as this job if they want

1 Like

Can you point me to where it’s been suggested before? I’d like to see the discussion, but my search skills have failed me on this.

That would be a much simpler implementation. It seems to me like it would feel a bit awkward as a player, but perhaps I’m just too used to how things currently work.

Could keep the jobs linked to characters just for the sake of filtering this choice.
If you have 5 characters, and 2 of them have barkeep, it’ll only ask you which of those two you want to play if you get barkeep.

Replying to myself for the sake of any lurkers: looks like discussion of this and similar concepts has happened in the discord several times

Discord search has, somehow, turned out to be the correct way to find relevant discussions on GitHub.

Design doc for multi character slot system has a discussion of this concept.

Characters should roll after role selection is the follow up issue.

And then there was more discussion around Draft: Character selection UI redesign, primarily on the Discord.

I have now read more of the past discussions, and will attempt to summarize them here since they’re a bit spread out. I will put my own thoughts in a follow-up post.

Roles vs characters

There is general agreement that job selection should be separate from character selection, and job selection should happen first. The open issue says that “Once [job selection] is done then you should be able to pick which character you want to play.”

The comment that appears to have first proposed this suggested the dialog could have a countdown at the bottom, eg “YOUR ASSIGNMENT WILL BE REVOKED IN: 30 SECONDS”

Having the game pick your character automatically after job selection based on your job/character settings has been suggested several times but isn’t included in the current open issue.

The character selection UI draft seems to be largely focused on supporting job-based automatic character selection.

Character-affecting roles

Some roles are not very compatible with standard character profiles. For instance, clowns should have clown-ish names, borgs should have borg-ish names, and nukies should arguably not be last shift’s captain.

Adding new character types for these was proposed in the multi character slot system design doc. There seemed to be multiple people who liked this approach. However, in regards to clown/mime names in the current open issue, the issue creator says “That just requires adding a field to the RoleLoadout entry for that role which is separate and much easier.”

The UI design draft mentions the possibility of letting players choose to have a random character generated at round start for such roles.

Antags

The open issue seems to suggest moving all antagonist rolls to round start, but that may just be unclear wording. One comment mentions wanting this to enable players to have “antag only” characters; other comments are opposed to that for metagaming reasons.

Loadouts

Currently loadouts are per-character per-job. One comment in the design doc conversation suggested adding fallback loadouts. I think this is currently abandoned with the rest of that doc.

Current status

The open issue isn’t assigned to anyone but I don’t know enough about the dev process here to know if that definitely means no one’s working on it.

My thoughts: I don’t really like the idea of having to select a character manually at round start. It feels to me like some kind of job/character preferences would enable decent automatic character selection, and doing it automatically would speed up round start and prevent misclicks.

However, I do think a character selection dialog is a good option for people who like that sort of manual control. I also think moving character selection to such a dialog now wouldn’t rule out making an optional automatic character selection system later. This does probably mean discarding people’s current per character job preferences when the dialog is implemented, but that’s probably fine.

I do think having a countdown on such a dialog and delaying round start until everyone has selected a character or timed out would be good, since it seems simpler than dealing with all players spawning in at different times.

I think it makes sense to not worry about potential new character types or alternate names for roles like clown and borg right now. Regardless of what approach is chosen, it doesn’t need to be tied to this. A “new random character” button on the character selection dialog might be an interesting feature, and wouldn’t need to be role specific, but is probably out of scope for the initial implementation.

It might be good to have some kind of antag settings override on the character selection dialog, or perhaps in character profiles, for the benefit of players who have some characters that they do not want to be antagonists ever. This would accomodate them without requiring antagonist rolling to happen during round start. It would not allow for “antag only” characters, which is probably for the best. It sounds to me like the benefits of rolling antagonists after round start likely outweigh the benefits of letting people know if they’ll be an antagonist before they select their character.

I think loadouts should still be per-character per-job. I am not sure whether any kind of fallback loadout would be very useful. I think probably it’s out of scope for this.

For possible future automatic character selection, I agree that making a good UI seems difficult. One possibility might be to have a jobs setup screen where each job has a character list, but also continue to have a list of jobs in the character editor, and have changes in either reflected in both. But that is a future problem for future people to worry about; I am only including it here in hopes that I don’t forget about it if it ever becomes relevant.

TL;DR: I’m convinced, game should have a character selection dialog.

Yapped at Absotively about this on discord, said I would post here too for the sake of not having the conversation spread out across half a dozen spaces (crazy): I am fully in support of this as a feature, with the caveat that I do not think a character selection prompt post-job rolling would work given how nukies are rolled.

Since they are rolled as roundstart “jobs,” they would presumably be subject to the same timing out as other roles per this proposal. This means that players can and will either purposefully or accidentally let the timer run out, leaving Nukies short a body or bodies that cannot be replaced. While folks are always technically capable of going SSD after rolling nukie, for whatever reason, abandoning your role by doing so is generally noted by admins. The role timing out removes that safeguard. Additionally, if a player then elects to join the game on a different job, they now have meta knowledge about it being a nukie round, which regardless of player intent will influence their gameplay.

A few more thoughts:

  • If a player lets the timer expire, they could be spawned in with a random character. This has been suggested before; a friend pointed it out in a private discord. This would perhaps fix the nukies issue, but of course it would have other downsides.
  • There should probably be import/export support for the new global job preferences that will replace the per-character job preferences.
  • I think this is starting to move beyond the idea guys/feature requests stage and the discussion should probably go elsewhere, but I’m not sure where. The open GitHub issue? The discord? A different part of the forum?
1 Like

Also just to be very clear: I do still intend to attempt to code this, assuming it’s not already being worked on by someone else.