{
 "chunk": "game_trainerPlaybook0200_0200",
 "unit": "game/trainerPlaybook0200",
 "unitLabels": {
  "game/trainerPlaybook0200": {
   "0200": "trainerPlay0",
   "0296": "trainerPlay1",
   "032C": "trainerPlay2",
   "03C2": "trainerPlay3",
   "0458": "trainerPlay4",
   "04EE": "playbookTail",
   "0232": "trainerPlay0DestCol",
   "0264": "trainerPlay0DestRow",
   "02C8": "trainerPlay1DestCol",
   "02FA": "trainerPlay1DestRow",
   "035E": "trainerPlay2DestCol",
   "0390": "trainerPlay2DestRow",
   "03F4": "trainerPlay3DestCol",
   "0426": "trainerPlay3DestRow",
   "048A": "trainerPlay4DestCol",
   "04BC": "trainerPlay4DestRow",
   "02A2": "play1Grp12",
   "02A3": "play1Grp13",
   "02AB": "play1Grp21",
   "02B8": "play1Grp34",
   "02D5": "play1Col13",
   "02EC": "play1Col36",
   "0300": "play1Row06",
   "0301": "play1Row07",
   "0302": "play1Row08",
   "0304": "play1Row10",
   "0307": "play1Row13",
   "030F": "play1Row21",
   "0310": "play1Row22",
   "0311": "play1Row23",
   "0312": "play1Row24",
   "0313": "play1Row25",
   "0314": "play1Row26",
   "031B": "play1Row33",
   "031C": "play1Row34",
   "0324": "play1Row42",
   "0325": "play1Row43",
   "0329": "play1Row47",
   "032D": "play2Grp01",
   "032E": "play2Grp02",
   "0332": "play2Grp06",
   "0339": "play2Grp13",
   "0343": "play2Grp23",
   "0362": "play2Col04",
   "0373": "play2Col21",
   "0400": "play3Col12",
   "0401": "play3Col13",
   "0410": "play3Col28",
   "0420": "play3Col44",
   "0430": "play3Row10",
   "0432": "play3Row12",
   "0450": "play3Row42",
   "0464": "play4Grp12",
   "0478": "play4Grp32",
   "047A": "play4Grp34",
   "047C": "play4Grp36",
   "0481": "play4Grp41",
   "0484": "play4Grp44",
   "048B": "play4Col01",
   "048C": "play4Col02",
   "04A0": "play4Col22",
   "04C8": "play4Row12",
   "04C9": "play4Row13",
   "04D0": "play4Row20",
   "04D1": "play4Row21",
   "04DF": "play4Row35",
   "04E7": "play4Row43"
  }
 },
 "notes": {
  "02A2": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 group id, AI slot 12: $FF = in no group - unit 62 is not in play in the QB SNEAK roster either"
  },
  "02A3": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 group id, AI slot 13: $FF = in no group - unit 63 is not in play in the QB SNEAK roster either"
  },
  "02AB": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 group id, AI slot 21: $FF = in no group - unit 71 is not in play in the QB SNEAK roster either"
  },
  "02B8": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 group id, AI slot 34: $FF = in no group - unit 84 is not in play in the QB SNEAK roster either"
  },
  "02D5": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest column, AI slot 13 (unit 63 is not in play here): template 2's own start column $14, a don't-care"
  },
  "02EC": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest column, AI slot 36 (unit 86 is not in play here): template 2's own start column $05, a don't-care"
  },
  "0300": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 destination row, AI slot 6 = unit 56 (RIDER): $12 = row 18 (unchanged: the cell it starts on)"
  },
  "0301": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 destination row, AI slot 7 = unit 57 (RIDER): $10 = row 16 (unchanged: the cell it starts on)"
  },
  "0302": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 destination row, AI slot 8 = unit 58 (RIDER): $12 = row 18 (starts on $0E)"
  },
  "0304": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest row, AI slot 10 (unit 60 is not in play here): template 2's own start row $13, a don't-care"
  },
  "0307": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest row, AI slot 13 (unit 63 is not in play here): template 2's own start row $0C, a don't-care"
  },
  "030F": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest row, AI slot 21 (unit 71 is not in play here): template 2's own start row $0C, a don't-care"
  },
  "0310": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest row, AI slot 22 (unit 72 is not in play here): template 2's own start row $0C, a don't-care"
  },
  "0311": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest row, AI slot 23 (unit 73 is not in play here): template 2's own start row $0D, a don't-care"
  },
  "0312": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest row, AI slot 24 (unit 74 is not in play here): template 2's own start row $0D, a don't-care"
  },
  "0313": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest row, AI slot 25 (unit 75 is not in play here): template 2's own start row $0E, a don't-care"
  },
  "0314": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest row, AI slot 26 (unit 76 is not in play here): template 2's own start row $0E, a don't-care"
  },
  "031B": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest row, AI slot 33 (unit 83 is not in play here): template 2's own start row $08, a don't-care"
  },
  "031C": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest row, AI slot 34 (unit 84 is not in play here): template 2's own start row $08, a don't-care"
  },
  "0324": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest row, AI slot 42 (unit 92 is not in play here): template 2's own start row $0B, a don't-care"
  },
  "0325": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest row, AI slot 43 (unit 93 is not in play here): template 2's own start row $0B, a don't-care"
  },
  "0329": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 dest row, AI slot 47 (unit 97 is not in play here): template 2's own start row $10, a don't-care"
  },
  "032D": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 group id, AI slot 1 = unit 51 (RIDER): group 1 - one of the three flank groups, any of which $EC9C may pick as the home guard"
  },
  "032E": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 group id, AI slot 2 = unit 52 (RIDER): group 1 - one of the three flank groups, any of which $EC9C may pick as the home guard"
  },
  "0332": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 group id, AI slot 6 = unit 56 (RIDER): group 4 - the spearhead group named by mainGroupByPlanTable ($EC00)"
  },
  "0339": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 group id, AI slot 13 = unit 63 (RIDER): group 2 - one of the three flank groups, any of which $EC9C may pick as the home guard"
  },
  "0343": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 group id, AI slot 23 = unit 73 (RIDER): group 4 - the spearhead group named by mainGroupByPlanTable ($EC00)"
  },
  "0362": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 destination column, AI slot 4 = unit 54 (RIDER): $17 = column 23 (starts on $14)"
  },
  "0373": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 destination column, AI slot 21 = unit 71 (RIDER): $1C = column 28 (starts on $1F)"
  },
  "0400": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 destination column, AI slot 12 = unit 62 (RIDER): $1E = column 30 (unchanged: the cell it starts on)"
  },
  "0401": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 destination column, AI slot 13 = unit 63 (RIDER): $1D = column 29 (unchanged: the cell it starts on)"
  },
  "0410": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 dest column, AI slot 28 (unit 78 is not in play here): template 3's own start column $22, a don't-care"
  },
  "0420": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 dest column, AI slot 44 (unit 94 is not in play here): template 3's own start column $15, a don't-care"
  },
  "0430": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 destination row, AI slot 10 = unit 60 (GRUNT): $0C = row 12 (starts on $0B)"
  },
  "0432": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 destination row, AI slot 12 = unit 62 (RIDER): $10 = row 16 (unchanged: the cell it starts on)"
  },
  "0450": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 dest row, AI slot 42 (unit 92 is not in play here): template 3's own start row $0C, a don't-care"
  },
  "0464": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 group id, AI slot 12 = unit 62 (GRUNT): group 4 - the spearhead group named by mainGroupByPlanTable ($EC00)"
  },
  "0478": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 group id, AI slot 32 = unit 82 (RIDER): group 2 - one of the three flank groups, any of which $EC9C may pick as the home guard"
  },
  "047A": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 group id, AI slot 34 = unit 84 (RIDER): group 3 - one of the three flank groups, any of which $EC9C may pick as the home guard"
  },
  "047C": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 group id, AI slot 36 = unit 86 (RIDER): group 1 - one of the three flank groups, any of which $EC9C may pick as the home guard"
  },
  "0481": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 group id, AI slot 41 = unit 91 (BOOMER): group 4 - the spearhead group named by mainGroupByPlanTable ($EC00)"
  },
  "0484": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 group id, AI slot 44 = unit 94 (BOOMER): group 4 - the spearhead group named by mainGroupByPlanTable ($EC00)"
  },
  "048B": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 destination column, AI slot 1 = unit 51 (GRUNT): $11 = column 17 (starts on $07)"
  },
  "048C": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 destination column, AI slot 2 = unit 52 (GRUNT): $18 = column 24 (starts on $23)"
  },
  "04A0": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 destination column, AI slot 22 = unit 72 (GRUNT): $17 = column 23 (starts on $20)"
  },
  "04C8": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 destination row, AI slot 12 = unit 62 (GRUNT): $0F = row 15 (starts on $0D)"
  },
  "04C9": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 destination row, AI slot 13 = unit 63 (GRUNT): $0E = row 14 (starts on $0C)"
  },
  "04D0": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 destination row, AI slot 20 = unit 70 (GRUNT): $0C = row 12 (unchanged: the cell it starts on)"
  },
  "04D1": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 destination row, AI slot 21 = unit 71 (GRUNT): $0D = row 13 (starts on $0C)"
  },
  "04DF": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 destination row, AI slot 35 = unit 85 (RIDER): $09 = row 9 (unchanged: the cell it starts on)"
  },
  "04E7": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 destination row, AI slot 43 = unit 93 (BOOMER): $0D = row 13 (starts on $0B)"
  },
  "0231": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 0 group id, AI slot 49 = unit 99, the AI comcen: group 0, which is the comcen on its own in every play"
  },
  "0263": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 0 destination column, AI slot 49 = unit 99 (COMCEN): $14 = column 20 (unchanged: the cell it starts on) - the AI comcen"
  },
  "0295": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 0 destination row, AI slot 49 = unit 99 (COMCEN): $0E = row 14 (unchanged: the cell it starts on) - the AI comcen"
  },
  "02C7": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 group id, AI slot 49 = unit 99, the AI comcen: group 0, which is the comcen on its own in every play"
  },
  "02F9": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 destination column, AI slot 49 = unit 99 (COMCEN): $14 = column 20 (unchanged: the cell it starts on) - the AI comcen"
  },
  "032B": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 destination row, AI slot 49 = unit 99 (COMCEN): $0C = row 12 (starts on $0E) - the AI comcen"
  },
  "035D": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 group id, AI slot 49 = unit 99, the AI comcen: group 0, which is the comcen on its own in every play"
  },
  "038F": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 destination column, AI slot 49 = unit 99 (COMCEN): $19 = column 25 (unchanged: the cell it starts on) - the AI comcen; plans 2-4 discard this order at $ED4E-$ED56 and send group 0 after the spearhead instead"
  },
  "03C1": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 destination row, AI slot 49 = unit 99 (COMCEN): $0F = row 15 (starts on $0E) - the AI comcen; plans 2-4 discard this order at $ED4E-$ED56 and send group 0 after the spearhead instead"
  },
  "03F3": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 group id, AI slot 49 = unit 99, the AI comcen: group 0, which is the comcen on its own in every play"
  },
  "0425": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 destination column, AI slot 49 = unit 99 (COMCEN): $13 = column 19 (unchanged: the cell it starts on) - the AI comcen; plans 2-4 discard this order at $ED4E-$ED56 and send group 0 after the spearhead instead"
  },
  "0457": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 destination row, AI slot 49 = unit 99 (COMCEN): $0B = row 11 (starts on $09) - the AI comcen; plans 2-4 discard this order at $ED4E-$ED56 and send group 0 after the spearhead instead"
  },
  "0489": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 group id, AI slot 49 = unit 99, the AI comcen: group 0, which is the comcen on its own in every play"
  },
  "04BB": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 destination column, AI slot 49 = unit 99 (COMCEN): $13 = column 19 (unchanged: the cell it starts on) - the AI comcen; plans 2-4 discard this order at $ED4E-$ED56 and send group 0 after the spearhead instead"
  },
  "04ED": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 destination row, AI slot 49 = unit 99 (COMCEN): $0B = row 11 (starts on $06) - the AI comcen; plans 2-4 discard this order at $ED4E-$ED56 and send group 0 after the spearhead instead"
  },
  "020A": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 0 group id, AI slot 10: $FF = in no group - unit 60 is not in play in the SCRIMAGE roster either"
  },
  "02A0": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 group id, AI slot 10: $FF = in no group - unit 60 is not in play in the QB SNEAK roster either"
  },
  "0348": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 group id, AI slot 28: $FF = in no group - unit 78 is not in play in the FACE-OFF roster either"
  },
  "03DE": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 group id, AI slot 28: $FF = in no group - unit 78 is not in play in the SLUGGERS roster either"
  },
  "0200": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 0 group id, AI slot 0 = unit 50 (RIDER): group 5 - one of the ten one-unit groups of this play",
   "block": [
    "$0200-$04FF - the solo trainer's playbook: five canned opening plays of 150 bytes each (750 bytes used, 18 left over).  Track 29 sectors 6-8, read in one piece by initTrainerAi in game/trainerSetupEC00: $ECA6 points the fast loader at $0200 with setLoadDest and $ECB3 asks for three sectors from track 29 sector 6.  THE BOMB (game type 2) is the one solo game that never loads it - $EC69 jumps past the load because both sides own nothing but a comcen.",
    "There is no code in this file and nothing reaches these bytes by name: the only reader is the copy loop at $ECF3-$ED03, which walks them through three zero-page pointers built at $ECD2-$ECF0 (mapCellPtr $48 = group ids, fillEndPtr $4A = columns, planRowPtr $4C = rows).  Every label below, and every 'from' line XREF.txt lists for $0200-$04FE, belongs to one of the other three tenants of these two pages: the terrain contour rules and start-up code of game/tileRules0200 ($0200-$0388), the 'ea' boot file (boot/eaBootFile, $02A8-$030B) and the manual-check answer table plus checksum routine of game/scratchAndMessages0400 ($0400-$04AD).  The 'from game/trainerPlaybook0200' lines XREF.txt shows for $0400/$047A/$047C/$0481/$0484/$048C/$04A0 are that same overlap seen from the other side - the code doing the referencing is the checksum routine in game/scratchAndMessages0400, not anything here.",
    "Record n starts at $0200 + 150*n ($ECD2-$ECDB: 150 x n through multiply8x8, then +$0200 from the two INYs), n = the AI plan number kept in $8966.  A record is three parallel 50-entry arrays indexed by AI slot 0-49, i.e. unit 50-99 - the trainer always plays side 1: +$00 group id, +$32 destination column, +$64 destination row.  The copy loop runs slot 49 down to 0 and writes aiUnitGroup ($8832+slot), unitDestCol[50+slot] ($F802) and unitDestRow[50+slot] ($F866).  The five records are at $0200, $0296, $032C, $03C2 and $0458.",
    "The plan number comes from the game type ($0BA3 bits 0-2) at $EC4A-$EC93: 0 SCRIMAGE -> play 0, 1 QB SNEAK -> play 1, 3 FACE-OFF -> play 2, 4 SLUGGERS -> play 3, 5 FULL WAR and 6 DEFENDER -> play 4.  The same number indexes the three 5-byte tables at the head of the setup overlay: mainGroupByPlanTable $EC00 = FF,FF,04,04,04 (spearhead group), groupCountByPlanTable $EC05 = 0A,0A,04,04,04 (highest group id) and aiPlanParamTable $EC0A = FF,FF,08,0C,0C (drone detonation score threshold).",
    "Values: a group id is 0-10, or $FF = 'in no group'.  Group 0 is the comcen on its own - slot 49 is 0 in all five plays.  Plays 0 and 1 hand out ten one-unit groups 1-10; plays 2-4 use groups 1-3 (four riders in a 2x2 block with that group's spy scouting one row in front) plus group 4, the spearhead.  Columns and rows are plain cell coordinates 0-39 with bits 6-7 clear, so the engine reads them as a live order rather than 'arrived'; side 1 owns rows 6-19, so every row byte in the file is $06-$13 and every column byte $04-$24.",
    "How the plays were built (checked byte for byte against the unit start templates on track 18 s8-14): each destination array starts as an exact copy of the side-1 half of the template that the same game type selects (play 0/1 -> template 2 $F320, play 2 -> template 1 $F190, play 3 -> template 3 $F4B0, play 4 -> template 0 $F000), and only the slots that matter were edited.  An entry for a slot that holds no unit in that roster is therefore just the cell that unit would have started on - a don't-care.  The $FF group ids line up exactly with the $FF ('not in play') entries of the matching template's unit-type array, which is why the `ldx aiUnitGroup,y` at $EDDC can never hand $8902 an index of $FF.",
    "Only plays 0 and 1 are used as written.  $ED05-$ED0A sends plans 2-4 through the group scatter at $ED12-$ED58, which re-aims every group at a random column 4-35 inside an 8-row band and translates the whole group there (shiftAiGroupDestinations $EF00), so for those three plays only the shape of each group and its membership survive; even the comcen's own destination is replaced at $ED4E-$ED56 by the spearhead group's random target.",
    "Lifetime: microseconds.  rebuildAiGroupTables ($ED8E) writes the twelve group sum high bytes over $0464-$046F, $0478-$0483, $048C-$0497 and $04A0-$04AB before the setup overlay even returns; the resident trainer then keeps unitThreatWeight in $0464-$04C7 ($E7B2) and a flag in $0400 ($E6EC/$E7A7); and the first unit picture drawn in the info panel unpacks 512 RLE bytes over $0200-$03FF (showUnitPictureSprites $CD0A, read back at $CD15).  Nothing ever reads the playbook again, so every byte here is write-once data.",
    "trainerPlay0 - play 0, used by SCRIMAGE (game type 0).  Roster: unit start template 2 ($F320) - 5 GRUNTs, 5 RIDERs and the comcen a side, so AI slots 0-9 and 49 hold units and slots 10-48 are empty.  Companion scalars: no spearhead group ($EC00[0] = $FF), 11 group slots ($EC05[0] = $0A, so $8954 = 11) and no drone score threshold ($EC0A[0] = $FF = never detonate).  A home-guard group 1-3 is still drawn at $EC9C.  The plan number is below 2, so the destinations in this record reach the engine exactly as they stand.",
    "$0200-$0231 - play 0 group ids, 50 bytes, one per AI slot.  Every live unit is its own one-unit group: slot 0 -> group 5, 1 -> 6, 2 -> 7, 3 -> 8, 4 -> 9, 5 -> 10, 6 -> 4, 7 -> 3, 8 -> 2, 9 -> 1, and slot 49 (the comcen) -> group 0.  Slots 10-48 are $FF.  Ten separate groups is what makes a SCRIMAGE look like ten independent skirmishers: the AI's group loops at $E6A5/$E960/$EB3C run over all 11 slots."
   ]
  },
  "0296": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 group id, AI slot 0 = unit 50 (RIDER): group 10 - one of the ten one-unit groups of this play",
   "block": [
    "trainerPlay1 - play 1, used by QB SNEAK (game type 1).  Same roster as play 0 (template 2), but applyGameTypeDefaults removes absolute units 0-6 at $7C89/$7CA0, i.e. the *player's* first seven slots: the human is left with three riders and a comcen while the trainer keeps all ten units and its comcen.  $EC98-$EC9A also leaves the home-guard group at $FF for this plan alone, so the AI holds nothing back.  Companions: no spearhead, 11 group slots, drone threshold $FF.  Like play 0 it skips the group scatter, so these cells are used as written.",
    "$0296-$02C7 - play 1 group ids.  The same ten one-unit groups as play 0, but numbered straight down: slot 0 -> group 10, 1 -> 9, 2 -> 8, 3 -> 7, 4 -> 6, 5 -> 5, 6 -> 4, 7 -> 3, 8 -> 2, 9 -> 1, slot 49 -> group 0.  Slots 10-48 are $FF.  The array runs from $0296 to $02C7, straight across the BASIC line and KERNAL-LOAD code of the 'ea' boot file, which occupied $02A8-$030B before the game started."
   ]
  },
  "032C": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 group id, AI slot 0 = unit 50 (RIDER): group 1 - one of the three flank groups, any of which $EC9C may pick as the home guard",
   "block": [
    "trainerPlay2 - play 2, used by FACE-OFF (game type 3).  Roster: unit start template 1 ($F190) - 28 RIDERs, 3 SPYs and the comcen a side (AI slots 0-27, 46-48 and 49; slots 28-45 are marked 'not in play').  Companions: spearhead group 4 ($EC00[2]), 5 group slots ($EC05[2] = 4, so $8954 = 5) and a drone detonation score threshold of 8 ($EC0A[2]).  The plan number is >= 2, so $ED12-$ED58 re-aims each group at a random point afterwards and only the formation shape below survives.",
    "$032C-$035D - play 2 group ids.  Group 1 = slots 0-3 with spy 48, group 2 = slots 12-15 with spy 47, group 3 = slots 24-27 with spy 46, group 4 (the spearhead) = the sixteen riders of slots 4-11 and 16-23, group 0 = the comcen alone.  Slots 28-45 are $FF and hold no unit in this roster.  This array occupies the same addresses as the one-shot start-up code at $0300-$0388 of game/tileRules0200, which is why it is cut into so many fragments."
   ]
  },
  "0330": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 group id, AI slot 4 = unit 54 (RIDER): group 4 - the spearhead group named by mainGroupByPlanTable ($EC00)"
  },
  "0338": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 group id, AI slot 12 = unit 62 (RIDER): group 2 - one of the three flank groups, any of which $EC9C may pick as the home guard"
  },
  "0344": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 group id, AI slot 24 = unit 74 (RIDER): group 3 - one of the three flank groups, any of which $EC9C may pick as the home guard"
  },
  "035A": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 group id, AI slot 46 = unit 96 (SPY): group 3 - one of the three flank groups, any of which $EC9C may pick as the home guard"
  },
  "03C2": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 group id, AI slot 0 = unit 50 (GRUNT): group 4 - the spearhead group named by mainGroupByPlanTable ($EC00)",
   "block": [
    "trainerPlay3 - play 3, used by SLUGGERS (game type 4).  Roster: unit start template 3 ($F4B0) - 12 GRUNTs, 12 RIDERs, 4 BOOMERs, 3 SPYs and the comcen a side (AI slots 0-27, 46-48, 49; slots 28-45 are not in play).  Companions: spearhead group 4, 5 group slots and a drone detonation threshold of $0C.  Plan >= 2, so the groups are scattered to random points afterwards.",
    "$03C2-$03F3 - play 3 group ids.  Group 4, the spearhead, takes the twelve GRUNTs (slots 0-11) and the four BOOMERs (slots 24-27); groups 3, 2 and 1 take the three rider quartets - slots 12-15, 16-19 and 20-23 - each with one spy (46, 47, 48); group 0 is the comcen.  Slots 28-45 are $FF.  So SLUGGERS puts the sluggers (grunts and boomers) in one mass and screens them with three rider groups."
   ]
  },
  "03CE": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 group id, AI slot 12 = unit 62 (RIDER): group 3 - one of the three flank groups, any of which $EC9C may pick as the home guard"
  },
  "03DA": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 group id, AI slot 24 = unit 74 (BOOMER): group 4 - the spearhead group named by mainGroupByPlanTable ($EC00)"
  },
  "0458": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 group id, AI slot 0 = unit 50 (GRUNT): group 4 - the spearhead group named by mainGroupByPlanTable ($EC00)",
   "block": [
    "trainerPlay4 - play 4, used by FULL WAR (game type 5) and DEFENDER (game type 6), and the fallback for any biased game type of 4 or more ($EC6F-$EC91).  Roster: unit start template 0 ($F000) - the full army of 28 GRUNTs, 12 RIDERs, 6 BOOMERs, 3 SPYs and a comcen, so all 50 AI slots are live and no $FF appears anywhere in this record.  Companions: spearhead group 4, 5 group slots, drone detonation threshold $0C.  For DEFENDER $EC73-$EC85 additionally queues command $A5,00,$14 (20 x 10 = 200 extra purchase points for the computer), and for both types $EC88-$EC8E resets the AI comcen's flags so it is free to move.",
    "$0458-$0489 - play 4 group ids.  Group 4, the spearhead, swallows all 28 GRUNTs (slots 0-27) and all 6 BOOMERs (slots 40-45) - 34 units in one mass; group 3 = riders 28, 29, 33, 34 with spy 46; group 2 = riders 30, 31, 32, 39 with spy 47; group 1 = riders 35-38 with spy 48; group 0 = the comcen.  $EC9C picks one of groups 1-3 at random to stay behind as the home guard, stationed on the comcen at $ED59-$ED69."
   ]
  },
  "0474": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 group id, AI slot 28 = unit 78 (RIDER): group 3 - one of the three flank groups, any of which $EC9C may pick as the home guard"
  },
  "0480": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 group id, AI slot 40 = unit 90 (BOOMER): group 4 - the spearhead group named by mainGroupByPlanTable ($EC00)"
  },
  "0486": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 group id, AI slot 46 = unit 96 (SPY): group 3 - one of the three flank groups, any of which $EC9C may pick as the home guard"
  },
  "0232": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 0 destination column, AI slot 0 = unit 50 (RIDER): $21 = column 33 (unchanged: the cell it starts on)",
   "block": [
    "$0232-$0263 - play 0 destination columns, one per AI slot, copied to unitDestCol[50+slot] ($F802) at $ECF8-$ECFA.  The ten skirmishers are fanned across the field at columns $21,$19,$18,$14,$10,$0F,$07 (slots 0-6) with slots 7-9 at $14,$15,$13; only slots 1,2,4,5,8 and 9 actually differ from template 2's start columns.  Slots 10-48 still hold template 2's start columns for units that do not exist in a SCRIMAGE and are never acted on."
   ]
  },
  "0264": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 0 destination row, AI slot 0 = unit 50 (RIDER): $12 = row 18 (unchanged: the cell it starts on)",
   "block": [
    "$0264-$0295 - play 0 destination rows, copied to unitDestRow[50+slot] ($F866) at $ECFD-$ECFF.  Slots 0-6 are ordered to row $12 = 18, the last row but one of the AI's own half of the map (side 1 owns rows 6-19, the player rows 20-33); slot 7 goes to $10 and slots 8-9 to $0F.  Only slots 8 and 9 differ from template 2's start rows ($0E), so play 0 barely moves anyone - it is really a group-numbering play, and the comcen is left standing on its start cell, column $14 row $0E."
   ]
  },
  "02C8": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 destination column, AI slot 0 = unit 50 (RIDER): $24 = column 36 (starts on $21)",
   "block": [
    "$02C8-$02F9 - play 1 destination columns.  The ten defenders are spread into a picket line right across the battlefield: slots 0-6 at columns $24,$1C,$18,$14,$10,$0C,$04 (eight cells apart at the edges), slot 7 in the middle at $14 and slots 8-9 pushed out to the flanks at $20 and $08.  Eight of the ten differ from their template start columns - the widest spread of any play.  The comcen keeps column $14."
   ]
  },
  "02FA": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 1 destination row, AI slot 0 = unit 50 (RIDER): $12 = row 18 (unchanged: the cell it starts on)",
   "block": [
    "$02FA-$032B - play 1 destination rows.  Nine of the ten pickets stand on row $12 (slot 7 on $10), and the comcen is ordered forward from its start row $0E to $0C - the only comcen advance either of the two small plays makes, and the reason this is the 'sneak' play.  The array runs on through $0300-$032B, where the tile-rules start-up code and several map-generator variables live in the units that share this page - that is what chops the listing here into single bytes."
   ]
  },
  "035E": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 destination column, AI slot 0 = unit 50 (RIDER): $11 = column 17 (unchanged: the cell it starts on)",
   "block": [
    "$035E-$038F - play 2 destination columns.  The three flank groups keep the columns template 1 started them on - group 1 on $10/$11, group 2 on $19/$1A, group 3 on $22/$23 - while the sixteen spearhead riders (slots 4-11, 16-23) are pulled in from the template's evenly spaced blocks ($13-$1F) into one solid mass on columns $16-$1D.  17 of the 50 entries differ from the template start columns."
   ]
  },
  "0390": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 2 destination row, AI slot 0 = unit 50 (RIDER): $11 = row 17 (unchanged: the cell it starts on)",
   "block": [
    "$0390-$03C1 - play 2 destination rows.  Each of the three flank groups forms a 2x2 block on rows $10/$11 with its spy one row in front on $12; the spearhead sits on rows $0F-$11 with its leading pair at $0F.  The comcen entry ($03C1) orders one row forward, from start row $0E to $0F, but for plans 2-4 that order is thrown away again at $ED4E-$ED56 in favour of the spearhead's random target."
   ]
  },
  "03F4": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 destination column, AI slot 0 = unit 50 (GRUNT): $14 = column 20 (unchanged: the cell it starts on)",
   "block": [
    "$03F4-$0425 - play 3 destination columns.  Every one of the 50 bytes is identical to template 3's side-1 start columns: SLUGGERS is the one play that never sidesteps anybody, it only pushes them forward (see the row array).  The array crosses the page boundary into $0400, where the manual-check answer table and the boot checksum routine of game/scratchAndMessages0400 live, so from here on the listing is broken up by that file's labels."
   ]
  },
  "0426": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 3 destination row, AI slot 0 = unit 50 (GRUNT): $0F = row 15 (starts on $0D)",
   "block": [
    "$0426-$0457 - play 3 destination rows.  The grunt-and-boomer spearhead (slots 0-11 and 24-27) is pushed one to two rows forward of where template 3 stands it, to rows $0C-$0F; the three rider groups keep their start rows $0F-$11 (2x2 blocks with the spy one row in front); and the comcen is ordered from row $09 to $0B.  17 of the 50 rows differ from the template, all of them forward."
   ]
  },
  "048A": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 destination column, AI slot 0 = unit 50 (GRUNT): $10 = column 16 (starts on $06)",
   "block": [
    "$048A-$04BB - play 4 destination columns.  The 34-unit spearhead is compressed into columns $0F-$19 in the middle of the field, and the three rider groups sit out on $05/$06, $13/$14 and $21/$22.  22 of the 50 columns differ from template 0's start columns.  Only $04AE-$04BB of this array is visible as data in the sibling file game/scratchAndMessages0400; $048A-$04AD is the tail of that file's boot checksum routine, which is why the listing here is cut into fragments."
   ]
  },
  "04BC": {
   "unit": "game/trainerPlaybook0200",
   "line": "play 4 destination row, AI slot 0 = unit 50 (GRUNT): $0D = row 13 (unchanged: the cell it starts on)",
   "block": [
    "$04BC-$04ED - play 4 destination rows, the last 50 bytes of the playbook.  The spearhead occupies rows $0A-$10, the rider groups rows $07-$0A (each 2x2 block with its spy one row in front), and the comcen is ordered from its back-row start (template 0: column $13, row $06) forward to row $0B - the longest comcen move of any play.  36 of the 50 rows differ from the template.  As with plays 2 and 3, the scatter at $ED12 translates each group to a random point, so it is these relative offsets that matter, not the absolute cells."
   ]
  },
  "04EE": {
   "unit": "game/trainerPlaybook0200",
   "block": [
    "playbookTail - 18 bytes of padding after the fifth record (5 x 150 = 750 bytes, ending at $04ED), and the only bytes in the file that are not part of a play.  Nothing reads them: the copy loop only ever touches the 150 bytes of the record it selected.  The content is $20,$20 then $06,$01,$13,$14,$0C,$0F,$01,$04 then eight more $20, which in C64 screen codes (screen codes, not PETSCII: 'A' = $01) reads '  FASTLOAD        ' - probably a scrap of the mastering machine's screen memory that happened to be in the sector buffer when the file was written.  The sequence occurs nowhere else on the disk."
   ],
   "line": "18 unused bytes: '  FASTLOAD' plus spaces in screen codes, not playbook data"
  }
 },
 "dataTypes": {
  "0390": [
   "grid",
   50,
   10
  ],
  "03C2": [
   "grid",
   50,
   10
  ],
  "03F4": [
   "grid",
   12,
   12
  ],
  "04AE": [
   "grid",
   14,
   14
  ],
  "04BC": [
   "grid",
   12,
   12
  ],
  "04EE": [
   "grid",
   18,
   18
  ]
 }
}