smogon / pokemon-showdown

Pokémon battle simulator.
https://pokemonshowdown.com
MIT License
4.79k stars 2.8k forks source link

Add the ability to search for 'unranked' ladder battles in all formats #5648

Open scheibo opened 5 years ago

scheibo commented 5 years ago

There is an issue affecting gamers called "Ladder anxiety". While it's kinda unheard of in the competitive community of Pokémon, I am positive there is a minority of players that should be affected by it. Casual, unranked, formats are an accessible workaround for it.

That's why many games offer an unranked experience. However, there are different approaches to it. For example, in Starcraft 2 both Ranked and Unranked players go into the same matchmaking pool, and their MMR values do get updated. The only difference is that there is no way in which Unranked players can view their rating.

IMO we can effectively replace the current system of randbats' split ladders with the Starcraft's approach. Then, players could opt-in to unranked mode through a checkbox in the battle search menu, just like it's (planned?) to add a similar checkbox for "Search muted".

Originally posted by @Slayer95 in https://github.com/Zarel/Pokemon-Showdown/pull/5623#issuecomment-512648118

In the UI this can be implemented with a checkbox, and on the server this seems like it would basically just the be the same as generating an '(unranked) Foo' shadow alt for user Foo.

Some concerns: 1) Unranked account could be used for ladder boosting (unranked users more likely to be willing to forfeit to benefit ranked players with less penalty) 2) How does this work with the rating tooltip and reporting ratings in the logs? (https://github.com/Zarel/Pokemon-Showdown-Client/issues/1330). Additionally, rating is 'leaked' through 'Watch a Battle'

Forum Suggestion: https://www.smogon.com/forums/threads/find-unrated-battles.3652400/

Zarel commented 5 years ago

I was considering a thing where unranked accounts are capped at a rating of 1200 or something.

Zarel commented 5 years ago

Rating is also leaked through how much your opponent gains in rating (can be put into the Elo formula to solve for opponent's rating). I'm not sure if that's something we should worry about.

Zarel commented 5 years ago

We could just make all their ratings 1000 for the purpose of rating updates, but that would be bad for the players who got matched with them.

Slayer95 commented 5 years ago

We could just make all their ratings 1000 for the purpose of rating updates, but that would be bad for the players who got matched with them.

No need to tinker with the rating values. Just forcing a low K-factor (volatility) for unrated vs rated battles should do the job. We also have the ladder logs as a countermeasure anyway, right? That would handle intentional forfeits, which are the issue at hand. Do expect more forfeits from unrated players, though, but in the end that factors into their actual rating.

Rating is also leaked through how much your opponent gains in rating (can be put into the Elo formula to solve for opponent's rating). I'm not sure if that's something we should worry about.

It should be possible to hide the identity of the (rated) opponents of an unrated player client-side. (Moderators could still handle issues by joining the battle and checking their name themselves.)

reporting ratings in the logs

Hiding the ratings client-side should be enough. It's not like this is a critical feature or anything to go out of our way for a complex (|split|) server-side implementation.

Slayer95 commented 5 years ago

Also, the way to go for this would be to mimick this, right?

having separate usernames for the ranked and unranked modes.

We could have a user ID namespace unrated_${userid} in the ladder tables.

(I was considering having separate ladder tables to support fast periodic resets of unrated accounts, but looking at the code it seems that doing so would require a rewrite of rating updates, to fetch & edit data from multiple tables at once.)

Zarel commented 5 years ago

@scheibo in https://github.com/Zarel/Pokemon-Showdown/issues/5646#issuecomment-515593278

And is #5648 approved?

I might as well answer here: There are a lot of complexities in implementation which have yet to be hashed out, but I support the idea of unranked laddering being possible in any format, and for unranked and ranked users to be matched with each other.

scheibo commented 5 years ago

OK, lets hash them out?

What concerns do you have if we:

1) use a separate ID namespace 2) hide ratings for the unrated player clientside 3) potentially cap unrated rating to avoid boosting?

