#side Not Quite Wise
#author Warren
#date Started 11/29/02
#color 999

One-type theotroph. Keeps track of a location to drift towards, and a drift priority.

ToDo:
-Wandering when no food
-food sharing
-trapped in corners
-offense
-missiles

(Devon 20030327) No longer flees stationary shots (i.e. syphons).

#type It Runs Away
#color 999
#hardware

constructor 1
eater 1.9
solar-cells 0.02
food-sensor 15 1

energy 500 50
armor 200
processor 15
engine 0.05

grenades 15 9 20
robot-sensor 9 1

repair-rate 0.03
shot-sensor 10 1

#code

#vector better-place
#var migration-priority

construct:
1 constructor-type!
energy 200 > constructor-max-rate 0 ifev constructor-rate!
return

defend:
 energy armor > max-repair-rate 0 ifev repair-rate!
 shot-sensor-time time 20 - < energy 30 > and if
  fire-shot-sensor sync
  #const shot-run-distance 10
  shot-found if shot-velocity or and-if
   shot-run-distance
   shot-velocity -100 vs* shot-position position v- v+ vnegate angle
   polar-to-rect better-place v+
   5 restrict-position^ better-place!
   migration-priority 10 armor 50 / - + migration-priority!
  then
 then
return

fight:
 robot-sensor-time time 20 - < energy 40 > and if
  fire-robot-sensor sync
  robot-found if
   #const robot-run-distance 8
   robot-run-distance
   robot-velocity -10 vs* robot-position position v- v+ vnegate angle
   polar-to-rect better-place v+
   5 restrict-position^ better-place!
   4 shot-found 2 0 ifev + armor 50 / -
   0 max migration-priority + migration-priority!
   1 robot-direction polar-to-rect robot-velocity dot 0.01 <
   shot-found or if
    robot-position
    robot-velocity velocity v- robot-distance grenades-speed / vs* v+
    position v- rect-to-polar fire-grenade
   then ;closing or firing
  then ;found
 then ;time-to-fire
return

think:
; better-place position v- rect-to-polar fire-grenade
 migration-priority 0.98 * migration-priority!
 better-place 0.99 vs* position 0.01 vs* v+
 0.1 random-angle polar-to-rect v+
 5 restrict-position better-place!
return

#var border
restrict-position:  ;x y border -> x' y'
 border!
 border max world-height border - min
 swap
 border max world-width border - min
 swap
return

#start
position 10 random-angle polar-to-rect v+ 5 restrict-position^ better-place!
0 migration-priority!

#var meal-ready
Begin-browsing:
0 meal-ready!
Loop:
 food-sensor-time time 30 - <
 meal-ready not and if
  better-place position v- rect-to-polar food-sensor-focus-direction! food-sensor-focus-distance!
  fire-food-sensor sync
  food-found if 1 meal-ready! then
 then
 meal-ready if
  food-position seek-location
  food-position position dist radius 0.1 + < eaten not and if
   0 meal-ready!
  then
 else
  0 engine-power!
 then
 think^
 defend^
 fight^
 construct^
 migration-priority 15 >
 better-place position dist 10 > and if
  Begin-running& jump
 else
  Loop& jump
then

Begin-running:

Run-loop:
 better-place position v- 0.05 vs* engine-velocity!
 engine-max-power engine-power!
 think^
 defend^
 fight^
 construct^
  better-place position dist 5 <
  migration-priority 10 <
 or if
  Begin-browsing& jump 
 else
  Run-loop& jump
then

#end
