#side Untouchable 2 fixed #color aa6 #author Warren #date started 6/29/03 #seed 1 3 2 3 5 Now tries to live up to the untouchable name by pushing things away. Has a *large* gunner type. ToDo: 1) Make gatherers run home when hurt 2) Keep track of colony center 3) Medium-short range combat capability Types: 1 Flyswatter 2 gunner 3 Outlet 4 Solar Outlet 5 Zapper ;;;;;;;;;;;;;;;;;;;;;;; Flyswatter ;;;;;;;;;;;;;;;;;;;; #type Flyswatter Type nubmer 1. #color ff0 #decoration 00f cross #hardware processor 20 armor 175 engine 0.05 solar-cells 0.01 radio send receive energy 500 0 force-field 0.18 24 constructor 1.9 food-sensor 24 5 repair-rate 0.1 #code ;;;;;HEADER;;;; #const enemy-channel 1 #const food-request-channel 2 #const location-channel 3 colony-radius: population sqrt 1 * 5 + return #vector enemy-position #vector enemy-velocity #vector enemy-destination #vector home #vector colony-location #var location-announce-time ;;;;;; #var enemy-time 0 #var force-fielding-enemy #start position colony-location! position home! do constructor-type nif 0.4 random-bool if 1 5 random-int else 1 type-population population / 0.16 < if 1 else 5 type-population population / 0.12 < if 5 else 2 type-population population / 0.15 < if 2 else 3 type-population 4 >= 0.8 0.1 ifev random-bool 4 3 ifev then then then then ;random constructor-type! then energy max-energy / 0.5 > constructor-max-rate 0 ifev constructor-rate! energy max-energy / 0.5 > max-repair-rate 0 ifev repair-rate! 0 enemy-channel messages 2 - 0 max random-int enemy-channel skip-messages enemy-channel receive if enemy-time! enemy-velocity! enemy-position! time enemy-time - 15 < and-if enemy-position position dist force-field-range 0.6 0.9 random * < and-if 1 force-fielding-enemy! else time enemy-time - 35 > if force-fielding-enemy and-if 0 force-fielding-enemy! 0 force-field-power! then then ;valid rx force-fielding-enemy if enemy-position position v- unitize 40 vs* position v+ enemy-destination! enemy-destination enemy-position enemy-velocity time enemy-time - 15 + vs* v+ v- 2dup angle force-field-angle! ;stack: direction of push unitize 0.05 0.2 random vs* enemy-velocity 0.8 vs* v+ time enemy-time - vs* enemy-position v+ position v- rect-to-polar force-field-direction! 1 - dup force-field-range < if force-field-distance! force-field-max-power force-field-power! else drop 0 force-field-power! then then force-fielding-enemy not if energy max-energy / 0.4 > and-if 3 type-population and-if time food-sensor-time - 3 1 type-population + 25 * > if force-field-range 1.5 * food-sensor-focus-distance! random-angle food-sensor-focus-direction! fire-food-sensor sync then food-found if food-energy 150 > and-if time food-sensor-time - 60 < and-if food-position colony-location v- unitize -0.16 vs* 2dup angle force-field-angle! time food-sensor-time - vs* ;stack: vector food has moved food-position v+ 2dup position v- rect-to-polar force-field-direction! colony-radius^ > if ;stack: location of food position dist 0.8 + force-field-distance! force-field-max-power force-field-power! else 2drop 0 force-field-power! then else 0 force-field-power! then else force-fielding-enemy not if 0 force-field-power! then then energy max-energy / 0.2 > if position home dist 2 > and-if home seek-location else 0 engine-power! then #var food-request-time energy max-energy / 0.8 < if velocity norm not and-if time food-request-time - 100 110 random > and-if position time 3 food-request-channel send time food-request-time! then time location-announce-time - 100 > if position 2 location-channel send position 0.05 vs* colony-location 0.95 vs* v+ colony-location! time location-announce-time! then do location-channel receive while 0.05 vs* colony-location 0.95 vs* v+ colony-location! loop forever ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #type BFG #hardware processor 15 armor 100 energy 200 0 engine 0.05 radio send solar-cells 0.04 robot-sensor 23 5 grenades 95 23 75 ;firing-cost ? #code ;;;;;HEADER;;;; #const enemy-channel 1 #const food-request-channel 2 #const quantum 10 #vector enemy-position #vector enemy-destination #vector enemy-velocity ;;;;;; #const scan-interval 70 #vector home #start position home! do time robot-sensor-time scan-interval + < grenades-cooldown or grenades-firing-cost robot-sensor-firing-cost 5 + + energy > or nif 0 10 random robot-sensor-focus-distance! random-angle robot-sensor-focus-direction! fire-robot-sensor sync robot-found if robot-position robot-velocity robot-sensor-time 5 enemy-channel send robot-distance population 10 > if 0.7 1 else 0.5 0.7 then random grenades-range * < if robot-shield-fraction 0.15 > and-if robot-position position v- robot-velocity velocity v- robot-distance grenades-speed / vs* v+ rect-to-polar fire-grenade then then else sync then #var food-request-time energy max-energy / 0.7 < if velocity norm not and-if time food-request-time - 100 110 random > and-if position time 3 food-request-channel send time food-request-time! then energy max-energy / 0.2 > if position home dist 2 > and-if home seek-location else 0 engine-power! then forever ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #type Outlet #color 0c0 (Devon 20030721) Fixed for syphon renaming and range change. #hardware processor 15 armor 150 energy 200 20 engine 0.08 radio receive solar-cells 0.02 eater 2.5 syphon 2.0 17 food-sensor 11 1 repair-rate 0.08 #code ;;;;;HEADER;;;; #const enemy-channel 1 #const food-request-channel 2 #const location-channel 3 #vector enemy-position #vector enemy-destination colony-radius: population sqrt 1 * 5 + return ;;;;;; #var last-armor #var last-armor-time #var last-damage-time #var recent-damage-rate #vector colony-location #vector friend-position #var friend-time #var recent-bumps 0 #vector food-focus 0 0 #start armor last-armor! time last-armor-time! -1000 last-damage-time! position colony-location! Begin-foraging: do friendly-collision recent-bumps + 0.95 * recent-bumps! time food-sensor-time - 30 > if recent-bumps 3 > if food-focus 3 random-angle polar-to-rect v+ 0.9 vs* food-focus! food-focus rect-to-polar food-sensor-focus-direction! food-sensor-focus-distance! else position colony-location dist colony-radius^ > if colony-location position v- rect-to-polar food-sensor-focus-direction! 0.3 * food-sensor-focus-distance! else 0 food-sensor-focus-distance! then then fire-food-sensor sync then food-found if food-velocity norm not and-if food-position seek-location else 0 engine-power! then empty-energy^ energy max-energy / 0.1 > max-repair-rate 0 ifev repair-rate! do location-channel receive while 0.05 vs* colony-location 0.95 vs* v+ colony-location! loop update-defense-stats^ recent-damage-rate 0.1 > if energy max-energy / 0.1 > and-if Begin-fleeing& jump then energy max-energy / 0.95 > if eaten eater / 0.1 < and-if position colony-location dist syphon-range > and-if Begin-go-home& jump then forever update-defense-stats: ; -> damge/frame last-armor armor dup last-armor! - time last-armor-time - / recent-damage-rate! time last-armor-time! recent-damage-rate if time last-damage-time! then return Begin-Go-home: do 0.1 colony-location position v- angle polar-to-rect engine-velocity! engine-max-power engine-power! empty-energy^ update-defense-stats^ max-repair-rate repair-rate! energy max-energy / 0.5 < if Begin-foraging& jump then forever #vector flee-location Begin-fleeing: colony-location position v- unitize colony-radius vs* colony-location v+ flee-location! do flee-location seek-location empty-energy^ update-defense-stats^ time last-damage-time - 150 > if Begin-foraging^ jump then energy max-energy / 0.05 < if Begin-foraging^ jump then position flee-location dist 3 < if Begin-foraging& jump then forever #vector circle-location Begin-circling: position circle-location! do circle-location position v- 0.01 vs* ;correction to make us circle the same spot 0.2 time 0.1 * reorient polar-to-rect v+ engine-velocity! engine-max-power engine-power! empty-energy^ update-defense-stats^ time last-damage-time - 100 > if Begin-foraging^ jump then energy max-energy / 0.05 < if Begin-foraging^ jump then forever empty-energy: energy max-energy / 0.2 > if food-request-channel messages 5 > if 0 food-request-channel messages 2 - random-int food-request-channel skip-messages then Next-Friend: food-request-channel receive if friend-time! friend-position! then time friend-time - 100 < if friend-position position dist syphon-range radius + < and-if friend-position position velocity 3 vs* v+ v- rect-to-polar syphon-direction! syphon-distance! syphon-max-rate negate syphon-rate! else food-request-channel messages next-friend& ifg 0 syphon-rate! then else 0 syphon-rate! then return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #type Solar Outlet #color 0ff (Devon 20030721) Fixed for syphon renaming and range change. #hardware processor 10 armor 50 energy 75 0 radio receive solar-cells 0.4 syphon 0.5 15 #code ;;;;;HEADER;;;; #const enemy-channel 1 #const food-request-channel 2 #const quantum 10 #vector enemy-position #vector enemy-destination ;;;;;; #vector friend-position #var friend-time #start do empty-energy^ forever empty-energy: energy max-energy / 0.1 > if food-request-channel messages 5 > if 0 food-request-channel messages 2 - random-int food-request-channel skip-messages then Next-Friend: food-request-channel receive if friend-time! friend-position! then time friend-time - 200 < if friend-position position dist syphon-range radius + < and-if friend-position position v- rect-to-polar syphon-direction! syphon-distance! syphon-max-rate negate syphon-rate! else food-request-channel messages next-friend& ifg 0 syphon-rate! then else 0 syphon-rate! then return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #type Zapper Kinda a revenge clone, but with friendly-fire prevention and long range. #color f00 #hardware processor 25 energy 500 10 armor 275 radio send receive engine 0.07 robot-sensor 15 5 blaster 45 9 30 repair-rate 0.1 #code ;;;;;HEADER;;;; #const enemy-channel 1 #const food-request-channel 2 #const location-channel 3 colony-radius: population sqrt 1 * 5 + return #vector enemy-position #vector enemy-velocity #var enemy-time #vector colony-location #var location-announce-time ;;;;;; #var hungry-announce-time -1000 #vector home #start position home! Begin-sleeping: 0 engine-power! do energy max-energy / 0.1 > max-repair-rate 0 ifev repair-rate! home position dist 7 > if energy 20 > and-if Begin-running& jump then energy max-energy / 0.9 < if time hungry-announce-time - 100 200 random > and-if velocity norm not and-if position time 3 food-request-channel send time hungry-announce-time! then energy max-energy / 0.3 > if armor max-armor / 0.3 > and-if time robot-sensor-time - 70 > if 0 robot-sensor-sees-friends! 1 robot-sensor-sees-enemies! 0 robot-sensor-focus-distance! fire-robot-sensor sync robot-found if robot-position enemy-position! robot-velocity enemy-velocity! robot-sensor-time enemy-time! enemy-position enemy-velocity enemy-time 5 enemy-channel send then then energy max-energy / 0.5 > if armor max-armor / 0.5 > and-if 0 enemy-channel messages 2 - 0 max random-int enemy-channel skip-messages enemy-channel receive if enemy-time! enemy-velocity! enemy-position! Begin-killing& jump then ;valid rx then then forever Begin-running: do home position v- unitize 0.3 vs* engine-velocity! engine-max-power engine-power! home position dist 5 < energy 10 < or if Begin-sleeping& jump then forever #var enemy-distance #vector target-delta #vector expected-shot-velocity Begin-killing: ;precondition: enemy-* set do position enemy-position v- unitize blaster-range 0.7 * vs* enemy-position v+ ;stack: good place to be position v- 0.05 vs* enemy-velocity v+ ;2dup norm 0.3 < if ;;0.1 time 0.1 * reorient polar-to-rect v+ time 40 / 2Pi * reorient 0 > if enemy-position position v- angle Pi 2 / + 0.1 swap polar-to-rect v+ else enemy-position position v- angle Pi 2 / - 0.1 swap polar-to-rect v+ then ;then engine-velocity! engine-max-power engine-power! time robot-sensor-time - blaster-reload-time -1 1 random-int + > if 0 robot-sensor-sees-friends! 1 robot-sensor-sees-enemies! 0 robot-sensor-focus-distance! fire-robot-sensor sync robot-found if robot-position enemy-position! robot-velocity enemy-velocity! robot-sensor-time enemy-time! enemy-position enemy-velocity enemy-time 5 enemy-channel send robot-distance blaster-range < and-if robot-distance enemy-distance! ;determine which way to fire robot-position position v- robot-velocity velocity v- robot-distance blaster-speed / vs* v+ target-delta! blaster-speed target-delta angle polar-to-rect velocity v+ expected-shot-velocity! ;look for friends in line of fire 1 robot-sensor-sees-friends! 0 robot-sensor-sees-enemies! target-delta 0.5 vs* rect-to-polar robot-sensor-focus-direction! robot-sensor-focus-distance! fire-robot-sensor sync robot-found if do robot-position position v- target-delta unitize dot dup 0 > swap enemy-distance < and if ;if the friend is between us and the enemy robot-position position v- expected-shot-velocity robot-velocity v- unitize ;stack: vector to ally, shots expected closing velocity cross abs ;stack: ally distance from line of fire robot-radius 0.3 + < no-shoot& ifg then next-robot while-loop then ;friends ; target-delta angle fire-blaster enemy-position enemy-velocity time enemy-time - vs* v+ ;stack: enemy location now 2dup position dist blaster-speed / enemy-velocity velocity v- rot vs* v+ position v- ;stack: delta when it hits angle fire-blaster No-Shoot: then ;enemies found then ;time to sense energy max-energy / 0.12 < armor max-armor / 0.3 < or time enemy-time - 200 > or if Begin-running& jump then forever #end