2001/megazai.r
001 | /* |
002 | Nome del robot : MegaZai.r |
003 | Autore : Alessandro Tassara |
004 |
005 | Raffazzonato in poco piu' di una mattinata, AltroZai � un'evoluzione del poco |
006 | performante NewZai17, di cui mantiene quasi invariata la struttura generale. |
007 | Scopiazzature piu' o meno evidenti provengono da Daryl e Vegeth. |
008 | Spulciando nel listato inoltre, si possono ancora rinvenire arcaici riferimenti |
009 | al vecchio AleZai17, a Son-Goku, Arale e persino al vetusto Jedi. |
010 | Per prima cosa all'inizio della partita, raggiunto l'angolo piu' vicino, conta |
011 | i nemici, e se ne ha solo uno attacca. |
012 | Non sta mai fermo, dal momento che tale comportamento non e' assolutamente |
013 | raccomandabile, vista la brutta aria che tira ultimamente nell'universo |
014 | crobotico: pare infatti che tutti abbiano inspiegabili tendenze maniaco persecutorie |
015 | verso gli altri amici che giocherellano nell'arena. |
016 | Oscilla alternativamente in direzione di un nemico (inclinato di 15 gradi, come Daryl) |
017 | o brevemente lungo la diagonale (in stile dav46): la scelta � dettata dalla vicinanza |
018 | dell'avversario. |
019 | Anche questa volta l'ampiezza dell'oscillazione lunga viene calcolata al volo, prestando |
020 | attenzione a non arrivare mai a meno di 600 metri dal nemico. |
021 | Quando non ne puo' piu' di evitare i colpi dei compagnoni li' attorno salta |
022 | su cio' che rimane della gloriosa Peugeot106 (che oramai sta insieme con il fil di ferro ma, |
023 | essendo il budget tiranno, ancora non ha potuto cambiare) e scappa in un altro angolo. |
024 | La routine finale e', una volta di piu' copiata. |
025 | Il donatore e' nienetemeno che il buon Vegeth, che discretamente bene fece |
026 | nella scorsa edizione (e tanto male, quindi, fara' in questa). Qualche modifica |
027 | comunque l'ho fatta, se non altro per non beccare uno 0% tondo tondo. |
028 | */ |
029 |
030 | int oang,ndist,vdist; |
031 | int ang,dir,curx,cury,dan,anni,last,flag4; |
032 | int l,conta; |
033 | int dang, alfa, corr, anco; |
034 | int vang, gira; |
035 |
036 | main() |
037 | { |
038 |
039 | curx=(980*(loc_x()>500)+10); |
040 | cury=(980*(loc_y(anni=20)>500)+10); |
041 | while (1) /*inizia il loop*/ |
042 | { |
043 | dir=(360+((curx-loc_x())<0)*180+ atan (((cury-loc_y())*100000)/(curx-loc_x()))); |
044 | Peugeot(); |
045 |
046 | Vai(); |
047 |
048 | if (((vdist)&&(vdist<770))||(damage()>80)) |
049 | { |
050 | dir+=315; |
051 | while (Loin(curx,cury)<12000) fire(drive (dir,100)); |
052 | } |
053 | else |
054 | { |
055 | if ((vdist=scan(dir,10))>(ndist=scan(dir+270,10))) {ang=dir-10;dir+=280;l=ndist-700;} |
056 | else {ang=(dir-=10);l=vdist-700;} |
057 | if ((l*=l)>70000) l=70000; |
058 | if (l<12000) l=12000; |
059 | drive (dir,100); |
060 | conta=l/6000+1; |
061 | while (--conta) fire2(); |
062 | while (Loin(curx,cury)<l) fire(); |
063 | } |
064 | drive (dir,0); |
065 | while (speed()>49) fire2(); |
066 | } |
067 | } |
068 |
069 | Vai() |
070 | int three,count,odeg; |
071 | { |
072 | if (((++anni)>12)&&(damage()<90)) /*controlla se per caso e' rimasto un solo superstite e in quel caso attacca*/ |
073 | { |
074 |
075 | odeg=dir-89; |
076 | count=(three=16); |
077 | while (three && (count>11)) |
078 | if (scan(odeg+15*((--three)%8),7)) --count; |
079 |
080 | if (count>=14) |
081 | Vegetale(); |
082 | anni=0; |
083 | } |
084 |
085 | if ((dan<damage()-20)||((vdist)&&(vdist<500))) |
086 | { |
087 | if (Scan(dir)) /*controlla se l' angolo precedente e' libero*/ |
088 | { |
089 | Viaggia(); |
090 | } |
091 | else if ((Scan(dir+270))) /*controlla se l' angolo seguente e' libero*/ |
092 | { |
093 | dir+=270; |
094 | Viaggia(); |
095 | } |
096 | /* else if (Scan(dir+315)) |
097 | { |
098 | dir+=315; |
099 | cury=1000-cury; |
100 | Viaggia(); |
101 | } |
102 | */ dan=damage(); |
103 | } |
104 | } |
105 |
106 | Viaggia() |
107 | { |
108 | if ( sin (dir)) cury=1000-cury; /*calcola le nuove coordinate delle destinazioni*/ |
109 | if ( cos (dir)) curx=1000-curx; |
110 | Peugeot(); /*va a destinazione*/ |
111 | } |
112 |
113 | Peugeot() /*Si sposta verso le coordinate date*/ |
114 | { |
115 | drive(dir,100); |
116 | while ((Loin(curx,cury)>27000)&&(speed())) |
117 | if (vdist>700) fire(); |
118 | else fire2(); /*quando e' lontano dai bordi usa le routine di Jedi*/ |
119 | drive(dir,80); |
120 | while ((Loin(curx,cury)>11000)&&(speed())) |
121 | fire2(); /*quando e' vicino ai bordi usa le routine di Drago6*/ |
122 |
123 | while (Loin(curx,cury)>3500); |
124 | while (speed()>49) fire2(drive (dir,0)); |
125 |
126 | if (loc_x()<500) if (loc_y()<500) dir=90; else dir=0; |
127 | else if (loc_y()<500) dir=180; else dir=270; |
128 | } |
129 |
130 | /* Utilities per raccogliere il codice */ |
131 |
132 | Scan(i) |
133 | int i; |
134 | { |
135 | return ((scan(i+350,10)+scan(i+10,10))<400); /*effettua una scansione allargata di 14 gradi*/ |
136 | } |
137 |
138 |
139 | Loin(nx,ny) /*da Son-Goku (ciao Simo)*/ |
140 | int nx, ny; |
141 | { |
142 | return (((nx-=loc_x())*nx+(ny-=loc_y())*ny)); |
143 | } |
144 |
145 | /* Le routines d'attacco */ |
146 |
147 | fire() /* fire() - routine di sparo in movimento - generoso lascito di nonno Jedi, con un'aggiunta di Coppi e una di Vegeth */ |
148 | { |
149 | if (vdist=scan(ang,10)) |
150 | { |
151 | if (vdist<200) |
152 | return fire2(); |
153 |
154 | if (!scan(ang-=5,10)) ang+=10; |
155 |
156 | if (scan(ang+354,1)) ang+=354; /*tranne questo che viene da Coppi*/ |
157 | if (scan(ang+6, 1)) ang+=6; |
158 | if (scan(ang+356,1)) ang+=356; |
159 | if (scan(ang+4, 1)) ang+=4; |
160 | if (scan(ang+358,1)) ang+=358; |
161 | if (scan(ang+2, 1)) ang+=2; |
162 |
163 | if (vdist=scan(oang=ang,5)) |
164 | { |
165 | if (scan(ang+354,1)) ang+=354; |
166 | if (scan(ang+6, 1)) ang+=6; |
167 | if (scan(ang+356,1)) ang+=356; |
168 | if (scan(ang+4, 1)) ang+=4; |
169 | if (scan(ang+358,1)) ang+=358; |
170 | if (scan(ang+2, 1)) ang+=2; |
171 |
172 | if (ndist=scan(ang,10)) |
173 | { |
174 | /*da Vegeth*/ |
175 | cannon((oang+(ang-oang)*3-( sin (ang-dir)/19500)),(ndist*160/(160+vdist-ndist-( cos (ang-dir)/4167)))); |
176 | } |
177 | } |
178 | else fire2(); |
179 | } |
180 | else Dove(); |
181 | } |
182 |
183 | fire2() /*da Drago6*/ |
184 | { |
185 | if ((vdist=scan(ang,10))&&(vdist<770)) |
186 | { |
187 | if (!scan(ang+=355,5)) ang+=10; |
188 | if (!scan(ang+=357,3)) ang+=6; |
189 | cannon(ang,3*scan(ang,10)-2*vdist); |
190 | } |
191 | else |
192 | if ((ndist=scan(ang+=340,10))) |
193 | cannon(ang,ndist); |
194 | else |
195 | if ((ndist=scan(ang+=40,10))) |
196 | cannon(ang,ndist); |
197 | else |
198 | if ((ndist=scan(ang+=300,10))) |
199 | cannon(ang,ndist); |
200 | else |
201 | if ((ndist=scan(ang+=80,10))) |
202 | cannon(ang,ndist); |
203 | else |
204 | return (ang+=40); |
205 | } |
206 |
207 | Dove() /*da Coppi, ma almeno qui c' e' del mio*/ |
208 | { |
209 | if ((ndist=scan(ang+339,10))) cannon (ang+=339,ndist); |
210 | else if ((ndist=scan(ang+21,10))) cannon (ang+=21,ndist); |
211 | else if (ndist=scan(dir,10)) |
212 | cannon (ang=dir,scan(ang,10)); |
213 | else return (ang+=40); |
214 | } |
215 |
216 | Stop() /*Procedura di rallentamento speciale*/ |
217 | { |
218 | drive (dir,40); |
219 | ang+=10; |
220 | while (!scan(ang+=21,10)); |
221 | fire2(); |
222 | } |
223 |
224 | Vegetale() |
225 | int z; |
226 | { |
227 | fuoco(vang=dir+315); |
228 | fuoco(vang); |
229 | fuoco(vang); |
230 | fuoco(vang); |
231 | fuoco(vang); |
232 | vang=((ang+180)/90)*90; |
233 | while (fuoco(vang+50)) |
234 | { |
235 | fuoco(vang-50); |
236 | if (((loc_x()%750)<250)||(z=((loc_y()%750)<250))) |
237 | { |
238 | if (vdist) cannon(ang+(ang-oang)*3,vdist); |
239 | vang=180*(!z)*(loc_x(gira=3)>500)+(90+180*(loc_y()>500))*z; |
240 | dan=damage(); |
241 | } |
242 | else |
243 | { |
244 | if (--gira); |
245 | else |
246 | { |
247 | vang=((ang+180)/90)*90+90; |
248 | gira=3; |
249 | dan=damage(); |
250 | while (dan==damage()) |
251 | { |
252 | fuoco(vang+90); |
253 | fuoco(vang-90); |
254 | } |
255 | } |
256 | } |
257 | } |
258 | } |
259 |
260 |
261 | TrovaAura() |
262 | { |
263 | if (TrovaB()) return 1; |
264 | if (TrovaB(ang-=19)) return 1; |
265 | if (TrovaB(ang+=38)) return 1; |
266 | return 0; |
267 | } |
268 |
269 |
270 | TrovaB() |
271 |
272 | { |
273 |
274 | if ( vdist = scan(ang,10) ) |
275 | { if ( scan(ang+6,5) ) |
276 | { if ( scan(ang+2,2) ) |
277 | { if ( scan(ang+4,1) ) |
278 | { if ( scan(ang+3,0) ) |
279 | ang+=3; |
280 | else |
281 | ang+=4; |
282 | } |
283 | else |
284 | if ( scan(ang+2,0) ) |
285 | ang+=2; |
286 | else |
287 | ang+=1; |
288 | } |
289 | else |
290 | { if ( scan(ang+8,1) ) |
291 | { if ( scan(ang+7,0) ) |
292 | ang+=7; |
293 | else |
294 | ang+=9; |
295 | } |
296 | else |
297 | if ( scan(ang+6,0) ) |
298 | ang+=6; |
299 | else |
300 | ang+=5; |
301 | } |
302 | } |
303 | else |
304 | { if ( scan (ang-1,2) ) |
305 | { if ( scan(ang-3,1) ) |
306 | { if ( scan(ang-2,0) ) |
307 | ang-=2; |
308 | else |
309 | ang-=3; |
310 | } |
311 | else |
312 | if ( scan(ang-1,0) ) |
313 | ang-=1; |
314 | else |
315 | ang-=0; |
316 | } |
317 | else |
318 | { if ( scan(ang-4,1) ) |
319 | { if ( scan(ang-5,0) ) |
320 | ang-=5; |
321 | else |
322 | ang-=4; |
323 | } |
324 | else |
325 | if ( scan(ang-6,1) ) |
326 | ang-=6; |
327 | else |
328 | ang-=8; |
329 | } |
330 | } |
331 | return 1; |
332 | } |
333 | return 0; |
334 | } |
335 |
336 | /*Procedure di fuoco*/ |
337 |
338 | fuoco(a) |
339 | int a; |
340 | { |
341 | drive (dir=a,100); |
342 | if (TrovaAura()) |
343 | { |
344 | drive(dir,100); |
345 | GenkiDama(); |
346 | } |
347 | else |
348 | Stop(); |
349 | } |
350 |
351 | GenkiDama() |
352 | { |
353 | if (TrovaAura(oang=ang)) |
354 | { |
355 | drive (dir,40); |
356 | if (vdist<130) |
357 | { |
358 | if (vdist<50) return cannon(ang+(ang-oang)*3,2*scan(ang,10)-vdist); |
359 | return fire2(); |
360 | } |
361 | corr= cos (alfa=(ang-dir)-((ang-dir)/360)*360); |
362 | dang=ang+(ang-oang)*3- sin (alfa)/17600; |
363 | if (ndist=scan(ang,10)) |
364 | cannon (dang,ndist*350/(350+vdist-ndist-corr/3000)); |
365 | else |
366 | Dove(); |
367 | } |
368 | else |
369 | Stop(); |
370 | } |