%%%
% Cibles
%%%
\def\filedateCible{2025/05/28}%
\def\fileversionCible{0.1b}%
\message{-- \filedateCible\space v\fileversionCible}%
%
\newtoks\toklisteciblea%
\newtoks\toklistecibleb%
\def\UpdatetoksCibleA#1\nil{\addtotok\toklisteciblea{"#1",}}%
\def\UpdatetoksCibleB#1/#2\nil{\addtotok\toklistecibleb{#1,#2,}}%

\setKVdefault[Cible]{RayonBase=5mm,Ecart=5mm,Flechettes=false,RayonF=2.5cm,Impression=false,Tir=false,Unique=false,Tirs={}}%
\defKV[Cible]{Tirs=\ifempty{#1}{}{\setKV[Cible]{Tir}}}%

\NewDocumentCommand\Cible{om}{%
  \useKVdefault[Cible]%
  \setKV[Cible]{#1}%
  \toklisteciblea{}%
  \toklistecibleb{}%
  \xdef\PfCNombreZone{0}%
  \ifboolKV[Cible]{Flechettes}{}{%
    \setsepchar{,}%
    \readlist*\PfCListeCible{#2}%
    \foreachitem\compteur\in\PfCListeCible{\expandafter\UpdatetoksCibleA\compteur\nil}%
    \xdef\PfCNombreZone{\PfCListeCiblelen}%
  }%
  \ifboolKV[Cible]{Tir}{%
      \xdef\PfCListeCibleTirsAv{\useKV[Cible]{Tirs}}
      \setsepchar[*]{,*/}%
      \readlist*\PfCListeCibleTirs{\PfCListeCibleTirsAv}
      \foreachitem\compteur\in\PfCListeCibleTirs{\expandafter\UpdatetoksCibleB\compteur\nil}%
  }{}
  \BuildCible{\the\toklisteciblea}{\the\toklistecibleb}%
}%

\NewDocumentCommand\BuildCible{mm}{%
    \mplibforcehmode%
    \begin{mplibcode}
      Rayon=\useKV[Cible]{RayonBase};
      Ecart=\useKV[Cible]{Ecart};
      boolean Flechettes,Impression,Tir,Unique;
      Flechettes=\useKV[Cible]{Flechettes};
      Impression=\useKV[Cible]{Impression};
      Tir=\useKV[Cible]{Tir};
      Unique=\useKV[Cible]{Unique};
      NombreCercles=\PfCNombreZone;
      
      vardef affichage(text t)=
      pair O;
      O=u*(5,5);
      for k=NombreCercles downto 1:
      if (k mod 2)=0:
      fill cercles(O,Rayon+(k-1)*Ecart) withcolor 0.7white;
      else:
      fill cercles(O,Rayon+(k-1)*Ecart) withcolor white;
      fi;
      endfor;
      for k=1 upto NombreCercles:
      trace cercles(O,Rayon+(k-1)*Ecart);
      endfor;
      n:=0;
      for p_=t:
      n:=n+1;
      if n=NombreCercles:
      label(TEX(p_),O);
      else:
      label(TEX(p_),O+Rayon*(0,1)+(NombreCercles-0.5-n)*(0,Ecart));
      if Unique=false:
      label(TEX(p_),O-Rayon*(0,1)-(NombreCercles-0.5-n)*(0,Ecart));
      fi;
      fi;
      endfor;
      enddef;

      vardef affichageflechettes=
      pair O;
      O=u*(5,5);
      RayonBase=\useKV[Cible]{RayonF};
      RayonA=(170/(0.5*451))*RayonBase;
      RayonI=0.5*(RayonBase+RayonA);
      RayonAa=(162/(0.5*451))*RayonBase;
      RayonB=(107/(0.5*451))*RayonBase;
      RayonBb=(99/(0.5*451))*RayonBase;
      RayonC=(32/(0.5*451))*RayonBase;
      RayonD=(12.7/(0.5*451))*RayonBase;
      path cbase,ca,caa,cb,cbb,cc,cd;
      cbase=cercles(O,RayonBase);
      ca=cercles(O,RayonA);
      caa=cercles(O,RayonAa);
      cb=cercles(O,RayonB);
      cbb=cercles(O,RayonBb);
      cc=cercles(O,RayonC);
      cd=cercles(O,RayonD);
      fill cbase;
      pair A[],Aa[],B[],Bb[],C[],D[],E[];
      for k=1 upto 21:
      A[k]=pointarc(ca,9+(k-1)*18);
      Aa[k]=pointarc(caa,9+(k-1)*18);
      B[k]=pointarc(cb,9+(k-1)*18);
      Bb[k]=pointarc(cbb,9+(k-1)*18);
      C[k]=pointarc(cc,9+(k-1)*18);
      D[k]=pointarc(cd,9+(k-1)*18);
      E[k]=pointarc(cercles(O,RayonI),(k-1)*18);
      endfor;
      for k=2 step 2 until 20:
      fill O--A[k]--arccercle(A[k],A[k+1],O)--cycle withcolor white;
      endfor;
      for k=1 upto 20:
      if (k mod 2)=1:
      fill Aa[k]--A[k]--arccercle(A[k],A[k+1],O)--reverse(arccercle(Aa[k],Aa[k+1],O))--cycle withcolor if Impression:0.4white else: Crimson fi;
      fill Bb[k]--B[k]--arccercle(B[k],B[k+1],O)--reverse(arccercle(Bb[k],Bb[k+1],O))--cycle withcolor if Impression:0.4white else: Crimson fi;
      else:
      fill Aa[k]--A[k]--arccercle(A[k],A[k+1],O)--reverse(arccercle(Aa[k],Aa[k+1],O))--cycle withcolor if Impression:0.8white else: LightGreen fi;
      fill Bb[k]--B[k]--arccercle(B[k],B[k+1],O)--reverse(arccercle(Bb[k],Bb[k+1],O))--cycle withcolor if Impression:0.8white else: LightGreen fi;
      fi;
      endfor;
      fill cc withcolor if Impression:0.8white else: LightGreen fi;
      fill cd withcolor if Impression:0.4white else: Crimson fi;
      trace ca withcolor white;
      trace caa withcolor white;
      trace cb withcolor white;
      trace cbb withcolor white;
      trace cc withcolor white;
      trace cd withcolor white;
      enddef;

      vardef affichagetexteflechettes(text t)=
      drawoptions(withcolor white);
      n:=0;
      for p_=t:
      n:=n+1;
      label(TEX("\bfseries "&p_),E[n]);
      endfor;
      enddef;

      vardef affichagetir(text t)=
      numeric numerozone[];
      numeric nbtirszone[];
      n:=0;
      for p_=t:
      n:=n+1;
      if (n mod 2)=1:
      nbtirszone[(n div 2)+1]=p_;
      else:
      numerozone[(n div 2)]=p_;
      fi;
      endfor;
      n:=n div 2;
      for k=1 upto n:
      for l=1 upto nbtirszone[k]:
      if numerozone[k]=1:
      fill rotation((fullcircle scaled 1mm) shifted (O+(0.6+uniformdeviate(0.2))*(Rayon,0)),O,l*25+(-5+uniformdeviate(10)));
      else:
      fill rotation((fullcircle scaled 1mm) shifted (O+Rayon*(1,0)+(0.6+uniformdeviate(0.2))*((numerozone[k]-1)*Ecart,0)),O,l*50+(-5+uniformdeviate(10)));
      fi;
      endfor;
      endfor;
      enddef;
      
      if Flechettes:
      affichageflechettes;
      affichagetexteflechettes("6","13","4","18","1","20","5","12","9","14","11","8","16","7","19","3","17","2","15","10");
      else:
      affichage(#1);
      if Tir:
      affichagetir(#2);
      fi;
      fi;
    \end{mplibcode}
}%
