chaos Posted January 1, 2021 Report Posted January 1, 2021 We know for certain that, in the game, each player has a base value between 0-6 for each of their skill attributes (weight is a number given in a 0-15 scale). But, as many of you have noticed, there will be games where a player feels "off" or "hot". That is because the game adds some "bonuses" to these base values, to give them and the team a more "realistic" feel. I was looking at the game code to see if I could minimize them, when I came across some new findings. Some of these topics have already been covered in other threads, but I'll rehash them quickly. Special thanks to @smozoma and @kingraph for their help with this. Before we go over bonuses, I want to cover how the game uses the player attributes: Weight (Wgt) - Used to determine who wins a check. It also has an affect on how fast a player can get up to speed. Agility (Agl) - Think of this as acceleration. A higher number means the player reaches top speed sooner. This may also have an effect on the turning ability. Speed (Spd) - Think of this as the top speed of a player when skating. Offensive Awareness (OfA) - We aren't sure of the awarenesses completely, but smoz thinks it's related to how large of a radius a player can "see". If the puck is in this area, the player will go for the puck. Also, it seems to determine where the player sets up in the offensive zone. Defensive Awareness (DfA) - See above, but setting up in the defensive zone. These two seem to feed off each other. If the ratio is close to 1 (like 4/4 awareness), they don't seem to excel in one awareness or the other. Shot Power (ShP) - Puck velocity from a shot, and also possibly how fast a player releases the puck. Shot Accuracy (ShA) - How accurate the shot is. Stick Handling (StH) - Ability to receive a pass. Ability to keep a puck during an attempt to take it from you or take it from the puck handler. Ability to resist a check. Ability to retrieve a loose puck. Passing (Pas) - Pass speed. Higher the rating, faster the pass. Roughness (Rgh) - Smoz I believe figured out this is Pass/Shot Bias for CPU players. The higher the number, the more they shoot instead of passing. This is not displayed in game, and the "Roughness" label is not really correct. This is a holdover from when the attributes were first found in the game when poking around the ROM. It was originally believed to be used for fighting. I will use Roughness here for "backwards compatibility". Endurance (End) - Stamina, effective when using line changes. Aggression (Agr) - Used to determine if a hit will be a penalty. The higher the Agr, the more likely the player will receive a penalty. Checking (Chk) - This seems to determine how often a CPU player initiates a check. Handedness (Hnd) and Fighting (Fgt) - If the number is even, the player is L, if it is odd, the player is R. The rest of the value is a fighting value, which seems to be used to determine if there will be an injury, and the extent of the injury (period/game). The above are rated on a scale of 0-6 (except for Weight and Fighting, which is 0-15). What you see in the edit lines is not entirely true (this is even with smozROMs edit lines fix). The base attributes are as follows: 0 = 25 1 = 34 2 = 43 3 = 54 (3 * 18) 4 = 72 (4 * 18) 5 = 90 (5 * 18) 6 = 108 (6 * 18) (displayed as 99 on Genesis, and 100 on SNES in the Team Roster/Edit Lines pages) Weight Ratings (in lbs.): 1 = 148 2 = 156 3 = 164 4 = 172 5 = 180 6 = 188 7 = 196 8 = 204 9 = 212 10 = 220 11 = 228 12 = 236 13 = 244 14 = 252 These are displayed values, but not the values used by the game. So while these values may have some meaning to you, there's really MUCH less variation than you think. The game takes the 0-6 value, multiplies it by 5, and stores that value. The max value any attribute, regardless of any added bonuses, is 30 (or 1E in Hex). So, a player with a 6 rating at an attribute, can never be hotter (6 * 5 = 30, the max), but they can be colder. Also, a player with a 0 rating on an attribute, cannot be colder, only hotter. After this calculation, the In-Game Bonuses are added. NOTE: Awareness values are calculated in-game much differently. While all other attributes, the higher the in-game value, the better, the Awareness works opposite (the lower the in-game value the better). Don't think about this now, I will show more later. For an example, we will use Jeremy Roenick's Shot Accuracy. It is a default 5 value. His rated value is 90, but his in-game value is 5 * 5 = 25. NOTE: These were tested with Genesis, but I'm guessing it's the same for SNES. In-Game Bonuses: The game does a check every faceoff, and applies these bonuses as needed to the on-ice players only. Hot/Cold Bonus - A single random bonus is applied to EVERY attribute (except Weight and Fighting). This is a bug, as the game actually generates a random bonus for EACH of a player's attribute, to make it more "variable", but ends up only using the first value for all the attributes. @smozomacovers this in his smozROM hack, which can fix this bug, or remove the random bonus entirely. The bonus is a -3 to a +2 bonus on the IN GAME VALUE. Ex: Jeremy Roenick has a 5 for Shot Accuracy. His default in game value (before bonuses) is 5 * 5 = 25. This game, his hot/cold bonus is -2. So, this changes his ShA to 25 - 2 = 23. You can also think of it as he now has a 4.6 ShA instead of a 5 (each point of bonus = 0.2). From a ratings standpoint, this would vary the base rating from -9 to +8 (in-game values of -3 - +2). I will go over the ratings screen later on. Team Bonus - This is applied to OfA, DfA, StH, ShA, and Pas. The Team Bonus value is usually on a scale from 0 to 3, and there is a separate bonus for Home and Away. The Home bonus is a positive bonus, and applied to the Home Team. So the higher the value, the better. The Away bonus is a negative bonus, and applied to the Away Team. So the lower the value, the better (0 is best). Ex: JR's current ShA is a 23 value. CHI is playing at Home this game, so he gets the Home Bonus (CHI Home Bonus is 2). So, his new ShA is 23 + 2 = 25. Team PP Bonus - This is applied to OfA, StH, ShA, Pas. The PP Bonus is on a scale from 0 to 3. It is a positive bonus. Ex: JR's current ShA is 25. CHI goes on the PP. The Team PP Bonus is 0 (more on that in a moment). So, his ShA does not change in this case. Team PK Bonus - This is applied to OfA, StH, ShA. The PP Bonus is on a scale from 0 to 3. It is a negative bonus. Ex: JR's current ShA is 25. CHI goes on the PK. The Team PK Bonus is 1 (more on that in a moment). So, his ShA goes from 25 to 25 - 1 = 24. BUG ALERT! - Remember I said the bonuses are applied at every faceoff? The PP and PK bonuses are supposed to be applied at the opening faceoff of the PP. But, they are not! They are applied ON THE NEXT FACEOFF DURING THE PP. And, once these are applied, they will continue to be applied even after the PP is done, until the next faceoff. - Also, we have been wrong about the PP/PK byte. I believe this is a bug. For example, Boston has a 2-1 PP-PK Team bonus, according to what we know about the Team Byte Data. But, the game actually uses the second digit (1) as the PP bonus, and the first digit (2) as the PK bonus! So, in reality it's a 2-1 PK-PP bonus. A team like ANH has a value of 02, which would mean no PK bonus (which is good, a 0 change), and a +2 (or think of it like a 0.4 point increase to the original attribute) increase to OfA, Pas, and StH during a PP! Comeback Bonus - This is a new finding (and has a bug). Beginning at the start of the 3rd period, at each faceoff, the game will check the score and see if there is a tie, or a lead. It then applies a +2 bonus to OfA, Chk, and a +4 bonus to Rgh. This mostly benefits the CPU players, as Chk and Rgh increases more than OfA (again, because of the way it's calculated). This bonus is applied to BOTH teams if there is a tie, and to the LOSING team if applicable. It also is applied for the whole OT (to both teams). So what this means is CPU controlled players become more aggressive with checking, and if you are playing 1 player, the CPU team will take more shots. The OfA bonus helps those who have lower OfA (not so much with 5 and 6 rated players), to sit in better spots for one-timers and rebounds. Roughness (Passing Bias) is a hidden stat. It doesn't show up on the ratings screen. JR has a 2 Rgh rating or a 2 * 5 = 10 in-game value. Which means he passes more than he shoots (controlled by CPU). This bonus would bump him up to 14 in-game value. BUG ALERT! - The Comeback bonus does a check at each faceoff, not just looking at the score of the game, but also the time remaining (in the 3rd period only this is checked). If there is a faceoff with less than 2:30 remaining, it REMOVES the bonus. I think they intended to only apply this bonus with less than 2:30 remaining in the 3rd, but they messed up. So imagine losing in a 10 min period game, where you would have at least 7:30 of bonus over your opponent. You can thank this bug. PLAYER RATINGS - Warning, this will get a little complicated You are used to seeing player attributes on the Edit Lines and Team Roster screens in a 25-99 or a 25-100 scale. But, the game really sees them in a 0-30 scale, like what was shown above. So, there is much less variance in the game than what you see on the ratings screen. Remember I said the ratings Hot/Cold values were -9 to +8? Yes, this is the displayed ratings variance, but the in-game variance is really -3 to +2. So, what does this mean? Example: JR has a 5 ShA. This game, his hot/cold is -7. His ShA rating display would be 5 * 18 = 72, and then 72 - 7 = 65. His in-game value is 25 (5 * 5 = 25). The game takes that -7, divides it by 3, and dumps the remainder (-7 % 3 = -2). Then, adds it to his in-game value, so 25 + -2 = 23. But, what if his hot/cold bonus was -8? The ratings display would be 72-8 = 64. His starting in game value is 25, then -8 % 3 = -2. So, 25 + - 2 = 23. So even though his hot/cold bonus changed, it didn't effect his in-game value (the value the game actually uses). So you can look at all the In-Game Bonus (Hot/Cold, Team, PP/PK, Comeback) as so, with the effect on the 25-100 rating scale - -3 (-9 through -11 rating change) -2 (-8 through -6 rating change) -1 (-5 through -3 rating change) 0 (-3 through +2 rating change) +1 (+3 through +5 rating change) +2 (+6 through +8 rating change) +3 (+9 through + 11 rating change) +4 (+12 through +14 rating change) Even though there's a variance in the ratings, I believe it's just for display purposes. The in-game value uses the values in bold. Also, the Edit Lines and Team Roster ratings displayed DO NOT show any of the Team Bonuses, just the default rating + the hot/cold bonus. The lesson here is the Edit Lines and Team Rosters never show you the exact rating for an attribute. AWARENESS CALCULATION Offensive and Defensive Awareness in-game values are calculated differently, and thus the in-game bonuses have a different effect on them. The other attributes that get bonuses are calculated in game as so - Default attribute value (0-6) * 5 + in-game bonuses (ranging from -3 to +4 in some cases) Offensive Awareness = [30 - (OfA attribute value + hot/cold bonus + PP bonus + PK bonus + Team bonus + Comeback bonus) / 2] / 2 (yes, it's confusing, remember PEMDAS) Defensive Awareness = [30 - (DfA attribute value + hot/cold bonus + Team bonus) / 2] / 2 All you have to know here, is that the bonuses have a larger effect on players with lower awareness. The lower the awareness, the larger the bonuses make a difference. Players with 5 or 6 Awareness attribute value will not benefit as much from the bonuses as players with 2-4. But, if the bonuses are all positive, a player with a 5 rating may benefit with a small bump. Also, the LOWER the total value here, the higher the actual Awareness of the player (unlike the other attributes, where higher value is better). 1 3 2 Quote
chaos Posted January 1, 2021 Author Report Posted January 1, 2021 COMEBACK BONUS Here's an example of the comeback bonus. This game featured CHI at LA. I watched the attributes for both RW (Larmer and Sandstrom). I recorded what their attribute values were at the start of the 1st period. This would include the hot/cold bonuses and the Team Home/Away Bonuses. Then, I recorded the value at the start of the 3rd period. LA was leading at this point, 3-2. CHI was given the comeback bonus at this point. Note the values in BOLD. 1st Period FO 3rd Period FO 1st Period FO 3rd Period FO Attribute (in Hex) Sandstrom - RW Sandstrom - RW Larmer - RW Larmer - RW Wgt 48 48 38 38 Agl 12 12 15 15 Spd 12 12 15 15 OfA 09 09 0A 09 DfA 0B 0B 08 08 ShP 17 17 15 15 ShA 18 18 14 14 Pas 0E 0E 14 14 JNo 07 07 28 28 Rgh 08 08 10 14 StH 13 13 14 14 End 0D 0D 1E 1E Agg 0D 0D 0B 0B Fight 08 08 04 04 Chk 0D 0D 15 17 As you can see, Larmer got a boost in OfA (remember, lower is better for this), Rgh, and Chk. These values are in Hex, so the 14 in Rgh equates to 20 in decimal (30 would be the max, or 1E in hex). Above is a screenshot of the same game, tied at 4-4 with 4:22 left in the 3rd period. Both players receive the comeback bonus. Sandstrom is Home, Larmer is Away. Sandstroms OfA went from 09 to 08, Rgh from 08 to 0C (an increase of 4, from 8 decimal to 12), and Chk went from 0D to 0F (increase of 2, from 13 decimal to 15). Example showing how the Comeback bonus disappears with a faceoff with under 2:30 left (this one was 1:40 left). First screenshot is start of 3rd, LA (Home) playing CHI (Away), LA down 4-0, second is at a faceoff with 1:40 left: You can see how the values for Rgh and Chk are lower in the second shot (0E to 0A, 14 decimal to 10, and 11 to 0F, or 17 to 15). 1 Quote
chaos Posted January 1, 2021 Author Report Posted January 1, 2021 PP/PK Bonus This game took place between LA and BOS (LA was Home). I watched the centers this time (Gretzky and Oates). I should have swapped players, since these 2 have maxed values for some of their attributes, but you can still see the change in ShA here. The first shot was taken at the START of the PP. The second at the next faceoff (during PP for LA). LA is Home (Gretzky) and Away is BOS (Oates). If you look at "Away C[6]" this is ShA for Oates. His ShA goes from 15 (or 21 decimal) to 13 (or 19 decimal), or a -2 drop. Remember these stats are on a 0-30 decimal scale, not 0-100, so a small difference matters. Gretzky on the other hand, his "Home C[6]" value ShA goes from 0C (or 13 decimal) to 0E (or 15 decimal). He gets a +2 bump. The PP/PK byte for BOS is 21, for LA is 12. But you can see here, the PP bonus for LA is clearly +2 (or the second digit), and for BOS is -2 (or the first digit). This is confirmed in looking at the code as well. Might be easier to look at this. Note Gretzky misses out on some PP bonuses because he's already maxed out at Passing and StH: 1st Period FO PP - 2nd Faceoff 1st Period FO PK - 2nd Faceoff Attribute (in Hex) Gretzky - C Gretzky - C Oates - C Oates - C Wgt 20 20 38 38 Agl 1E 1E 1B 1B Spd 15 15 16 16 OfA 08 08 08 08 DfA 09 09 08 08 ShP 0B 0B 11 11 ShA 0C 0E 15 13 Pas 1E 1E 1D 1D JNo 99 99 12 12 Rgh 01 01 02 02 StH 1E 1E 1A 18 End 1E 1E 1B 1B Agg 01 01 07 07 Fight 02 02 00 00 Chk 0B 0B 11 11 Quote
Mr. T Posted January 1, 2021 Report Posted January 1, 2021 This is amazing stuff. So lower players on expansion teams will get a better bonus usually if their off- def awareness are low. 1 Quote
Evan Posted March 23, 2021 Report Posted March 23, 2021 @chaos Thanks so much for posting all of these finds and info! Going to reference some of this for the nhl94 website when adding team/player data. Though might be worth updating the original post with the player Weight conversions, as those don't follow the typical ratings 0-6 mentioned. Player Weight conversion: 1 = 148 2 = 156 3 = 164 4 = 172 5 = 180 6 = 188 7 = 196 8 = 204 9 = 212 10 = 220 11 = 228 12 = 236 13 = 244 14 = 252 -Evan 1 Quote
McMarkis Posted August 29 Report Posted August 29 (edited) On 1/1/2021 at 1:41 PM, chaos said: NOTE: These were tested with Genesis, but I'm guessing it's the same for SNES. I have documented all the Player Attributes + Team Bonuses + Hot/Cold Code in the SNES rom. Below are the details. Overall very similar except for the rescaled attribute values and the HUGE Hot/Cold bug on the SNES side. Genesis / SNES Comparison: Player Attribute Details: Bonuses / Disadvantages: · PP + : Positive (0 to +3) Applied to the team on the PP · PK - : Negative (-3 to 0) Applied to the team on the PK · Home/Away +/-: Negative or Positive (-3 to +3) based on your teams Home/Road · Rubber Band +: Positive +2 applied when losing or tied early in the third or in OT Goalies: Do not get Bonuses / Disadvantages applied to their attributes, only Hot/Cold. Hot/Cold function: 1) Takes a random number (-12 to +10) divides by 2 then divides by 2 again. 2) Adds this number back to the rescaled value. 3) Constraints the attribute to stay within the 0 to 15 range. Hot/Cold Bug: A division error on the (-12 to +10) causes HUGE fluctuations in SNES, often resulting in large positive jumps. I would say this is similar to the GENS weight bug, in terms of being a coding error Example of the Bug: 1.Starting Values: - Benoit Brunet's agility was originally 2 out of 6. - This value was rescaled to 5 out of 15. No bonuses were applied. 2.Random Number Impact: - A random number of $F5 (-11 in decimal) was generated to adjust agility due to "Hot/Cold" status. - This number should be halved (divided by 2) twice in the calculation. 3. First Division by 2: - Instead of correctly calculating -11 ÷ 2 = -5, the instruction treats the number as if it’s positive (unsigned), which gives a wrong result of 245 ÷ 2 = 122. 4.Second Division by 2: - The incorrect value 122 is halved again to get 61. - This should have instead halved -5 to get -2. 5.Adding the Original Agility Value: - The program adds the original rescaled value of 5 to the incorrect 61, resulting in 66. - The correct calculation should have been 5 + (-2) = 3. 6.Capping the Result: - Since 66 is greater than the maximum allowed agility of 15, the value is capped at 15. - In the correct calculation, the final agility value would have been 3, which is already under the cap. **Summary:** Due to the bug, Benoit Brunet's agility incorrectly increases to the maximum value (15) instead of decreasing to (3) as it should, because the negative number was mistakenly treated as a positive number during the calculations. Edited August 30 by McMarkis 2 2 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.