; 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