#side Tough Gnats #author Matt Burkholder #date 5/1/2 #color 00f #type Gnat #color ff0 #hardware processor 15 engine 0.065 constructor 1.05 energy 300 20 solar-cells 0.01 eater 1.25 syphon 1.25 robot-sensor 8 food-sensor 10 shot-sensor 8.1 armor 150 repair-rate 0.02 blaster 500 1.5 500 #code #const gnat 1 #const tree 2 #const Swarm-range 35 #const target-valid-time 200 #const robot-sensor-delay 30 #const food-sensor-delay 50 #var target-sender 0 #var target-found 0 #var wander-angle 0 #var destx 0 #var desty #var LastEnergy 0 #var LastTime 0 #var LastDamage 0 #var food-sensor-next 0 #var robot-sensor-next 0 time 5 < if 0 1 transmit 0 4 transmit 0 7 transmit then time 10 + robot-sensor-next! CheckForDanger^ pi 3 / id * dup wander-angle! time 75 + food-sensor-next! Movement: 0.05 engine-power! 0.2 wander-angle polar-to-rect engine-velocity! wander-angle food-sensor-focus-direction! food-sensor-range food-sensor-focus-distance! shot-sensor-range shot-sensor-focus-distance! Buzz: do do energy food-sensor-firing-cost > if time food-sensor-next > if fire-food-sensor sync food-found if food-position desty! destx! 0 engine-power! else 50 50 position v- 2dup abs 40 > swap abs 40 > or if angle wander-angle! else 2drop then 0.2 wander-angle polar-to-rect engine-velocity! then time food-sensor-delay + food-sensor-next! then CheckDamage^ CheckComms^ energy 0.008 - engine-power! else Recharge^ then destx until-loop CheckForDanger^ do destx desty seek-location sync CheckDamage^ CheckComms^ destx desty position v- norm 0.6 > while-loop CheckForDanger^ time 30 + LastTime! do destx desty seek-location sync CheckDamage^ time LastTime < while-loop energy 299 min LastEnergy! sync do energy LastEnergy > while CheckDamage^ CheckComms^ time robot-sensor-next > CheckForDanger& ifc constructor-max-rate constructor-rate! gnat constructor-type! energy 299 min LastEnergy! sync loop 0 destx! 0 desty! 0 constructor-rate! 0 repair-rate! CheckForDanger^ random-angle wander-angle! forever Pregnant: constructor-progress constructor-remaining 1 + / 3 > return CheckForDanger: fire-robot-sensor random-angle shot-sensor-focus-direction! fire-shot-sensor sync robot-found BFound& ifg shot-found SFound& ifg time robot-sensor-delay + robot-sensor-next! return CheckDamage: LastDamage armor dup LastDamage! max-armor < if max-repair-rate repair-rate! armor > CheckForDanger& ifg else drop 0 repair-rate! then return CheckComms: energy 50 < Pregnant^ or ifr 1 receive time > if 1 target-sender! 2 receive 3 receive Swarm^ then 4 receive time > if 4 target-sender! 5 receive 6 receive Swarm^ then 7 receive time > if 7 target-sender! 8 receive 9 receive Swarm^ then return Snake-location: position v- 2dup norm dup 5 > if 0.15 / vs/ 0.1 time pi * 40 / polar-to-rect v+ engine-velocity! engine-max-power engine-power! else radius < if 0 engine-power! 2drop else engine-velocity! engine-max-power engine-power! then then return Swarm: position v- norm Swarm-Range > blaster-cooldown or ifr rdrop rdrop 0 constructor-rate! do target-sender 1 + receive target-sender 2 + receive seek-location energy robot-sensor-firing-cost > time robot-sensor-next > and if fire-robot-sensor sync robot-found Attack& ifg time robot-sensor-delay + robot-sensor-next! then time target-sender receive > until-loop 0 target-sender! 0 target-found! 0 destx! Buzz& jump SFound: rdrop 0 constructor-rate! shot-velocity norm if shot-position shot-velocity 2dup norm -12 / vs/ v+ 2dup desty! destx! BroadCast^ else shot-position 2dup desty! destx! BroadCast^ then shot-direction blaster-cooldown Pregnant^ or Retreat& ifg shot-sensor-focus-direction! time robot-sensor-delay + robot-sensor-next! Scout: do time robot-sensor-next > if fire-robot-sensor fire-shot-sensor sync robot-found Attack& ifg shot-found shot-velocity norm and if shot-position shot-velocity 2dup norm -12 / vs/ v+ 2dup desty! destx! target-found 2 + transmit target-found 1 + transmit time target-valid-time + target-found transmit then time robot-sensor-delay + robot-sensor-next! then armor max-armor < max-repair-rate 0 ifev repair-rate! destx desty snake-location^ sync ;speed while-loop time target-found receive < while-loop ;0 target-found transmit 0 target-found! 0 destx! Buzz& jump BroadCast: 1 receive time < if 1 target-found! 3 transmit 2 transmit time target-valid-time + 1 transmit return then 4 receive time < if 4 target-found! 6 transmit 5 transmit time target-valid-time + 4 transmit return then 7 receive time < if 7 target-found! 9 transmit 8 transmit time target-valid-time + 7 transmit return then 10 target-found! 2drop return BFound: rdrop 0 constructor-rate! robot-position 2dup desty! destx! BroadCast^ Attack: Robot-Direction Pregnant^ blaster-cooldown or Retreat& ifg syphon-direction! syphon-max-rate syphon-rate! engine-max-power engine-power! do robot-distance syphon-range min syphon-distance! robot-direction syphon-direction! blaster-cooldown nif energy blaster-firing-cost > robot-distance blaster-range < and if robot-direction fire-blaster then 0 constructor-rate! else energy 290 > constructor-max-rate 0 ifev constructor-rate! then robot-distance 1.2 - 2 / robot-direction polar-to-rect engine-velocity! armor max-armor < max-repair-rate 0 ifev repair-rate! target-found if time target-valid-time + target-found transmit robot-position target-found 2 + transmit target-found 1 + transmit then fire-robot-sensor sync robot-found while-loop target-found if 0 target-found transmit 0 target-found 1 + transmit 0 target-found 2 + transmit 0 target-found! then target-sender if 0 target-sender transmit 0 target-sender! then 0 syphon-rate! 0 syphon-distance! 0 destx! 0 desty! 0 engine-power! sync sync sync Buzz& jump Recharge: 0 engine-power! do sync sync sync sync energy 5 < while-loop return Retreat: pi + wander-angle! time 150 + food-sensor-next! 0 destx! Movement jump #end