File: antics.txt

package info (click to toggle)
colobot 0.2.2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 415,536 kB
  • sloc: cpp: 129,246; ansic: 8,872; python: 2,158; sh: 672; awk: 91; xml: 35; makefile: 31
file content (140 lines) | stat: -rw-r--r-- 3,682 bytes parent folder | download | duplicates (3)
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
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

	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 ( 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 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é
				turn(direction(center));
				motor (1, 1); //puis en avant toute
				do 
				{
					if (radar(TargetBot, 0, 360, 0, 30) != null)
					{
						BeScared();
						break;
					}
					lastPos = position;
					wait(1); //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.6)
				{  //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.4)
				{   //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(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); // tourne vers la cible
		}
	}
}

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);
		}
	}
}