offense_ratio, defense_ratio, and model_scale are all 32-bit floats, they are stored consecutively within the game info block starting at 0x60 + 0x24i + 0x18.
However the parsing for these values begins at 0x60 + 0x24i + 0x14 (count carefully). The actual values stored at this location are damage start and damage spawn, which are not currently part of the model.
The tests are incorrect so this is not being caught. See here for example, the offense_ratio should actually be 1.0 but the tests incorrectly claims it is 0.0. If you wish to examine the game.slp file by hand, you'll find that offense_ratio begins at 0x9A and indeed holds a 1.0 value (hex 0x3F800000, big endian), note that it is followed by two more 1.0 values, corresponding to defense_ratio and model_scale for the first player.
offense_ratio, defense_ratio, and model_scale are all 32-bit floats, they are stored consecutively within the game info block starting at 0x60 + 0x24i + 0x18.
However the parsing for these values begins at 0x60 + 0x24i + 0x14 (count carefully). The actual values stored at this location are damage start and damage spawn, which are not currently part of the model.
The tests are incorrect so this is not being caught. See here for example, the offense_ratio should actually be 1.0 but the tests incorrectly claims it is 0.0. If you wish to examine the game.slp file by hand, you'll find that offense_ratio begins at 0x9A and indeed holds a 1.0 value (hex 0x3F800000, big endian), note that it is followed by two more 1.0 values, corresponding to defense_ratio and model_scale for the first player.