What else is necessary to make this work?

Zarel commented 5 years ago

Separate ID namespace

sgtm

Hide ratings for unrated player

So spectators and the opponent would see the rating update? I'm not a huge fan of this, it defeats the reason why I want to ladder unrated (not having to worry about my own rating because no one knows it).

potentially cap unrated rating to avoid boosting?

sgtm

Are the battles considered rated or unrated if one player is rated and one is unrated? How should its rating be reported in the battle list (currently it's "lower of the two ratings")?

Zarel commented 5 years ago

Oh, Slayer95 said some more words about hiding the rated player's identity from the unrated player. I would probably prefer the other way around?

scheibo commented 5 years ago

Oh, i missed the hiding the identity bit. But why would you want the other way around? Then the unrated player would be able to detect their approx rating based on who they get matched with?

So spectators and the opponent would see the rating update? I'm not a huge fan of this, it defeats the reason why I want to ladder unrated (not having to worry about my own rating because no one knows it).

Whats the alternative? As you say yourself "but [displaying a misleading ratings update] would be bad for the players who got matched with them."

Are the battles considered rated or unrated if one player is rated and one is unrated? How should its rating be reported in the battle list (currently it's "lower of the two ratings")?

I think if any is unrated the battle needs to be considered unrated (not showing ratings in watch a battle, no identities?). Though this seems soboptimal for the rated player and specs? @Slayer95 , thoughts here?

Slayer95 commented 5 years ago

Oh, Slayer95 said some more words about hiding the rated player's identity from the unrated player. I would probably prefer the other way around?

So, what about double-blinding instead? Note also that starting from the moment in which a rated player gets matched with an unrated player, they can estimate their opponent's rating as their own, though limiting the knowledge to an "estimate" as opposed to the "actual" value might be what you look for.

So spectators and the opponent would see the rating update?

We can hide rating updates from spectators and opponents in every battle altogether. I don't think we would lose anything with that -assuming that replays still show a global MMR for the battle.

I think if any is unrated the battle needs to be considered unrated (not showing ratings in watch a battle, no identities?). Though this seems soboptimal for the rated player and specs?

That's sound, although extreme. There are some bullet points I have to add:

From these, and based on the principle of "partial knowledge" aforementioned, I'd argue it would be viable to use a different approach to "hidden" ratings, regarding 2nd/3rd parties. So, while the unrated player would still be oblivious to their rating value, their opponent and spectators would be shown a very rough estimate, by rounding to the nearest multiple of 100 or 200. That's also what would be fed to the battle MMR calculator and shown in the "Watch battle" list.

So, to summarize:

Zarel commented 5 years ago

I feel like we have very different use-cases for unrated battles. For me, it's because I don't want to worry about other people knowing my rating. Showing it to spectators would kind of ruin the purpose.

It seems like maybe the best way to preserve this is to have the unrated players stay at rating 1000? Or just get matched randomly?

Slayer95 commented 5 years ago

I don't consider what the spectators get to know as a critical component of this. That's why I list letting them know [identities and MMR estimate] as part of my proposals

However, if it is critical to you, it's fine by me to fully hide anything required. "Watch battle" would be an issue, though. Would we then just filter unrated battles out?

Zarel commented 5 years ago

Yes. We might actually also design it so unrated battles are only matched with rated battles as a last resort, so it comes up rarely enough that people don't mind?

Slayer95 commented 5 years ago

Sure. If that results in high wait times, however, matchmakingOK() could simply have a p chance to return false in Rated vs Unrated.

Slayer95 commented 5 years ago

Regarding matchmaking with random opponents, as well as capping MMR.

If the unrated player keeps track of their winrate with whatever means, that would allow them to estimate their GXE or WCAO as their WR, which would no longer gravitate towards 50%. Not fond of those ideas.

Zarel commented 5 years ago

I would also match any two unrated players with each other, regardless of rating, over matching an unrated player with a rated player.