# mission4a.adb

    with KakoRobot, Gada.Text_IO ;

    procedure Mission4a is

       package K renames KakoRobot ;
       package Txt renames Gada.Text_IO ;

       -- Calcule la distance entre un robot et la cible
       --
       -- Variante acceptable : la distance comme somme de valeurs absolue
       -- (au lieu de racine de somme de carrés).
       function Distance (Num : Integer) return Float is
          Sum2 : Integer ;
       begin
          Sum2 :=
            (K.Loc_Robot(Num).X - K.Loc_Cible.X)**2 +
            (K.Loc_Robot(Num).Y - K.Loc_Cible.Y)**2 ;
          return K.SQRT(Float(Sum2)) ;
       end Distance ;

       -- Test : afficher la distance pour chaque robot
       procedure Tester_Distance is
       begin
          for I in 1..K.Nombre_Robots loop
             Txt.Put_Line ("Distance du robot " & Integer'Image(I) &
                           " à la cible : " & Float'Image(Distance(I))) ;
          end loop ;
       end Tester_Distance ;

       -- Indique si tous les robots sont arrivés
       function Tous_Arrives return Boolean is
          Tous_Ok : Boolean := True ;
       begin
          for I in 1..K.Nombre_Robots loop
             if K.Etat(I) /= 2 then Tous_OK := false ;
             end if ;
          end loop ;
          return Tous_OK ;
       end Tous_Arrives ;

       -- Renvoie le numéro du robot le plus loin de la cible
       function Plus_Loin return Integer is
          Dist_Max : Float := 0.0 ;
          Num_Max : Integer := 1 ;
       begin
          for I in 1..K.Nombre_Robots loop
             if Distance(I) > Dist_Max and K.Etat(I) /= 2 then
                Num_Max := I ;
                Dist_Max := Distance(I) ;
             end if ;
          end loop ;
          return Num_Max ;
       end Plus_Loin ;

       -- Itinéraire pour rejoindre la cible :
       --   monter jusqu'à la première ligne
       --   puis aller à gauche ou à droite vers la cible
       procedure Bouger_Vers_Cible (Num : Integer) is
       begin
          if K.Loc_Robot(Num).Y = 0 then
             if K.Loc_Robot(Num).X < K.Loc_Cible.X then
                K.Deplacer(Num, K.Est) ;
             else
                K.Deplacer(Num, K.Ouest) ;
             end if ;
          else
             K.Deplacer(Num, K.Nord) ;
          end if ;
       end Bouger_Vers_Cible ;

    begin

       Tester_Distance ;

       -- Le robot le plus lointain bouge
       -- ceci, jusqu'à ce que tous soient contents
       while not Tous_Arrives loop
          Bouger_Vers_Cible(Plus_Loin) ;
       end loop ;

    end Mission4a ;