#side Not Quite Harmless #seed 2 2 1 #author Warren #color a3f The leech is an interesting proof of concept type that needs a lot of polishing. Very fun to watch one leech walk up to Commune and drive it crazy. #type Leech #decoration fff circle #color fff A shielded syphon-user. Designed to plug into sides to distract enemies, especially missiles. Does not reproduce. #hardware energy 500 80 armor 100 processor 20 ;radio send receive eater 0.6 engine 0.07 robot-sensor 11 5 shot-sensor 7 1 food-sensor 8 3 repair-rate 0.15 shield 0.65 syphon 1.0 #code Begin-eating: 0 shield! 0 syphon-rate! do time food-sensor-time - 30 > if fire-food-sensor sync then food-found if food-position seek-location else 0 engine-power! then time shot-sensor-time - 15 > if energy max-energy / 0.4 > and-if fire-shot-sensor sync shot-found if shot-velocity norm and-if Begin-decoying& jump then then time robot-sensor-time - 40 > if energy max-energy / 0.4 > and-if fire-robot-sensor sync robot-found if Begin-decoying& jump then then energy max-energy / 0.1 > max-repair-rate 0 ifev repair-rate! forever Begin-decoying: #var last-enemy-time time last-enemy-time! do adjust-shields^ max-repair-rate repair-rate! time robot-sensor-time - 12 > if fire-robot-sensor sync robot-found if do robot-energy robot-distance 2 * - 0 > if robot-position robot-velocity velocity v- 6 vs* v+ position v- rect-to-polar syphon-direction! radius - syphon-distance! syphon-max-rate syphon-rate! robot-distance radius robot-radius + - 0.05 * 0.5 min robot-direction polar-to-rect robot-velocity v+ engine-velocity! engine-max-power engine-power! time last-enemy-time! Done-targeting& jump then next-robot while-loop Done-targeting: then then robot-found nif time shot-sensor-time - 10 > and-if fire-shot-sensor sync shot-found and-if time last-enemy-time! shot-position shot-velocity -100 vs* v+ seek-location then time last-enemy-time - 100 > Begin-eating& ifg energy max-energy / 0.2 < Begin-eating& ifg forever adjust-shields: energy max-energy / armor max-armor / - 0.9 + dup 0.2 > swap 0 ifev max-shield * shield! return #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: constructor-type nif 0.23 random-bool 1 2 ifev constructor-type! then 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