There have been several discussions in the past about HP precision. To briefly summarize those threads, older Pokemon games (not sure what happens in 6, 7, and 8) have an HP bar that is 48 pixels wide. The number of pixels in this bar is the only information you get about how much HP a Pokemon has and how much HP has changed.
I was playing through Pokemon Crystal a few days ago, and it reminded me of something I had forgotten about with regards to HP bar animation -- the more HP a Pokemon has, the longer it takes to animate them losing that HP. This is the case in generations 2, 3, and 4. It does not appear to happen in generation 1, 5, 6, 7, or 8. If a Pokemon has 48 or fewer HP, it animates per pixel (and thus you cannot tell any information beyond what 48ths give you). If a Pokemon has 49 or greater HP, it animates per HP point lost, at a rate of approximately 5 ms per HP. This means that losing 100 HP would take 5.02 seconds, but losing 101 HP would take 5.07 seconds.
Humans probably cannot determine this number down to exact HP precision in most cases, but might be able to distinguish 100 HP vs. 105 HP, for example. The exact point where it becomes distinguishable depends on the person and how they are feeling at that moment in time. In general, though, a person could also point a camera at their screen that will tell them exactly how much HP was lost. Furthermore, if I were to port Technical Machine to the real world, it would do exactly that.
This means that it is possible, at least in theory, for a player to determine exactly how much HP a Pokemon has lost or gained for any high-level Pokemon. They are also told at exactly which HP values the bar changes to 47, 46, etc. out of 48 (because the HP bar is animated). I suspect this means that any Pokemon that has lost at least 4-8% or so its health can have its exact maximum HP determined. This can give away information like whether Raikou has Hidden Power Grass, Hidden Power Water, or Hidden Power Ice / no Hidden Power in Generation 2, because those change its HP DV by a fairly large amount.
Normally I would just post this as a regular bug report, but given the history of the issue, I figured I should post it here instead.
Note that Pokemon Showdown currently sends all HP values as a value out of 100 for opponent Pokemon for these older generations (at least for most formats? Some of the old threads claim there are other formats that give you "/48" HP).
Given the history of discussing this issue, I figured I should also make one important point. There are two components to HP precision. The first component is the policy issue: what information should the server send to the client? The second component is the UI issue: how should the client display this information to the user?
The client can choose to do whatever it wants, and there is no policy decision we can make to affect that. If we decide to send exact HP changes and all values that correspond to a new "/48" value, the client can choose to ignore all of that information and still report HP % (just that certain % values will never be reported). I, as the author of a different client, can choose to use that information in a different way, because "my users" may have goals that are not the same as the default values for the default client. The client could also have a setting that defaults to display % (as calculated from the underlying available information), but users can change it to give them more information, displayed in some user-friendly way as determined by the front-end developers. Or the server can continue to send "/100" HP values, and the client can display it as a %. In that case, the client could even be really silly and display it as "/48" if it wanted. My point is that the way we display the information is entirely a question of what people want to see, but the information we send is a bit more far reaching.
I was playing through Pokemon Crystal a few days ago, and it reminded me of something I had forgotten about with regards to HP bar animation -- the more HP a Pokemon has, the longer it takes to animate them losing that HP. This is the case in generations 2, 3, and 4. It does not appear to happen in generation 1, 5, 6, 7, or 8. If a Pokemon has 48 or fewer HP, it animates per pixel (and thus you cannot tell any information beyond what 48ths give you). If a Pokemon has 49 or greater HP, it animates per HP point lost, at a rate of approximately 5 ms per HP. This means that losing 100 HP would take 5.02 seconds, but losing 101 HP would take 5.07 seconds.
Humans probably cannot determine this number down to exact HP precision in most cases, but might be able to distinguish 100 HP vs. 105 HP, for example. The exact point where it becomes distinguishable depends on the person and how they are feeling at that moment in time. In general, though, a person could also point a camera at their screen that will tell them exactly how much HP was lost. Furthermore, if I were to port Technical Machine to the real world, it would do exactly that.
This means that it is possible, at least in theory, for a player to determine exactly how much HP a Pokemon has lost or gained for any high-level Pokemon. They are also told at exactly which HP values the bar changes to 47, 46, etc. out of 48 (because the HP bar is animated). I suspect this means that any Pokemon that has lost at least 4-8% or so its health can have its exact maximum HP determined. This can give away information like whether Raikou has Hidden Power Grass, Hidden Power Water, or Hidden Power Ice / no Hidden Power in Generation 2, because those change its HP DV by a fairly large amount.
Normally I would just post this as a regular bug report, but given the history of the issue, I figured I should post it here instead.
Note that Pokemon Showdown currently sends all HP values as a value out of 100 for opponent Pokemon for these older generations (at least for most formats? Some of the old threads claim there are other formats that give you "/48" HP).
Given the history of discussing this issue, I figured I should also make one important point. There are two components to HP precision. The first component is the policy issue: what information should the server send to the client? The second component is the UI issue: how should the client display this information to the user?
The client can choose to do whatever it wants, and there is no policy decision we can make to affect that. If we decide to send exact HP changes and all values that correspond to a new "/48" value, the client can choose to ignore all of that information and still report HP % (just that certain % values will never be reported). I, as the author of a different client, can choose to use that information in a different way, because "my users" may have goals that are not the same as the default values for the default client. The client could also have a setting that defaults to display % (as calculated from the underlying available information), but users can change it to give them more information, displayed in some user-friendly way as determined by the front-end developers. Or the server can continue to send "/100" HP values, and the client can display it as a %. In that case, the client could even be really silly and display it as "/48" if it wanted. My point is that the way we display the information is entirely a question of what people want to see, but the information we send is a bit more far reaching.