extern void object::Guard() { int allyType = Me; // put ally category here (i.e. LeggedGrabber) int keepCloseDist = 10; // how far behind to follow int parimeterToScan = 50; // range to look for enemy object enemy; while(true) { enemy = radar(AlienAnt,0,360,0,parimeterToScan); if(enemy == null) follow(allyType,keepCloseDist); else moveAndDestroy(enemy); } } void object::follow(int category, int parimeter) { object ally = radar(category); float dis = distance(position,ally.position); if(dis > parimeter) // if too far away from ally { float dif = ally.position.z-position.z; float ang = asin(dif/dis); jet(1-(ang/-20)); float dir = direction(ally.position); motor(1-dir/22.5,1+dir/22.5); // move in closer } else // otherwise too close { motor(dis/parimeter-1, dis/parimeter-1); // back up a little if(topo(position) > 0) // if not over water jet(-1); // then land to conserve energy/minimize heat } } void object::moveAndDestroy(object target) { float dir; // direction of target from shooter float dis; // distance of target from shooter float dif; // difference in altitude of target & shooter (relative to sea-level) float ang; // angle shooter must aim (-20 degrees favorable) dis = distance(position,target.position); dif = target.position.z-position.z; ang = asin(dif/dis); jet(1-(ang/-20)); // thrust until 20 degress above target dir = direction(target.position); motor(1-dir/22.5,1+dir/22.5); // move towards enemy dis = distance(position,target.position); dif = target.position.z-position.z; ang = asin(dif/dis); aim(ang); // take aim dir = direction(target.position); if(dis < 30 and dir > -10 and dir < 10) // if within range fire(0.1); }