extern void object::Attack( )
{
	int		list[], i;	// liste des objets cherchés
	object	target;	// info sur la cible
	point		center;	// coordonnées du centre de la zone
	point		lastPos;	// dernière position (pr test si bloquée)
	float       distCent;	// rayon de la zone
	float       distLim;	// rayon à ne pas dépasser
	float		r;		// valeur aléatoire

	errmode(0);  // ne stoppe pas si erreur
	while ( ismovie() != 0 )  wait(1);

	i = 0;
	list[i++] = WingedGrabber;
	list[i++] = TrackedGrabber;
	list[i++] = WheeledGrabber;
	list[i++] = LeggedGrabber;
	list[i++] = WingedShooter;
	list[i++] = TrackedShooter;
	list[i++] = WheeledShooter;
	list[i++] = LeggedShooter;
	list[i++] = WingedOrgaShooter;
	list[i++] = TrackedOrgaShooter;
	list[i++] = WheeledOrgaShooter;
	list[i++] = LeggedOrgaShooter;
	list[i++] = WingedSniffer;
	list[i++] = TrackedSniffer;
	list[i++] = WheeledSniffer;
	list[i++] = LeggedSniffer;
	list[i++] = WingedBuilder;
	list[i++] = TrackedBuilder;
	list[i++] = WheeledBuilder;
	list[i++] = LeggedBuilder;
	list[i++] = Thumper;
	list[i++] = PhazerShooter;
	list[i++] = Recycler;
	list[i++] = Shielder;
	list[i++] = Subber;
	list[i++] = Me;

	center.x = cmdline(0);	// prend les coordonnée
	center.y = cmdline(1);	// du centre de la zone
	center.z = 0;		// à exclure
	distCent = cmdline(2); 	// rayon de la zone
	distLim = cmdline(3);

	lastPos = position;	// initialise
	turn(rand()*360-180);
	motor(1,1);			// en avant toute
	while ( true )		// répère à l'infini
	{
		target = radar(list, 0, 360, 0, 40);
		if (target == null or topo(position)<0)// pas de cible à proximité
		{                                      // ou pieds dans l'eau
			if (distance2d(position, center) < distCent
			or distance2d(position, center) > distLim
			or topo(position)<0)
			{   // si la fourmi est dans la zone interdite
				motor(0, 0); //s'arrête
				wait(0.5);   //marque un arrêt
				motor (-0.5, -0.5);//recule lentement
				wait (1.5);  //attend qu'ait reculé
				if (distance2d(position, center) < distCent+20)
				{     //si trop proche du centre
					if (direction(center)>0) turn(direction(center)-180); else turn(direction(center)+180);
					motor (1, 1); //puis en avant toute
					do 
					{
						wait(1);
					}
					while (distance2d(position, center) < distCent or topo(position)<0);
				}
				else
				{          //si trop loin du centre
					turn(direction(center));
					motor (1, 1); //puis en avant toute
					do 
					{
						wait(1); //tant que pas dans la zone
						if (radar(TargetBot, 0, 360, 0, 30) != null)
						{
							BeScared();
							break;
						}
					}
					while (distance2d(position, center) > distLim or topo(position)<0);
				}
			}
			else
			{   //si elle est bien dans la zone
				if (distance2d(lastPos, position) < 0.2)
				{   //si elle est bloquée par obstacle
					turn(rand()*360-180);
					motor(1,1);
					wait(1);
				}
				r = rand();
				if (r > 0.7)
				{  //dans un cas sur dix
					motor (1, 0.8);// tourne à droite
					wait(rand()*3);// pendant un moment
					motor (1, 1);  // puis tout droit
				}
				if (r < 0.3)
				{   //dans un cas sur dix
					motor (0.8, 1);// tourne à gauche
					wait(rand()*3);// pendant un moment
					motor (1, 1);  // puis tout droit
				}
				lastPos = position;
				wait(1);          //attend un moment
			}
		}
		else
		{   // si cible à proximité
			if (radar(TargetBot, 0, 360, 0, 30) != null)
			{
				BeScared();
				continue;
			}
			turn(direction(target.position));
			fire(target.position); // et tire deux fois
			motor(1,1);            // avance
			wait(1.5);             // pendant 1.5 s
		}
	}
}

void object::BeScared()
{
	object p = radar(TargetBot, 0, 360, 0, 30);
	point dest;
	float dist, prox;

	if ( p != null )
	{
		dist = distance(p.position, position);
		if ( dist < 5 )
		{
			fire(p.position);
		}
		else
		{
			prox = dist+5;  // fuite
			dest.x = (position.x-p.position.x)*prox/dist + p.position.x;
			dest.y = (position.y-p.position.y)*prox/dist + p.position.y;
			dest.z = (position.z-p.position.z)*prox/dist + p.position.z;
			goto(dest);
		}
	}
}
