Guide
What we don't know yet
Missing numbers and parts of the code not read yet.
The rules in this guide come from the app's code (version 211), and its numbers from the game's decoded data tables. A few pieces are still open.
Missing numbers
The shot and contest tables are decoded (values in the reference). Still open:
- Per-player contest extras. Each card has
extra_disturb_parmandextra_stand_disturb_parm(timing and stance bonuses for defenders), not yet tabulated. - Your own card's numbers. Level and rank growth is decoded (progression reference), so a card's stats at level 50 are known; gear, abilities and badges still add on top.
- When you count as "open". The open-shot bonus is large (up to +50 points), but the rule behind
ModelPlayer.IsOpenhasn't been read.
Script patches
Every function in the shot formula first checks whether a downloaded Lua patch replaces it. Checked for versions 201 and 211: none does. The game's only patch file changes a few of Ray Allen's states and nothing else, and no download replaces it (reference). An update can add a patch at any time, so the check has to be repeated after each one.
Code not yet read
GetExGoalRateandBeforeCalcShootRate: the character-specific bonuses and pre-shot hooks.CalcOtherAddValue's sources individually (potency, contact and so on): only that they add flat points is known.GetBalanceValueByType: a bonus added to the roll when the bad-luck counter is full. It doesn't change the outcome, since that shot is guaranteed anyway.- What the mid-range angle trigger (type 85) does.
- How the game decides a jump shot is a "close shot" (
isCloseShoot). - Trait triggers (Traits): what counts as "the corner" for Corner Three and as "open space" for Shooter's Heart. The trigger ids are only matched to the trait descriptions, not read from code.
Blocking
- Where a blocked ball goes. Strength picks a row of
fight_block_weight, which weights the blocked ball's path, but which path each weight index is hasn't been matched to theblock_*ball animations. - "Cannot block from behind!" The geometry behind it is read from code (you beside the attacker's path, within 45° of where they face), but how that looks in a match hasn't been checked.
- Posterize angle. A defender is only rolled if they're within an angle of the dunker's facing that comes from the dunk's own data; the values haven't been tabulated.
- Timing margin. The block window ends 333 time units before the ball would score; whether that is milliseconds hasn't been confirmed.
Checking against real play
20 recorded matches (10 on version 201, 10 on version 211) confirm the make rule, the bad-luck counter and the no-repeat rule (Misses and guaranteed makes).
The game keeps a plain-text log of its last 10 matches (files/SDRes/Bin/FightLog/<match>/LogicFrameData.dat):
every frame's player positions, states, energy and animations, the ball's state and owner, and each shot's result.
scripts/fightlog.py lists the shots. Still open:
- Checking the chance itself. Since version 211 the game logs each shot's computed chance (
goalRate), and the make rule (roll at or under the chance, plus the bad-luck counter) checks out on all 327 logged shots. Comparing a logged chance with the formula needs the shooter's in-match stats, which the log doesn't include. - Which part of Midorima's ultimate removes the range falloff (14 of 22 made from 10 m and beyond).
PVPFrameData.datandRecordVideo/*.recordshare a binary format (per-frame inputs, probably) that hasn't been decoded.Log/outLog_*.txtis a general client log.