Draw the Stickman Wars
JavaScript (E6) 336 344 356 369 424 478 522 570
Edit 6 Last edit was buggy. Bug fix and shortened. That's all I hope.
Edit 5 Finally found a way to get rid of multiply by 23 - bothered me from start. Plus another change to the input (@William shout when it's too much). Now the function expects one array parameter, containing 2 subarrays. Without this change it's 349 - still an improvement
Edit 4 Shaved some more bytes and a little change to input format.
With the new input format a missing class is represented as an empty array element. So D([1,,2,3,1],[,3,1,1,2]) instead of D([1,0,2,3,1],[0,3,1,1,2]). I think it still obeys the rules.
Edit 3 Golfed more. No changes to the algorithm, but abusing a lot of array.map and local functions to avoid for loops.
Edit 2 String compression, the right way ...
Edit Added string compression, a lot of work and not much gained. Now the mirror stickmen are generated from a template, not stored.
Made a few tries, first running. To be golfed.
NB Kolmogorow-business still to be tackled.
Test In FireFox console. Change 'return' with Add 'alert(...)' to have an output statement (albeit not useful at all)
console.log(D([[1,,2,3,1],[,3,1,1,2]]))
Output
         .       .                                                                 .                 
       .' *.   .' *.                                                             .* '.               
       ' O *   ' O *      O  /   O  /   O  /    O A        A O  A O    \  O      * O '     O   O   O 
 O    ' \|/ . ' \|/ .   |/|\/  |/|\/  |/|\/    /|\|        |/|\ |/|\    \/|\|   . \|/ '   /|\ /|\ /|\
/|\   .  |  * .  |  *   | |    | |    | |       | |        | |  | |       | |   *  |  .    |   |   | 
/ \   './ \*. './ \*.    / \    / \    / \     / \|        |/ \ |/ \     / \    .*/ \.'   / \ / \ / \
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

 
Golfed Code
D=a=&gt;
  (J=v=&gt;v.join(''))((l=[r=n=' ',3,6,13,19,23]).map(_=&gt;f=(F=f=&gt;J(a[f].map((c,q)=&gt;
  (&quot;9.299.' *.87O2' O *3O21 O A O 1|0' 0|1 .|1|01 1|0|1|0 | .2|2*| |4| |1 01 0'.1 0*. 1 021 0|&quot;[R='replace'](/[2-9]/g,x=&gt;n.repeat(x))
   .slice(l[q]-r,l[q+1]-r)[R](/\d/g,x=&gt;'\\/'[x^f])+n).repeat(c)+n+n
  ))+n)(0)+J([...F(1)].reverse(r-=23))+'\n'))+f[R](/./g,'¯')

Code (edit 2)
D=(a,b)=&gt;{
  F=(s,f)=&gt;(s=s[R](/\d/g,x=&gt;'/\\'[x^f]),f?s:[...s].reverse().join('')),
  v=&quot;9.299.' *.87O2' O *3O21 O A O 1|0' 0|1 .|1|01 1|0|1|0 | .2|2*| |4| |1 01 0'.1 0*. 1 021 0|&quot;
    [R='replace'](/\d/g,x=&gt;x&gt;1?' '.repeat(x):x),
  l=[0,3,6,13,19,23];
  for(o='',r=0;v[r];r+=23,f=F(z,1)+'  '+F(w,0),o+=f+'\n',f=f[R](/./g,'¯'))
    for(z=w=p='';p&lt;10;++p)
      if(c=(p&lt;5?a:b)[q=p%5])x=(v.slice(r+l[q],r+l[q+1])+' ').repeat(c)+'  ',p&lt;5?z+=x:w+=x
  return o+f
}

Ungolfed code (1st version)
D=(a,b)=&gt;{
  v=&quot;         .                .                    .' *.            .* '.               O  ' O *   O  / O A * O ' \\  O  A O  O /|\\' \\|/ .|/|\\/ /|\\|. \\|/ ' \\/|\\||/|\\/|\\ | .  |  *| |    | |*  |  .   | || | / \\/ \\'./ \\*. / \\  / \\|.*/ \\'.  / \\ |/ \\&quot;
  l=[0,3,6,13,19,23,30,36,40]
  o=''
  for(r=0;r&lt;6;++r)
  {
    z=w=''
    for(p=0;p&lt;10;p++)
    {
      c=a[p]||b[p-5];
      if (c)
      {
        q = p&lt;7 ? p%5 : p-2
        x = (v.slice(r*40+l[q],r*40+l[q+1])+' ').repeat(c)
        if (p&lt;5) 
          z+=x+'  ';
        else 
          w=x+'  '+w
      }
    }
    f = z + '     ' + w
    o += f + '\n'
    f = '¯'.repeat(f.length-3)
  }
  return o+f
}