This file is indexed.

/usr/share/games/colobot/ai/anticp.txt is in colobot-common 0.1.6-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
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++] = 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);
}