/* Misdemeanor (si', l'estensione fa parte del nome del robot) e' un vecchio Jedi rottamato con un innesto di Flash9 nel 3vs3. Olga S */ int ang, oang, range, orange, /* Variabili di puntamento */ d,dmax, /* Variabili temporanee salva danni subiti */ dir, /* Direzione del cammino */ posx, /* Variabili ad 1 bit */ posy, /* salva posizione */ dist, /* Distanza dal corner */ flag, /* Bit-oriented flag per la gestione del movimento */ timer, /* Timer per il conteggio dei nemici */ enemies, /* Conta nemici superstiti */ t,b, /* Timer oscillazione */ td,tl, /* Variabili di utilità */ deg1, /* Limite inferiore di scansione per contare i nemici */ deg2; /* Limite superiore di scansione per contare i nemici */ stop() { fire2(drive(dir,t=0)); while(speed()>59) ; } radar() /* Conta nemici fast */ { enemies=3 -(scan(deg1, 10)!=0) -(scan(deg1+20, 10)!=0) -(scan(deg1+40, 10)!=0) -(scan(deg1+60, 10)!=0) -(scan(deg1+80, 10)!=0) -(scan(deg1+100,10)!=0) ; } runX() { dir=180*!posx; if(posx) { while(loc_x()<900) fire3(dir,100); while(loc_x()<950) drive(dir,100); } else { while(loc_x()>100) fire3(dir,100); while(loc_x()> 50) drive(dir,100); } stop(); } runY() { dir=270-180*posy; if(posy) { while(loc_y()<900) fire3(dir,100); while(loc_y()<950) drive(dir,100); } else { while(loc_y()>100) fire3(dir,100); while(loc_y()> 50) drive(dir,100); } stop(); } corner() { if (speed()) stop(); if (flag^posx^posy) runY(runX()); else runX(runY()); } fire(dir) /* Many thanks to Daniele Nuzzo */ { int asin,acos; /*if (safe) return;*/ if (speed()<100) drive(dir,100); if (scan(ang,10)>150) { asin=(sin(ang-dir)/14384); acos=(cos(ang-dir)/3796)-230; ang-=18*(scan(ang-18,10)>0); ang+=18*(scan(ang+18,10)>0); if(scan(ang-16,10)) ang-=8; else if(scan(ang+16,10)) ang+=8; if(scan(ang-12,10)) ang-=4; else if(scan(ang+12,10)) ang+=4; if(scan(ang-11,10)) ang-=2; if(scan(ang+11,10)) ang+=2; if (orange=scan(oang=ang,3)) { if(scan(ang-13,10)) ang-=5; else if(scan(ang+13,10)) ang+=5; if(scan(ang+12,10)) ang+=4; else if(scan(ang-12,10)) ang-=4; if(scan(ang-11,10)) ang-=2; if(scan(ang+11,10)) ang+=2; cannon(ang+(ang-oang)*((880+(range=scan(ang,10)))/482)-asin, range*230/(orange-range-acos)); } else search(); } else search(); } search() { if (scan(ang-=350,10)) return fire2(); if (scan(ang-=20,10)) return fire2(); if (scan(ang-=320,10)) return fire2(); if (scan(ang-=60,10)) return fire2(); if (scan(ang-=280,10)) return fire2(); if (scan(ang-=100,10)) return fire2(); if (scan(ang-=240,10)) return fire2(); if (scan(ang-=140,10)) return fire2(); if (scan(ang-=200,10)) return fire2(); if (scan(ang-=180,10)) return fire2(); if (scan(ang-=160,10)) return fire2(); if (scan(ang-=220,10)) return fire2(); if (scan(ang-=120,10)) return fire2(); if (scan(ang-=260,10)) return fire2(); if (scan(ang-=80,10)) return fire2(); if (scan(ang-=300,10)) return fire2(); if (scan(ang-=40,10)) return fire2(); if (scan(ang-=340,10)) return fire2(); } fire2() { if (range=scan(oang=ang,10)) { if (scan(ang-8,5)) { if (scan(ang-=5,2)) ; else ang-=4; } else { if (scan(ang+8,5)) { if (scan(ang+=5,2)) ; else ang+=4; } else { if (scan(ang,1)) ; else if (scan(ang-=3,2)) ; else ang+=6; } } return(cannon((ang<<1)-oang,(scan(ang,10)<<1)-range)); } else search(); } fire3(dir,v) { drive(dir,v); if (range=scan(oang=ang,10)) { if (scan(ang-8,5)) { if (scan(ang-=5,2)) ; else ang-=4; } else { if (scan(ang+8,5)) { if (scan(ang+=5,2)) ; else ang+=4; } else { if (scan(ang,1)) ; else if (scan(ang-=3,2)) ; else ang+=6; } } return(cannon((ang<<1)-oang,(scan(ang,10)<<1)-range)); } else { if(range=scan(ang+=20,10)) cannon(ang,range); else if(range=scan(ang-=40,10)) cannon(ang,range); else ang+=80; } } wall(a) int b; { if (a&1) b=loc_y(); else b=loc_x(); if (a&2) return b>120; else return b<880; } int look(a) { if (scan(a,10)) ; else if (scan(a+=20,10)); else return 0; ang=a; return 1; } main() int abra,deg; { corner(posx=loc_x(posy=(loc_y(tl=td=32)>499))>499); radar(deg2=(deg1=(90*(abra=(posy<<1)|(posx^posy))))+100); while (enemies<1) /* fase 1 */ { dir=deg1+(30<820) fire2(); corner(); } else if (scan(dir,10)) { fire(ang=dir); while(scan(ang,10)>680) fire(dir); corner(); } else { while(++t<5) fire(dir); corner(tl=timer); } if ((d=damage()-d)>dmax) { dmax=d; flag^=1; } if ((++timer>tl)&&(range>400)) { if ((timer>115)&&(damage()<60)) enemies=1; else radar(tl=timer+(td>>=1)+1); } } while(enemies<=1) /* fase 2 */ { deg=deg1; while(t<4) { dir=deg; if (wall(abra)) { if (look(deg)) { fire3(dir+=55, 100); while ( speed()<100 ) { fire2(drive(dir, 100)); } fire3(dir-=110, 100); while(wall(abra+3)) { fire3(dir, 100); } } else { fire2(drive(dir, 100)); } } else { fire3(deg+=90, 0); ++abra; ++t; } } radar(t=0); } while(1) { if (((posx=loc_x())%880)<120) dir=180*(posx>500); else if (((posy=loc_y())%880)<120) dir=90+180*(posy>500); else if (range>600) dir=ang+25; else if (range<150) dir=ang+165; else dir=ang+180*(b^=1); fire3(dir,100); fire3(dir,100); fire3(dir,100); } }