2001/megazai.r

001/*
002Nome del robot  : MegaZai.r
003Autore          : Alessandro Tassara
004 
005Raffazzonato in poco piu' di una mattinata, AltroZai � un'evoluzione del poco
006performante NewZai17, di cui mantiene quasi invariata la struttura generale.
007Scopiazzature piu' o meno evidenti provengono da Daryl e Vegeth.
008Spulciando nel listato inoltre, si possono ancora rinvenire arcaici riferimenti
009al vecchio AleZai17, a Son-Goku, Arale e persino al vetusto Jedi.
010Per prima cosa all'inizio della partita, raggiunto l'angolo piu' vicino, conta
011i nemici, e se ne ha solo uno attacca.
012Non sta mai fermo, dal momento che tale comportamento non e' assolutamente
013raccomandabile, vista la brutta aria che tira ultimamente nell'universo
014crobotico: pare infatti che tutti abbiano inspiegabili tendenze maniaco persecutorie
015verso gli altri amici che giocherellano nell'arena.
016Oscilla alternativamente in direzione di un nemico (inclinato di 15 gradi, come Daryl)
017o brevemente lungo la diagonale (in stile dav46): la scelta � dettata dalla vicinanza
018dell'avversario.
019Anche questa volta l'ampiezza dell'oscillazione lunga viene calcolata al volo, prestando
020attenzione a non arrivare mai a meno di 600 metri dal nemico.
021Quando non ne puo' piu' di evitare i colpi dei compagnoni li' attorno salta
022su cio' che rimane della gloriosa Peugeot106 (che oramai sta insieme con il fil di ferro ma,
023essendo il budget tiranno, ancora non ha potuto cambiare) e scappa in un altro angolo.
024La routine finale e', una volta di piu' copiata.
025Il donatore e' nienetemeno che il buon Vegeth, che discretamente bene fece
026nella scorsa edizione (e tanto male, quindi, fara' in questa). Qualche modifica
027comunque l'ho fatta, se non altro per non beccare uno 0% tondo tondo.
028*/
029 
030int oang,ndist,vdist;
031int ang,dir,curx,cury,dan,anni,last,flag4;
032int l,conta;
033int dang, alfa, corr, anco;
034int vang, gira;
035 
036main()
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 
069Vai()
070int 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 
106Viaggia()
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 
113Peugeot()  /*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 
132Scan(i)
133int i;
134{
135    return ((scan(i+350,10)+scan(i+10,10))<400);   /*effettua una scansione allargata di 14 gradi*/
136}
137 
138 
139Loin(nx,ny) /*da Son-Goku (ciao Simo)*/
140int nx, ny;
141  {
142    return (((nx-=loc_x())*nx+(ny-=loc_y())*ny));
143  }
144 
145/* Le routines d'attacco */
146 
147fire()    /* 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 
183fire2() /*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 
207Dove() /*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 
216Stop()                                                  /*Procedura di rallentamento speciale*/
217  {                                                    
218     drive (dir,40);
219     ang+=10;
220     while(!scan(ang+=21,10));
221     fire2();
222  }
223 
224Vegetale()
225int 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 
261TrovaAura()
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 
270TrovaB()
271 
272{
273 
274if ( 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 }
333return 0;
334}
335 
336/*Procedure di fuoco*/
337 
338fuoco(a)
339int a;
340  {
341     drive (dir=a,100);
342     if (TrovaAura())
343       {
344         drive(dir,100);
345         GenkiDama();
346       }
347     else
348         Stop();
349  }
350 
351GenkiDama()
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  }