extern void object::Strelba_1() { while(this.energyCell == null) wait(0.05); while(radar(Any, 180, 45, 0, 5) != null) wait(0.05); move(-7.5); while(true) { bool isInFront = true; object item = radar(Any, 0, 120, 0, 1000, 1, FilterEnemy); if (item == null) { isInFront = false; item = radar(Any, 0, 360, 0, 1000, 1, FilterEnemy); if (item == null) { wait(0.05); continue; } } float targetHeight = topo(this.position); if(targetHeight < 0) targetHeight = 0; targetHeight += 9; float targetSpeed = distance(this.position, item.position)/40; if(targetSpeed > 1) targetSpeed = 1; if(!isInFront) targetSpeed = 1; float targetDirection = direction(item.position); bool canShoot = true; if(abs(targetDirection) > 10) canShoot = false; if(distance(this.position, item.position) > 40) canShoot = false; /* Here we calculate the aim angle Take a look at this picture: (yes, I'm terrible at ASCII-art :P) \/ target *** * *** H* *** * angle** \/ robot ************* L */ float H = item.position.z-this.position.z; float L = distance2d(this.position, item.position); float angle = atan(H/L); if(aim(angle, -targetDirection) != 0) canShoot = false; // funkcja aim() zwraca != 0 jesli cel poza zasiegiem if(!canShoot) targetSpeed = 1; if(distance(this.position, item.position) < 20) targetSpeed = 0; jet((targetHeight-this.position.z)/4); if(targetDirection < 0) { motor(targetSpeed, targetSpeed+targetDirection/90); } else { motor(targetSpeed-targetDirection/90, targetSpeed); } if(canShoot) { fire(0.1); } else { wait(0.05); } } }