/* ninja.r */ /* locks on to a target and attacks */ int vector; /* current attack vector */ main() { while(1) { if(speed()==0) drive(vector,30); if(find()) /* if we see anyone */ attack(); /* attack! */ else vector = rand(360); } } int find() /* find a new target */ { int off; /* offset */ int dir; /* direction */ int tv; /* trial vector */ off = 180; /* half circle sweep */ dir = 0; /* counter-clockwise first */ tv = (vector+180)%360; /* look behind us first */ while(off>=0) /* full scan */ { if(scan(tv,10)) /* see anyone? */ return pin(tv,0); /* nail him! */ if(dir = !dir) /* alternate sides */ tv = vector + (off -= 20); else tv = vector - off + 360; tv %= 360; } return 0; /* no targets found */ } int pin(vec,had) /* pin down a target */ int vec; /* initial vector */ int had; /* true if target was just lost */ { int tv; /* trial vector */ int ts; /* trial scan results */ int n; /* index */ tv = vec-5; /* coarse screen */ n = 2; while(n && !(ts=scan(tv,5))) { tv += 10; --n; } if(!ts) return 0; charge(tv,ts,50); tv -= 4; /* medium screen */ n = 4; while(n && !(ts=scan(tv,1))) { tv += 3; --n; } if(!ts) return 0; charge(tv,ts,50); tv -= 1; /* fine screen */ n = 3; while(n && !(ts=scan(tv,0))) { ++tv; --n; } if(!ts) return 0; vector = tv; /* found it! */ return ts; /* say how far away */ } attack() { int range; /* range to locked target */ while(1) { if(range=scan(vector,0)) /* got him! */ charge(vector,range,100); else if(!pin(vector,1)) /* lost him! */ return; /* can't find him */ } } charge(vec,range,maxspd) /* charge at an enemy */ int vec; /* attack vector to use */ int range; /* range to target */ int maxspd; /* maximum speed to use */ { if(range>40 && range<800) /* good shooting range */ cannon(vec,range); /* fire! */ drive(vec,maxspd); /* charge! */ }