• ; The actual attack code.
  • ; Believe it or not, here is just about the only place you'll find the command launch missile.
  • ; The enemy is dead-ahead when this is called, but there might be a barrier between us.
  •  
  • boogieman:  -- explain
  • long range scan  -- explain
  • if scan found enemy then if missile ready then launch missile
  • if scan found enemy then if missile ready then goto missiles
  • if value #scan <> 2 then if value #scan <> 4 then if value #scan <> 0 then if value #scan <> 5 then if missile ready then goto fragchk_ #cloakstatus #cur_head  -- explain
  • if scan found flag then goto getflag
  •  
  • ; The next two lines calculate the square right behind the enemy.
  •  
  • cmath vx = ((#cur_head-2) * (#cur_head-3) * (#cur_head-4) * (#x_pos)/-6) + ((#cur_head-1) * (#cur_head-3) * (#cur_head-4) * (#enemy_x+1)/2) + ((#cur_head-1) * (#cur_head-2) * (#cur_head-4) * (#x_pos)/-2) + ((#cur_head-1) * (#cur_head-2) * (#cur_head-3) * (#enemy_x-1)/6)  -- explain
  • cmath vy = ((#cur_head-2) * (#cur_head-3) * (#cur_head-4) * (#enemy_y-1)/-6) + ((#cur_head-1) * (#cur_head-3) * (#cur_head-4) * (#y_pos)/2) + ((#cur_head-1) * (#cur_head-2) * (#cur_head-4) * (#enemy_y+1)/-2) + ((#cur_head-1) * (#cur_head-2) * (#cur_head-3) * (#y_pos)/6)  -- explain
  • gps scan x ~vx y ~vy  -- explain
  • if value #scan <> 0 then if value #scan <> 4 then if value #cur_fuel >= 300 then if value #cur_ammo >= 10 then if missile not ready then if value #enemy_y <> #y_pos then if value #x_pos <> #enemy_x then goto longfrag  -- explain
  • turn left
  • scan relative 1  -- explain
  • math v2 = #x_pos - #enemy_x - #enemy_x * #x_pos / #enemy_x + #enemy_x * #enemy_x / #y_pos + #y_pos - #enemy_y - #enemy_y * #y_pos / #enemy_y + #enemy_y * #enemy_y -- explain
  • if value ~v2 < 3 then if value #enemy_x <> 0 then if value ~v9 = ~v9 then goto 2 -- explain
  • assign ve move backward  -- explain
  • if scan found flag then if damage is > 0 then assign ve move forward  -- explain
  • if value #scan <> 1 then if value #scan <> 3 then if value #scan <> 5 then assign ve move forward  -- explain
  • if value ~v9 <> ~v9 then beep  -- explain
  • ~ve  -- explain
  • if value #x_pos = #enemy_x then goto same_x_ #cur_head  -- explain
  • if value #y_pos = #enemy_y then goto same_y_ #cur_head  -- explain
  • if value #inbound >= 1 then goto locked_ #cur_head #inbound  -- explain
  • goto err_ #cur_head  -- explain
  •  
  • ; I couldn't begin to guess how many times this little snip of code is called.
  • ; Basically just moves you over an axis.
  •  
  • evade:  -- explain
  • turn left
  • scan relative 1  -- explain
  • math v2 = #x_pos - #enemy_x - #enemy_x * #x_pos / #enemy_x + #enemy_x * #enemy_x / #y_pos + #y_pos - #enemy_y - #enemy_y * #y_pos / #enemy_y + #enemy_y * #enemy_y -- explain
  • if value ~v2 < 3 then if value #enemy_x <> 0 then if value ~v9 = ~v9 then goto 2 -- explain
  • assign ve move backward  -- explain
  • if scan found flag then if damage is > 0 then assign ve move forward  -- explain
  • if value #scan <> 1 then if value #scan <> 3 then if value #scan <> 5 then assign ve move forward  -- explain
  • if value ~v9 <> ~v9 then beep  -- explain
  • ~ve  -- explain
  • if value #x_pos = #enemy_x then goto same_x_ #cur_head  -- explain
  • if value #y_pos = #enemy_y then goto same_y_ #cur_head  -- explain
  • if value #inbound >= 1 then goto locked_ #cur_head #inbound  -- explain
  • goto err_ #cur_head  -- explain
  •  
  • ; VERY important code.  Always make sure to have plenty of subclicks left after goto.
  • ; Resort to gosub to save a subclick if needed.
  • ; First four, the enemy could broadside you, or you could maybe broadside them.
  •  
  • same_x_ 2:  -- explain
  • ; If they aren't facing you and you feel healthy, turn and attack.
  •  
  • if value #enemy_d >= #cur_life then if missile ready then if value #enemy_h <> 1 then if value #enemy_h <> 3 then gosub err_ #cur_head  -- explain
  •  
  • ; Check how close they are.
  • math v2 = #x_pos - #enemy_x - #enemy_x * #x_pos / #enemy_x + #enemy_x * #enemy_x / #y_pos + #y_pos - #enemy_y - #enemy_y * #y_pos / #enemy_y + #enemy_y * #enemy_y  -- explain
  • if value ~v2 < 3 then if value #enemy_x <> 0 then if value ~v9 = ~v9 then goto 2 -- explain
  • move forward
  • if bump barrier then move backward
  • if value #enemy_y <> #y_pos then if value #x_pos <> #enemy_x then if value #inbound = 0 then goto err_ #cur_head  -- explain
  • if value #x_pos = #enemy_x then goto same_x_ #cur_head  -- explain
  • if value #y_pos = #enemy_y then gosub same_y_ #cur_head  -- explain
  • if value #inbound >= 1 then goto locked_ #cur_head #inbound  -- explain
  •  
  • same_x_ 4:  -- explain
  • if value #enemy_d >= #cur_life then if missile ready then if value #enemy_h <> 1 then if value #enemy_h <> 3 then gosub err_ #cur_head  -- explain
  • math v2 = #x_pos - #enemy_x - #enemy_x * #x_pos / #enemy_x + #enemy_x * #enemy_x / #y_pos + #y_pos - #enemy_y - #enemy_y * #y_pos / #enemy_y + #enemy_y * #enemy_y  -- explain
  • if value ~v2 < 3 then if value #enemy_x <> 0 then if value ~v9 = ~v9 then goto 2 -- explain
  • move forward
  • if bump barrier then move backward
  • if value #enemy_y <> #y_pos then if value #x_pos <> #enemy_x then if value #inbound = 0 then goto err_ #cur_head  -- explain
  • if value #x_pos = #enemy_x then goto same_x_ #cur_head  -- explain
  • if value #y_pos = #enemy_y then gosub same_y_ #cur_head  -- explain
  • if value #inbound >= 1 then goto locked_ #cur_head #inbound  -- explain
  •  
  • same_y_ 1:  -- explain
  • if value #enemy_d >= #cur_life then if missile ready then if value #enemy_h <> 2 then if value #enemy_h <> 4 then gosub err_ #cur_head  -- explain
  • math v2 = #x_pos - #enemy_x - #enemy_x * #x_pos / #enemy_x + #enemy_x * #enemy_x / #y_pos + #y_pos - #enemy_y - #enemy_y * #y_pos / #enemy_y + #enemy_y * #enemy_y  -- explain
  • if value ~v2 < 3 then if value #enemy_x <> 0 then if value ~v9 = ~v9 then goto 2 -- explain
  • move forward
  • if bump barrier then move backward
  • if value #enemy_y <> #y_pos then if value #x_pos <> #enemy_x then if value #inbound = 0 then goto err_ #cur_head  -- explain
  • if value #x_pos = #enemy_x then goto same_x_ #cur_head  -- explain
  • if value #y_pos = #enemy_y then gosub same_y_ #cur_head  -- explain
  • if value #inbound >= 1 then goto locked_ #cur_head #inbound  -- explain
  •  
  • same_y_ 3:  -- explain
  • if value #enemy_d >= #cur_life then if missile ready then if value #enemy_h <> 2 then if value #enemy_h <> 4 then gosub err_ #cur_head  -- explain
  • math v2 = #x_pos - #enemy_x - #enemy_x * #x_pos / #enemy_x + #enemy_x * #enemy_x / #y_pos + #y_pos - #enemy_y - #enemy_y * #y_pos / #enemy_y + #enemy_y * #enemy_y  -- explain
  • if value ~v2 < 3 then if value #enemy_x <> 0 then if value ~v9 = ~v9 then goto 2 -- explain
  • move forward
  • if bump barrier then move backward
  • if value #enemy_y <> #y_pos then if value #x_pos <> #enemy_x then if value #inbound = 0 then goto err_ #cur_head  -- explain
  • if value #x_pos = #enemy_x then goto same_x_ #cur_head  -- explain
  • if value #y_pos = #enemy_y then gosub same_y_ #cur_head  -- explain
  • if value #inbound >= 1 then goto locked_ #cur_head #inbound  -- explain
  •  
  • ; Might be facing the enemy, check and see.
  •  
  • same_x_ 1:  -- explain
  • if value #enemy_y < #y_pos then if missile ready then gosub boogieman  -- explain
  • goto evade -- explain
  •  
  • same_x_ 3:  -- explain
  • if value #enemy_y > #y_pos then if missile ready then gosub boogieman  -- explain
  • goto evade -- explain
  •  
  • same_y_ 2:  -- explain
  • if value #enemy_x > #x_pos then if missile ready then gosub boogieman  -- explain
  • goto evade -- explain
  •  
  • same_y_ 4:  -- explain
  • if value #enemy_x < #x_pos then if missile ready then gosub boogieman  -- explain
  • goto evade -- explain
  •  
  • ; Frag checks, works quite well.
  • ; Sees if there is a chance you can frag your enemy with a missile.
  •  
  • fragchk_ 1 1:  -- explain
  • cloak off
  •  
  • fragchk_ 0 1:  -- explain
  • math v1 = #y_pos - #enemy_y
  • math v2 = #x_pos - #enemy_x
  • if value ~v2 >= -1 then if value ~v2 <= 1 then gosub gotcha__ ~v1  -- explain
  • generate random  -- explain
  • if value #random >= 3 then assign v1 turn right  -- explain
  • if value #random <= 2 then assign v1 turn left  -- explain
  • ~v1  -- explain
  • scan relative 1  -- explain
  • math v2 = #x_pos - #enemy_x - #enemy_x * #x_pos / #enemy_x + #enemy_x * #enemy_x / #y_pos + #y_pos - #enemy_y - #enemy_y * #y_pos / #enemy_y + #enemy_y * #enemy_y  -- explain
  • if value ~v2 < 3 then if value #enemy_x <> 0 then if value ~v9 = ~v9 then  -- explain
  • assign ve move backward  -- explain
  • if scan found flag then if damage is > 0 then assign ve move forward  -- explain
  • if value #scan <> 1 then if value #scan <> 3 then if value #scan <> 5 then assign ve move forward  -- explain
  • if value ~v9 <> ~v9 then beep  -- explain
  • ~ve  -- explain
  • if not bump barrier then if value #x_pos = #enemy_x then goto same_x_ #cur_head  -- explain
  • if not bump barrier then if value #y_pos = #enemy_y then goto same_y_ #cur_head  -- explain
  • if not bump barrier then if value #inbound <> 0 then goto locked_ #cur_head #inbound  -- explain
  • goto err_ #cur_head  -- explain
  •  
  • fragchk_ 1 3:  -- explain
  • cloak off
  •  
  • fragchk_ 0 3:  -- explain
  • math v1 = #enemy_y - #y_pos
  • math v2 = #x_pos - #enemy_x
  • if value ~v2 >= -1 then if value ~v2 <= 1 then gosub gotcha__ ~v1  -- explain
  • generate random  -- explain
  • if value #random >= 3 then assign v1 turn right  -- explain
  • if value #random <= 2 then assign v1 turn left  -- explain
  • ~v1  -- explain
  • scan relative 1  -- explain
  • math v2 = #x_pos - #enemy_x - #enemy_x * #x_pos / #enemy_x + #enemy_x * #enemy_x / #y_pos + #y_pos - #enemy_y - #enemy_y * #y_pos / #enemy_y + #enemy_y * #enemy_y -- explain
  • if value ~v2 < 3 then if value #enemy_x <> 0 then if value ~v9 = ~v9 then goto 2 -- explain
  • assign ve move backward  -- explain
  • if scan found flag then if damage is > 0 then assign ve move forward  -- explain
  • if value #scan <> 1 then if value #scan <> 3 then if value #scan <> 5 then assign ve move forward  -- explain
  • if value ~v9 <> ~v9 then beep  -- explain
  • ~ve  -- explain
  • if not bump barrier then if value #x_pos = #enemy_x then goto same_x_ #cur_head  -- explain
  • if not bump barrier then if value #y_pos = #enemy_y then goto same_y_ #cur_head  -- explain
  • if not bump barrier then if value #inbound <> 0 then goto locked_ #cur_head #inbound  -- explain
  • goto err_ #cur_head  -- explain
  •  
  • fragchk_ 1 2:  -- explain
  • cloak off
  •  
  • fragchk_ 0 2:  -- explain
  • math v1 = #enemy_x - #x_pos
  • math v2 = #y_pos - #enemy_y
  • if value ~v2 >= -1 then if value ~v2 <= 1 then gosub gotcha__ ~v1  -- explain
  • generate random  -- explain
  • if value #random >= 3 then assign v1 turn right  -- explain
  • if value #random <= 2 then assign v1 turn left  -- explain
  • ~v1  -- explain
  • scan relative 1  -- explain
  • math v2 = #x_pos - #enemy_x - #enemy_x * #x_pos / #enemy_x + #enemy_x * #enemy_x / #y_pos + #y_pos - #enemy_y - #enemy_y * #y_pos / #enemy_y + #enemy_y * #enemy_y  -- explain
  • if value ~v2 < 3 then if value #enemy_x <> 0 then if value ~v9 = ~v9 then goto 2 -- explain
  • assign ve move backward  -- explain
  • if scan found flag then if damage is > 0 then assign ve move forward  -- explain
  • if value #scan <> 1 then if value #scan <> 3 then if value #scan <> 5 then assign ve move forward  -- explain
  • if value ~v9 <> ~v9 then beep  -- explain
  • ~ve  -- explain
  • if not bump barrier then if value #x_pos = #enemy_x then goto same_x_ #cur_head  -- explain
  • if not bump barrier then if value #y_pos = #enemy_y then goto same_y_ #cur_head  -- explain
  • if not bump barrier then if value #inbound <> 0 then goto locked_ #cur_head #inbound  -- explain
  • goto err_ #cur_head  -- explain
  •  
  • fragchk_ 1 4:  -- explain
  • cloak off
  •  
  • fragchk_ 0 4:  -- explain
  • math v1 = #x_pos-#enemy_x
  • math v2 = #y_pos-#enemy_y
  • if value ~v2 >= -1 then if value ~v2 <= 1 then gosub gotcha__ ~v1  -- explain
  • generate random  -- explain
  • if value #random >= 3 then assign v1 turn right  -- explain
  • if value #random <= 2 then assign v1 turn left  -- explain
  • ~v1  -- explain
  • scan relative 1  -- explain
  • math v2 = #x_pos - #enemy_x - #enemy_x * #x_pos / #enemy_x + #enemy_x * #enemy_x / #y_pos + #y_pos - #enemy_y - #enemy_y * #y_pos / #enemy_y + #enemy_y * #enemy_y  -- explain
  • if value ~v2 < 3 then if value #enemy_x <> 0 then if value ~v9 = ~v9 then goto 2 -- explain
  • assign ve move backward  -- explain
  • if scan found flag then if damage is > 0 then assign ve move forward  -- explain
  • if value #scan <> 1 then if value #scan <> 3 then if value #scan <> 5 then assign ve move forward  -- explain
  • if value ~v9 <> ~v9 then beep  -- explain
  • ~ve  -- explain
  • if not bump barrier then if value #x_pos = #enemy_x then goto same_x_ #cur_head  -- explain
  • if not bump barrier then if value #y_pos = #enemy_y then goto same_y_ #cur_head  -- explain
  • if not bump barrier then if value #inbound <> 0 then goto locked_ #cur_head #inbound  -- explain
  • goto err_ #cur_head  -- explain
  •  
  • ; this doesn't work thanks to goto cmath bug
  • ; the bug is fixed, I just haven't altered things back over.
  •  
  • fragchk_ 1:  -- explain
  • cloak off
  •  
  • fragchk_ 0:  -- explain
  • cmath v1 = ((#cur_head-2) * (#cur_head-3) * (#cur_head-4) * (#y_pos-#enemy_y)/-6) + ((#cur_head-1) * (#cur_head-3) * (#cur_head-4) * (#enemy_x-#x_pos)/2) + ((#cur_head-1) * (#cur_head-2) * (#cur_head-4) * (#enemy_y-#y_pos)/-2) + ((#cur_head-1) * (#cur_head-2) * (#cur_head-3) * (#x_pos-#enemy_x)/6)  -- explain
  • cmath v2 = ((#cur_head-2) * (#cur_head-3) * (#cur_head-4) * (#x_pos-#enemy_x)/-6) + ((#cur_head-1) * (#cur_head-3) * (#cur_head-4) * (#y_pos-#enemy_y)/2) + ((#cur_head-1) * (#cur_head-2) * (#cur_head-4) * (#x_pos-#enemy_x)/-2) + ((#cur_head-1) * (#cur_head-2) * (#cur_head-3) * (#y_pos-#enemy_y)/6)  -- explain
  • if value ~v2 >= -1 then if value ~v2 <= 1 then gosub gotcha__ ~v1  -- explain
  • generate random  -- explain
  • if value #random >= 3 then assign v1 turn right  -- explain
  • if value #random <= 2 then assign v1 turn left  -- explain
  • ~v1  -- explain
  • scan relative 1  -- explain
  • math v2 = #x_pos - #enemy_x - #enemy_x * #x_pos / #enemy_x + #enemy_x * #enemy_x / #y_pos + #y_pos - #enemy_y - #enemy_y * #y_pos / #enemy_y + #enemy_y * #enemy_y  -- explain
  • if value ~v2 < 3 then if value #enemy_x <> 0 then if value ~v9 = ~v9 then goto 2 -- explain
  • assign ve move backward  -- explain
  • if scan found flag then if damage is > 0 then assign ve move forward  -- explain
  • if value #scan <> 1 then if value #scan <> 3 then if value #scan <> 5 then assign ve move forward  -- explain
  • if value ~v9 <> ~v9 then beep  -- explain
  • ~ve  -- explain
  • if not bump barrier then if value #x_pos = #enemy_x then goto same_x_ #cur_head  -- explain
  • if not bump barrier then if value #y_pos = #enemy_y then goto same_y_ #cur_head  -- explain
  • if not bump barrier then if value #inbound <> 0 then goto locked_ #cur_head #inbound  -- explain
  • goto err_ #cur_head  -- explain