AF21rm12.ply  -  decoded FPS Football Pro '98 play file
================================================================
Decoded with the D_PLAY::Load() layout from PLAY.CPP. All 405 bytes of
the play block were consumed exactly, so the layout matches this file.

WHAT THIS PLAY IS (plain English)
---------------------------------
* Offensive play (category byte 0x89, offense bit set, SpecialFlag 0 =
  not a kick/special-teams play).
* A RUN: the QB (player 0) has a HANDOFF_TO command followed by
  "player 10", i.e. he hands the ball to the halfback. That pairing
  (HANDOFF_TO + next command = receiving player #) is exactly how
  GetReceiverColor() in PLAY.CPP reads it. The file name "rm" also
  fits Run Middle.
* Formation: QB about 2.7 yds deep (short shotgun / pistol), HB 5.6 yds
  deep, offset about 2.3 yds left. 5 OL. Two receivers to each side:
  TE split wide left plus a WR in the left slot; two WRs to the right
  (one on the line, one off it, in a stack/twin look).
  Personnel: 1 RB, 1 TE, 3 WR.
* Pre-snap motion: WR (player 7) motions from about 10 yds left of
  center out to about 23 yds left, staying behind the line.
* After the snap:
   - QB: hands off at a point about 2.6 yds left of center, 5 yds deep.
   - HB: steps to 2.7 yds deep, then runs upfield to +4.9 yds on the
     left side of center, then RUN (arg 2: not the run-left/right
     values 4/5, so most likely straight ahead / middle).
   - C and left G: climb to the second level (+2.9 yds) then block.
     Right G climbs to +7.7 yds then blocks. Both tackles block in
     place.
   - WRs/TE: all release to the sideline (x = +/-2400) 1-4 yds
     downfield, clearing the middle out.

PRE-SNAP FORMATION (1 char = about 1 yd; numbers = player slots)
  LEFT SIDELINE                                      RIGHT SIDELINE
  |-----------------------------------------------------|   <- downfield is UP
  |======================== LOS ========================|   line of scrimmage (y=0)
 0|                                                     |
 1|       6                   1                   8     |  yds behind LOS
 2|                       2 3  4 5                      |
 3|                7          0                      9  |
 4|                                                     |
 5|                                                     |
 6|                        10                           |
 7|                                                     |
    0 = QB
    1 = C
    2 = T
    3 = G
    4 = G
    5 = T
    6 = TE
    7 = WR
    8 = WR
    9 = WR
   10 = HB

HOW TO READ THE CODES
---------------------
Position codes (inferred: these enum values aren't in PLAY.H/PLAY.CPP,
so they come from the code's grouping rules plus which player has
the snap and handoff flags):
  0x0010 = Guard, 0x0011 = Tackle, 0x0012 = Center   (OL group 0x0010;
           center carries the PreSnap/snapper flag)
  0x0020 = QB      (carries the AfterSnap/ball-handler flag)
  0x0042 = Halfback (backs group 0x0040; 0x40/0x41/0x42 likely
           RB/FB/HB, following the order in IDToRank)
  0x0080 = WR, 0x0081 = TE   (receiver group 0x0080; TE is a guess
           from the IDToRank order WR then TE)
Command IDs (low byte of the type word; bits 8-11 = number of args):
  2  = 2-arg move to point (MOVE_TO or BLOCK_MOVE_TO): route waypoint
  3  = BLOCK (1 arg). Per Flip(), args 2 and 3 are the push-right /
       push-left pair. 4 = another block style (exact name unknown).
  12 = RUN (1 arg). Per Flip(), 4/5 = run right/left, so 2 is
       something else, probably straight ahead.
  27 = HANDOFF_TO (x,y handoff point)
  1  = player-number argument command; here "10" = hand off to player 10
Coordinates: x runs -2400..+2400 sideline to sideline (0 = center of
the field), y = yards*90 from the line of scrimmage (+ = downfield).
About 90 units = 1 yard both ways.

FULL RAW DECODE
================================================================
File: AF21rm12.ply  (413 bytes)
Block tag: 'P95:'   block size: 405 bytes
Player offset table: [25, 55, 91, 115, 151, 187, 211, 243, 293, 325, 363]
PlayCategory=0x89  SpecialFlag=0  UserCategory=0x89
  Offense/defense bit (cat&1) = 1 -> offensive play (Load returns 2)
Coordinates are raw file units: x = -2400..+2400 across the field (0 = middle of the field), y = yards*90 relative to the line of scrimmage (+ = downfield, - = backfield). ~90 units = 1 yard.

=== Player 0: position code 0x0020 (group 0x0020, sub 0), depth rank 1, flags: AfterSnap (ball handler) ===
  PRE-SNAP: 1 logic box(es)
    Box 0: at x=10, y=-240 (-2.7 yd), 0 command(s)
  AFTER SNAP (middle of play): 1 logic box(es)
    Box 0: at x=10, y=-240 (-2.7 yd), 2 command(s)
      cmd 0: id 27 (0x1B) x=-231, y=-450 (-5.0 yd)
      cmd 1: id 1 (0x01) arg=10
  [ends at block offset 55]
=== Player 1: position code 0x0012 (group 0x0010, sub 2), depth rank 1, flags: PreSnap (snapper) ===
  PRE-SNAP: 1 logic box(es)
    Box 0: at x=0, y=-90 (-1.0 yd), 0 command(s)
  AFTER SNAP (middle of play): 2 logic box(es)
    Box 0: at x=0, y=-90 (-1.0 yd), 1 command(s)
      cmd 0: id 2 (0x02) x=70, y=260 (+2.9 yd)
    Box 1: at x=70, y=260 (+2.9 yd), 1 command(s)
      cmd 0: id 3 (0x03) arg=3
  [ends at block offset 91]
=== Player 2: position code 0x0011 (group 0x0010, sub 1), depth rank 1 ===
  PRE-SNAP: 1 logic box(es)
    Box 0: at x=-312, y=-140 (-1.6 yd), 0 command(s)
  AFTER SNAP (middle of play): 1 logic box(es)
    Box 0: at x=-312, y=-140 (-1.6 yd), 1 command(s)
      cmd 0: id 3 (0x03) arg=2
  [ends at block offset 115]
=== Player 3: position code 0x0010 (group 0x0010, sub 0), depth rank 2 ===
  PRE-SNAP: 1 logic box(es)
    Box 0: at x=-151, y=-140 (-1.6 yd), 0 command(s)
  AFTER SNAP (middle of play): 2 logic box(es)
    Box 0: at x=-151, y=-140 (-1.6 yd), 1 command(s)
      cmd 0: id 2 (0x02) x=-91, y=260 (+2.9 yd)
    Box 1: at x=-91, y=260 (+2.9 yd), 1 command(s)
      cmd 0: id 3 (0x03) arg=3
  [ends at block offset 151]
=== Player 4: position code 0x0010 (group 0x0010, sub 0), depth rank 1 ===
  PRE-SNAP: 1 logic box(es)
    Box 0: at x=150, y=-140 (-1.6 yd), 0 command(s)
  AFTER SNAP (middle of play): 2 logic box(es)
    Box 0: at x=150, y=-140 (-1.6 yd), 1 command(s)
      cmd 0: id 2 (0x02) x=-31, y=690 (+7.7 yd)
    Box 1: at x=-31, y=690 (+7.7 yd), 1 command(s)
      cmd 0: id 3 (0x03) arg=4
  [ends at block offset 187]
=== Player 5: position code 0x0011 (group 0x0010, sub 1), depth rank 2 ===
  PRE-SNAP: 1 logic box(es)
    Box 0: at x=311, y=-140 (-1.6 yd), 0 command(s)
  AFTER SNAP (middle of play): 1 logic box(es)
    Box 0: at x=311, y=-140 (-1.6 yd), 1 command(s)
      cmd 0: id 3 (0x03) arg=4
  [ends at block offset 211]
=== Player 6: position code 0x0081 (group 0x0080, sub 1), depth rank 1 ===
  PRE-SNAP: 1 logic box(es)
    Box 0: at x=-1808, y=-120 (-1.3 yd), 0 command(s)
  AFTER SNAP (middle of play): 2 logic box(es)
    Box 0: at x=-1808, y=-120 (-1.3 yd), 1 command(s)
      cmd 0: id 2 (0x02) x=-2400, y=270 (+3.0 yd)
    Box 1: at x=-2400, y=270 (+3.0 yd), 0 command(s)
  [ends at block offset 243]
=== Player 7: position code 0x0080 (group 0x0080, sub 0), depth rank 2 ===
  PRE-SNAP: 2 logic box(es)
    Box 0: at x=-934, y=-260 (-2.9 yd), 1 command(s)
      cmd 0: id 2 (0x02) x=-2129, y=-260 (-2.9 yd)
    Box 1: at x=-2129, y=-260 (-2.9 yd), 0 command(s)
  AFTER SNAP (middle of play): 2 logic box(es)
    Box 0: at x=-2129, y=-260 (-2.9 yd), 2 command(s)
      cmd 0: id 2 (0x02) x=-1888, y=190 (+2.1 yd)
      cmd 1: id 2 (0x02) x=-2400, y=390 (+4.3 yd)
    Box 1: at x=-2400, y=390 (+4.3 yd), 0 command(s)
  [ends at block offset 293]
=== Player 8: position code 0x0080 (group 0x0080, sub 0), depth rank 1 ===
  PRE-SNAP: 1 logic box(es)
    Box 0: at x=1827, y=-120 (-1.3 yd), 0 command(s)
  AFTER SNAP (middle of play): 2 logic box(es)
    Box 0: at x=1827, y=-120 (-1.3 yd), 1 command(s)
      cmd 0: id 2 (0x02) x=2399, y=70 (+0.8 yd)
    Box 1: at x=2399, y=70 (+0.8 yd), 0 command(s)
  [ends at block offset 325]
=== Player 9: position code 0x0080 (group 0x0080, sub 0), depth rank 3 ===
  PRE-SNAP: 1 logic box(es)
    Box 0: at x=2118, y=-280 (-3.1 yd), 0 command(s)
  AFTER SNAP (middle of play): 2 logic box(es)
    Box 0: at x=2118, y=-280 (-3.1 yd), 2 command(s)
      cmd 0: id 2 (0x02) x=1807, y=120 (+1.3 yd)
      cmd 1: id 2 (0x02) x=2399, y=370 (+4.1 yd)
    Box 1: at x=2399, y=370 (+4.1 yd), 0 command(s)
  [ends at block offset 363]
=== Player 10: position code 0x0042 (group 0x0040, sub 2), depth rank 1 ===
  PRE-SNAP: 1 logic box(es)
    Box 0: at x=-211, y=-500 (-5.6 yd), 0 command(s)
  AFTER SNAP (middle of play): 2 logic box(es)
    Box 0: at x=-211, y=-500 (-5.6 yd), 2 command(s)
      cmd 0: id 2 (0x02) x=-111, y=-240 (-2.7 yd)
      cmd 1: id 2 (0x02) x=-251, y=440 (+4.9 yd)
    Box 1: at x=-251, y=440 (+4.9 yd), 1 command(s)
      cmd 0: id 12 (0x0C) arg=2
  [ends at block offset 405]

Parsed through block offset 405 of 405
