home *** CD-ROM | disk | FTP | other *** search
/ Revista CD Expert 51 / PCGamer51_17Demos.iso / games / colobotdemo / colobotdemo10e.exe / script / ANTicp.TXT < prev    next >
Text File  |  2001-06-10  |  6KB  |  217 lines

  1. extern void object::Attack( )
  2. {
  3.     int        list[], i;    // liste des objets cherchΘs
  4.     object    target;    // info sur la cible
  5.     point        center;    // coordonnΘes du centre de la zone
  6.     point        lastPos;    // derniΦre position (pr test si bloquΘe)
  7.     float        distCent;    // rayon de la zone
  8.     float        r;        // valeur alΘatoire
  9.     float       distTar;   // distance de la cible
  10.     float       dirTar;    // direction de la cible
  11.     float       mp;        // puissance moteur
  12.     float       tangle;    // angle d'esquive en cas d'eau
  13.     boolean     ifmove;    // si on avance en tirant ou pas
  14.  
  15.     errmode(0);  // ne stoppe pas si erreur
  16.     while ( ismovie() != 0 )  wait(1);
  17.  
  18.     i = 0;
  19.     list[i++] = WingedGrabber;
  20.     list[i++] = TrackedGrabber;
  21.     list[i++] = WheeledGrabber;
  22.     list[i++] = LeggedGrabber;
  23.     list[i++] = WingedShooter;
  24.     list[i++] = TrackedShooter;
  25.     list[i++] = WheeledShooter;
  26.     list[i++] = LeggedShooter;
  27.     list[i++] = WingedOrgaShooter;
  28.     list[i++] = TrackedOrgaShooter;
  29.     list[i++] = WheeledOrgaShooter;
  30.     list[i++] = LeggedOrgaShooter;
  31.     list[i++] = WingedSniffer;
  32.     list[i++] = TrackedSniffer;
  33.     list[i++] = WheeledSniffer;
  34.     list[i++] = LeggedSniffer;
  35.     list[i++] = Thumper;
  36.     list[i++] = PhazerShooter;
  37.     list[i++] = Recycler;
  38.     list[i++] = Shielder;
  39.     list[i++] = Subber;
  40.     list[i++] = Me;
  41.  
  42.     center.x = cmdline(0);    // prend les coordonnΘe
  43.     center.y = cmdline(1);    // du centre de la zone
  44.     center.z = 0;        // α patrouiller
  45.     distCent = cmdline(2);     // rayon de la zone
  46.  
  47.     lastPos = position;    // initialise
  48.     motor(1,1);            // en avant toute
  49.     while (radar(list, 0, 360, 0, 40) == null) // rΘpΦte jusqu'α contact
  50.     {
  51.         target = radar(list, 0, 360, 0, 40);
  52.         if (target == null or topo(position)<0)// pas de cible α proximitΘ
  53.         {                                      // ou pieds dans l'eau
  54.             if (distance2d(position, center) > distCent or topo(position)<0)
  55.             {   // si la fourmi est en dehors de la zone
  56.                 motor(0, 0); //s'arrΩte
  57.                 wait(0.5);   //marque un arrΩt
  58.                 motor (-0.5, -0.5);//recule lentement
  59.                 wait (1.5);  //attend qu'ait reculΘ
  60.                 if (direction(center)>0) motor (0,1); else motor (1,0);
  61.                 do wait(0.2); //tourne vers le centre
  62.                 while (direction(center) > 20 
  63.                     or direction(center) < -20);
  64.                     //tant que pas orientΘ vers le centre
  65.                 motor (1, 1); //puis en avant toute
  66.                 do 
  67.                 {
  68.                     lastPos = position;
  69.                     wait(0.5); //tant que pas dans la zone
  70.                     if (distance2d(lastPos, position) < 0.2)
  71.                     {   //si elle est bloquΘe par obstacle
  72.                         turn(rand()*360-180);
  73.                         motor(1,1);
  74.                         wait(1);
  75.                         turn(direction(center));
  76.                     }
  77.                 }
  78.                 while (distance2d(position, center) > distCent or topo(position)<0);
  79.             }
  80.             else
  81.             {   //si elle est bien dans la zone
  82.                 if (distance2d(lastPos, position) < 0.2)
  83.                 {   //si elle est bloquΘe par obstacle
  84.                     turn(rand()*360-180);
  85.                     motor(1,1);
  86.                     wait(1);
  87.                 }
  88.                 r = rand();
  89.                 if (r > 0.9)
  90.                 {  //dans un cas sur dix
  91.                     motor (1, 0.5);// tourne α droite
  92.                     wait(rand()*3);// pendant un moment
  93.                     motor (1, 1);  // puis tout droit
  94.                 }
  95.                 if (r < 0.1)
  96.                 {   //dans un cas sur dix
  97.                     motor (0.5, 1);// tourne α gauche
  98.                     wait(rand()*3);// pendant un moment
  99.                     motor (1, 1);  // puis tout droit
  100.                 }
  101.                 lastPos = position;
  102.                 wait(0.2);          //attend un moment
  103.             }
  104.         }
  105.         else
  106.         {   // si cible α proximitΘ
  107.             turn(direction(target.position));
  108.             fire(target.position); // tourne vers la cible
  109.             fire(target.position); // et tire deux fois
  110.             motor(1,1);            // avance
  111.             wait(1.5);             // pendant 1.5 s
  112.         }
  113.     }
  114.  
  115.     //a eu un contact avec l'astronaute
  116.     lastPos = position;    // initialise
  117.     ifmove = true;
  118.     while ( true )        // rΘpΦte α l'infini
  119.     {
  120.         target = radar(list);
  121.         dirTar = direction(target.position);
  122.         distTar = distance(position, target.position);
  123.         if (target != null)
  124.         {
  125.             if(distTar<40)
  126.             {
  127.                 turn(dirTar);
  128.                 fire(target.position);
  129.                 target = radar(list);
  130.                 turn(direction(target.position));
  131.                 for(int i=0; i<3; i=i+1)
  132.                 {
  133.                     if(topo(position)<1.5 or distance(position, target.position) < 8 or !ifmove)
  134.                     {
  135.                         ifmove = false;
  136.                     }
  137.                     else
  138.                     {
  139.                         lastPos = position;
  140.                         motor(1,1);
  141.                         wait(1);
  142.                         if (distance(position, lastPos) < 0.2) ifmove = false;
  143.                     }
  144.                 }
  145.             }
  146.             else
  147.             {
  148.                 ifmove = true;
  149.                 if (distance(lastPos, position) < 0.2)
  150.                 {   //si elle est bloquΘe par obstacle
  151.                     lastPos = position;
  152.                     turn(rand()*360-180);
  153.                     motor(1,1);
  154.                     wait(1);
  155.                     target = radar(list);
  156.                     turn(direction(target.position));
  157.                 }
  158.                 else
  159.                 {
  160.                     lastPos = position;
  161.                     if (topo(position)>1.5)
  162.                     {
  163.                         mp = direction(target.position)/180;
  164.                         //if (mp>1) mp = 1;
  165.                         //if (mp<-1) mp = -1;
  166.                         if (mp>0)
  167.                         {
  168.                             motor(1-mp,1);
  169.                         }
  170.                         else
  171.                         {
  172.                             motor(1,1+mp);
  173.                         }
  174.                         wait(1);
  175.                     }
  176.                     else
  177.                     {
  178.                         motor (-0.5, -0.5);
  179.                         wait(1.5);
  180.                         target = radar(list);
  181.                         turn(direction(target.position));
  182.                         tangle = 0;
  183.                         do
  184.                         {
  185.                             tangle = tangle + 22.5;
  186.                             if (tp(tangle) == 0) break;
  187.                             tangle = -tangle;
  188.                             if (tp(tangle) == 0) break;
  189.                             tangle = -tangle;
  190.                             if (tangle > 180) break;
  191.                         }
  192.                         while (true);
  193.                         turn(tangle);
  194.                         motor(1,1);
  195.                         wait(2);
  196.                     }
  197.                 }
  198.             }
  199.         }
  200.         else
  201.         {
  202.             wait(1);
  203.         }
  204.     }
  205. }
  206.  
  207. int object::tp(float angle)
  208. {
  209.     point tpoint;
  210.  
  211.     tpoint.x = position.x + cos(orientation + angle)*10;
  212.     tpoint.y = position.y + sin(orientation + angle)*10;
  213.     tpoint.z = 0;
  214.     if (topo(tpoint) < 2) return(1); else return(0);
  215. }
  216.  
  217.