2000/newzai17.r

001/*
002Nome del robot  : AleZai17.r
003Autore          : Alessandro Tassara
004 
005NewZai17 in realt� ha poche parentele con il mio vecchio robottino:
006innanzitutto all'inizio della partita, raggiunto l'angolo piu' vicino, conta
007i nemici, e se ne ha solo uno attacca.
008Inoltre non sta mai fermo, dal momento che tale comportamento mi pare poco
009raccomandabile in un universo dove tutti stanno cercando di farti la pelle.
010Oscilla alternativamente in direzione di un nemico o brevemente lungo la
011diagonale (in stile dav46).
012L'unica particolarita' e' rappresentata dall'ampiezza dell'oscillazione, che
013viene calcolata al volo in modo di non arrivare mai a meno di 600 metri dal
014nemico.
015Se comunque lo infastidiscono troppo salta sulla sua Peugeot106 (che per motivi
016di budget ancora non ha potuto cambiare, nonostante ormai mostri tutti i suoi
017anni) e scappa in un altro angolo.
018La routine finale e' il robot Satana di Dario Serino.
019Immagino che quest'anno le scuole di pensiero saranno due:
020- Satana like
021- Anti Satana.
022Dal momento che non sono riuscito nella seconda mi accontento della prima.
023 
024Quest'anno l'efficienza dei miei robottini e' veramente scandalosa, ragion per
025cui non dovrei fare dediche, tuttavia.....
026                                          ......................Dedicato a Z.
027*/
028 
029int oang,ndist,vdist,min;
030int ang,dir,curx,cury,dan,anni,last,flag4;
031int normal,rng,orng;
032int l,noia,str,a,oa,vista, clock;
033 
034main()
035  {
036    min=4000;               /*distanza minima del bordo*/
037    last=curx=(1000*(loc_x()>500));
038    cury=loc_y();               /*calcola posizione*/
039    dir=180*(curx<loc_x());         /*e direzione per arrivare a destinazione*/
040        Peugeot();
041        stop();
042        curx=loc_x();
043    cury=(1000*(loc_y()>500));
044    dir=90+180*(cury<loc_y());
045        Peugeot();
046        stop();
047    curx=last;
048/*        anni=20;
049        Vai();
050  */      while(1)                                /*inizia il loop, nel quale, con una routine copiata da goblin, calcola l' angolo*/
051      {
052                if (loc_x()<500) if (loc_y()<500) dir=90; else dir=0;
053                            else if (loc_y()<500) dir=180; else dir=270;
054                str=dir;
055                if (++noia<12)
056                {
057                        dir+=315;
058                        while (Loin(curx,cury)<12000) {drive (dir,100);fire(1);}
059                        dir=(360+((curx-loc_x())<0)*180+atan(((cury-loc_y())*100000)/(curx-loc_x())));
060                }
061                else
062                {
063                        if ((scan(dir,10))<scan(dir+270,10)) dir+=270;
064                        l=scan(dir,10)-700;
065                        if ((l*=l)>45000) l=45000;
066                        if (l<12000) l=12000;
067                        while (Loin(curx,cury)<l) {drive (dir,100);fire(1);}
068                        dir+=180;
069                }
070                if (noia>20) noia=0;
071                while (speed()>49) drive (dir,0);
072                min=11000;
073                Peugeot();
074                drive (dir,0);
075                min=4000;
076                if (noia==11) while (Loin(curx,cury)>5000) drive(dir,40);
077                dir=str;
078        Vai();
079      }
080  }
081 
082Vai()
083{
084   if (((++anni)>20)&&(damage()<90))        /*controlla se per caso e' rimasto un solo superstite e in quel caso attacca*/
085   {
086           stop();
087           anni=10;
088           last=0;
089           while ((anni+=20)<750) last+=(scan(anni,10)>0);
090           if (last<3)                           
091                   mainsat();
092           anni=0;
093   }
094 
095   if((dan<damage()-24)||((vdist)&&(vdist<500)))
096   {
097    if (Scan(dir))              /*controlla se l' angolo precedente e' libero*/
098    {
099                Viaggia();
100    }
101    else if ((Scan(dir+270)))       /*controlla se l' angolo seguente e' libero*/
102        {
103            dir+=270;
104                        Viaggia();
105        }
106        else if (Scan(dir+315))     /*controlla se l' angolo opposto e' libero*/
107            {
108                dir+=315;
109                                Viaggia();
110            }
111        dan=damage();
112    }
113}
114 
115Viaggia()
116  {
117    if (sin(dir)) cury=1000-cury;       /*calcola le nuove coordinate delle destinazioni*/
118    if (cos(dir)) curx=1000-curx;
119        Peugeot();                             /*va a destinazione*/
120        stop();
121  }     
122 
123Peugeot()  /*Si sposta verso le coordinate date*/
124  {
125    drive(dir,100);
126    while((Loin(curx,cury)>27000)&&(speed()))
127        fire(1);            /*quando e' lontano dai bordi usa le routine di Jedi*/
128    drive(dir,80);
129    while((Loin(curx,cury)>min)&&(speed()))
130        fire2();            /*quando e' vicino ai bordi usa le routine di Drago6*/
131  }
132 
133/* Utilities per raccogliere il codice */
134 
135Scan(i)
136int i;
137{
138    return ((scan(i+350,10)+scan(i+10,10))<400);   /*effettua una scansione allargata di 14 gradi*/
139}
140 
141 
142Loin(nx,ny) /*da Son-Goku (ciao Simo)*/
143int nx, ny;
144  {
145    return (((nx-=loc_x())*nx+(ny-=loc_y())*ny));
146  }
147 
148stop()  /*da Arale*/
149  {
150    drive(dir,0);
151    while(speed() > 49)
152        if ((ndist=scan(ang,10))&&(ndist<770)) cannon(ang,ndist);
153        else Dove();
154  }
155 
156/* Le routines d'attacco */
157 
158fire(si)    /* fire() - routine di sparo in movimento - generoso lascito di nonno Jedi */
159int si;
160  {
161    if(vdist=scan(ang,10))
162      {
163        if (vdist>700)
164            return fire2();
165 
166                if (!scan(ang-=5,10)) ang+=10;
167 
168        if(scan(ang+354,1)) ang+=354;   /*tranne questo che viene da Coppi*/
169        if(scan(ang+6,  1)) ang+=6;
170        if(scan(ang+356,1)) ang+=356;
171        if(scan(ang+4,  1)) ang+=4;
172        if(scan(ang+358,1)) ang+=358;
173        if(scan(ang+2,  1)) ang+=2;
174 
175        if (vdist=scan(oang=ang,5))
176                  {
177            if(scan(ang+354,1)) ang+=354;
178            if(scan(ang+6,  1)) ang+=6;
179            if(scan(ang+356,1)) ang+=356;
180            if(scan(ang+4,  1)) ang+=4;
181            if(scan(ang+358,1)) ang+=358;
182            if(scan(ang+2,  1)) ang+=2;
183 
184            if (ndist=scan(ang,10))
185            {
186                                cannon((ang+(ang-oang)*((1200+ndist)>>9)-(si)*(sin(ang-dir)>>14)),(ndist*160/(160+vdist-ndist-(si)*(cos(ang-dir)>>12))));
187            }
188           }
189        else fire2();
190        }
191       else Dove();
192  }
193 
194fire2() /*da Drago6*/
195  {
196    if((vdist=scan(ang,10))&&(vdist<770))
197      {
198        if (!scan(ang+=355,5)) ang+=10;
199        if (!scan(ang+=357,3)) ang+=6;
200        cannon(ang,3*scan(ang,10)-2*vdist);
201      }
202    else
203      if((ndist=scan(ang+=340,10)))
204        cannon(ang,ndist);
205      else
206        if((ndist=scan(ang+=40,10)))
207            cannon(ang,ndist);
208        else
209            if((ndist=scan(ang+=300,10)))
210                cannon(ang,ndist);
211            else
212                if((ndist=scan(ang+=80,10)))
213                    cannon(ang,ndist);
214                else
215                    return (ang+=40);
216  }
217 
218Dove() /*da Coppi, ma almeno qui c' e' del mio*/
219{
220    if((ndist=scan(ang+339,10))) cannon (ang+=339,ndist);
221    else if((ndist=scan(ang+21,10))) cannon (ang+=21,ndist);
222    else if (ndist=scan(dir,10))
223           cannon (ang=dir,scan(ang,10));
224    else return(ang+=40);
225}
226 
227mainsat() {
228 
229  while(normal=3) {
230    if (dir==270)     while(focus(loc_y()<275));
231    else if (dir==90) while(focus(loc_y()>725));
232    else if (dir)     while(focus(loc_x()<275));
233    else              while(focus(loc_x()>725));
234 
235    if (normal) drive((dir+180)%=360,50);
236    else        drive(dir=(( ((a+180)/90) + (clock^=1) )*90)%360,50);
237 
238    while (speed()>50)
239         Dove();
240 
241    drive(dir,100);
242  }
243}
244 
245focus(exit) {
246  if (exit) return 0;
247  else {
248    drive(dir,100);
249 
250    if (scan(a,10));
251    else if (scan(a+=21,10));
252    else if (scan(a-=42,10));
253    else {a+=84; return --normal;}
254 
255    if (scan(a-=5,5)); else a+=10;
256    if (scan(a+5,2)) a+=5; if (scan(a-5,2)) a-=5;
257    if (scan(a+3,1)) a+=3; if (scan(a-3,1)) a-=3;
258    if (scan(a+1,1)) a+=1; if (scan(a-1,1)) a-=1;
259    if (orng=scan(oa=a,5)) {
260      if (scan(a+13,10)) a+=5; if (scan(a-13,10)) a-=5;
261      if (scan(a+12,10)) a+=3; if (scan(a-12,10)) a-=3;
262      if (scan(a+10,10)) a+=1; if (scan(a-10,10)) a-=1;
263 
264      if (rng=scan(a,10))
265        cannon(a+ (a-oa)*((1200+rng)>>9)- (sin(a-dir)>>14),
266               rng*192/(192+ orng-rng- (cos(a-dir)>>12)));
267 
268      if (a==oa) return normal>>=1;
269    }
270    return --normal;
271  }
272}