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		r;		// valeur aléatoire
	float       distTar;   // distance de la cible
	float       dirTar;    // direction de la cible
	float       mp;        // puissance moteur
	float       tangle;    // angle d'esquive en cas d'eau
	boolean     ifmove;    // si on avance en tirant ou pas

	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;		// à patrouiller
	distCent = cmdline(2); 	// rayon de la zone

	lastPos = position;	// initialise
	motor(1,1);			// en avant toute
	while (radar(list, 0, 360, 0, 40) == null) // répète jusqu'à contact
	{
		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 topo(position)<0)
			{   // si la fourmi est en dehors de la zone
				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 (direction(center)>0) motor (0,1); else motor (1,0);
				do wait(0.2); //tourne vers le centre
				while (direction(center) > 20 
					or direction(center) < -20);
					//tant que pas orienté vers le centre
				motor (1, 1); //puis en avant toute
				do 
				{
					lastPos = position;
					wait(0.5); //tant que pas 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);
						turn(direction(center));
					}
				}
				while (distance2d(position, center) > distCent 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.9)
				{  //dans un cas sur dix
					motor (1, 0.5);// tourne à droite
					wait(rand()*3);// pendant un moment
					motor (1, 1);  // puis tout droit
				}
				if (r < 0.1)
				{   //dans un cas sur dix
					motor (0.5, 1);// tourne à gauche
					wait(rand()*3);// pendant un moment
					motor (1, 1);  // puis tout droit
				}
				lastPos = position;
				wait(0.2);          //attend un moment
			}
		}
		else
		{   // si cible à proximité
			turn(direction(target.position));
			fire(target.position); // tourne vers la cible
			fire(target.position); // et tire deux fois
			motor(1,1);            // avance
			wait(1.5);             // pendant 1.5 s
		}
	}

	//a eu un contact avec l'astronaute
	lastPos = position;	// initialise
	ifmove = true;
	while ( true )		// répète à l'infini
	{
		target = radar(list);
		dirTar = direction(target.position);
		distTar = distance(position, target.position);
		if (target != null)
		{
			if(distTar<40)
			{
				turn(dirTar);
				fire(target.position);
				target = radar(list);
				turn(direction(target.position));
				for(int i=0; i<3; i=i+1)
				{
					if(topo(position)<1.5 or distance(position, target.position) < 8 or !ifmove)
					{
						ifmove = false;
					}
					else
					{
						lastPos = position;
						motor(1,1);
						wait(1);
						if (distance(position, lastPos) < 0.2) ifmove = false;
					}
				}
			}
			else
			{
				ifmove = true;
				if (distance(lastPos, position) < 0.2)
				{   //si elle est bloquée par obstacle
					lastPos = position;
					turn(rand()*360-180);
					motor(1,1);
					wait(1);
					target = radar(list);
					turn(direction(target.position));
				}
				else
				{
					lastPos = position;
					if (topo(position)>1.5)
					{
						mp = direction(target.position)/180;
						//if (mp>1) mp = 1;
						//if (mp<-1) mp = -1;
						if (mp>0)
						{
							motor(1-mp,1);
						}
						else
						{
							motor(1,1+mp);
						}
						wait(1);
					}
					else
					{
						motor (-0.5, -0.5);
						wait(1.5);
						target = radar(list);
						turn(direction(target.position));
						tangle = 0;
						do
						{
							tangle = tangle + 22.5;
							if (tp(tangle) == 0) break;
							tangle = -tangle;
							if (tp(tangle) == 0) break;
							tangle = -tangle;
							if (tangle > 180) break;
						}
						while (true);
						turn(tangle);
						motor(1,1);
						wait(2);
					}
				}
			}
		}
		else
		{
			wait(1);
		}
	}
}

int object::tp(float angle)
{
	point tpoint;

	tpoint.x = position.x + cos(orientation + angle)*10;
	tpoint.y = position.y + sin(orientation + angle)*10;
	tpoint.z = 0;
	if (topo(tpoint) < 2) return(1); else return(0);
}

