#side Weird Men #author Matt Burkholder #date 23 July 2003 (July 24) Started with Day Trader and began writing this side. The idea is to have three wanderer types all based off of Day Trader. They will hang around the 'home' position but since they are all wanders it will move. It should create kind of a nomadic swarm. One type will be a gatherer/constructor. The second will be a fighter type. And the third a shielded blocker. 2/9/4 All cells have been shrunk from thier previous size. 2/9/4 Constructors now have small robot sensor. They fire it when they are damaged and run away. 2/9/4 Fighters now inspect targets in two passes. In the first they ignore all shielded targets. In the second they ignore heavely shielded targets. 2/9/4 Blockers have an enemy-syphon and use it to steal energy from enemies. They continue t o track targets and steal energy when no shots are being fired, but they drop shields. 2/9/4 Improved and used fight-while-eating on both fighter and blocker type. 2/14/4 Trying duel weapons on fighters. 2/14/4 Gathers now detect friendly shots to try to avoid combat areas. 2/17/7 More Improvements to fight while eating. #seed 1 2 1 1 2 3 Gatherer/Builder type #color 445 #type Jack-o #color 030 #decoration 000 cross #hardware processor 20 constructor 1.0 energy 300 50 eater 1.75 solar-cells 0.02 armor 100 engine 0.08 repair-rate 0.08 food-sensor 9 4 robot-sensor 8 1 shot-sensor 6 1 grenades 5 7 20 radio send receive #code #var food-sensor-now #var robot-sensor-now #var shot-sensor-now #var side-population #var high-population #var food-scan-distance #var Damage-Time #var Last-Armor #var World-Radius #var shot-firing-delay #var No-Shots #var TopEdge #var RightEdge #vector Dest #vector Target #vector Target-Velocity #vector Home #vector Center #vector aim-point #vector bump-zone #const min-construct-energy 150 #const min-scan-energy 20 #const min-fight-energy 10 #const Home-Channel 1 #const Target-Channel 2 #const EdgeSpace 2 ;1 shot-sensor-sees-friendly! Armor Last-Armor! position Home! World-width 2 / world-height 2 / Center! Center min 5 - World-Radius! position target! World-Width EdgeSpace - RightEdge! World-Height EdgeSpace - TopEdge! ;0 World-Width random-int 0 World-Height random-int target! Food-sensor-range 0.7 * food-scan-distance! Initial-Construct^ Feed: 0 engine-power! Do Construct^ Repair^ Read-Home^ Scan-Robots^ Scan-Food^ Seek-Dest^ Scan-Shots^ ;Check-Comms^ Check-Damage^ stack dropn forever Check-Damage: Armor Last-Armor < if position Home side-population 2.5 * 10 max in-range if time robot-sensor-now! time 350 + Damage-Time! else home position v- 0.5 vs* position v+ Set-Dest^ then then armor Last-Armor! return Transmit: target 2 Target-Channel send return Initial-Construct: construct^ return Construct: 2 type-population 3 type-population + dup high-population! 1 type-population + side-population! energy min-construct-energy > energy constructor-remaining 1.3 * > or constructor-max-rate 0 ifev constructor-rate! constructor-type nif 0 side-population random-int dup 1 type-population >= if 1 constructor-type! else 0 high-population random-int 2 type-population 0.75 * >= if 2 constructor-type! else 3 constructor-type! then then then return Repair: armor max-armor < energy 20 > and max-repair-rate 0 ifev repair-rate! Return Read-Home: Home-Channel messages nifr Home-Channel messages 2 - Home-Channel skip-messages Home-Channel receive if Home! Then Return Write-Home: Home side-population vs* position v+ side-population 1 + vs/ 2dup Home! 2 Home-Channel send return Scan-Food: friendly-collision Defer& ifg time food-sensor-now < energy food-sensor-firing-cost < eaten or or ifr write-home^ Home position v- rect-to-polar food-sensor-focus-direction! food-sensor-range 0.4 * food-sensor-focus-distance! fire-food-sensor sync food-found Spiral-Dest& nifg do food-position bump-zone 3 in-range while next-food Spiral-Dest& nifg loop time-limit food-sensor-now! Do food-position seek-location sync speed until-loop Food-position dest! 0 0 Bump-Zone! Return Defer: 1 robot-sensor-sees-friends! 0 robot-sensor-sees-enemies! fire-robot-sensor sync 0 robot-sensor-sees-friends! 1 robot-sensor-sees-enemies! robot-found nifr robot-id id > robot-type 1 > or ifr -9 robot-direction polar-to-rect position v+ Set-Dest^ robot-position bump-zone! time food-sensor-now! return Spiral-Dest: position home v- rect-to-polar pi 8 / + swap dup 10 swap 1 max / + swap polar-to-rect home v+ Set-Dest^ time 30 + food-sensor-now! return Scan-Shots: time shot-sensor-now < energy min-scan-energy < or ifr fire-shot-sensor time 15 + shot-sensor-now! sync shot-found nifr shot-side side = if shot-type 2 > ifr shot-velocity unitize vnegate 2dup ;two unit vectors oposite shot-velocity swap negate 2dup ;two unit vectors perpendicular to shot-velocity shot-position position v- dot 0 > if vnegate then v+ 8 vs* position v+ Set-Dest^ else shot-velocity unitize 2dup shot-distance vs* shot-position v+ aim-point! -12 vs* shot-position v+ target! target position v- unitize swap negate 2dup aim-point position v- dot 0 > if vnegate then 10 shot-distance - vs* position target v- unitize shot-distance 4 + vs* v+ position v+ Set-Dest^ Transmit^ then time-limit food-sensor-now! return Scan-Robots: time robot-sensor-now < enemy-collision not and energy min-scan-energy < or ifr fire-robot-sensor time 20 + robot-sensor-now! sync robot-found nifr robot-shield-fraction 0.8 < ifr robot-position robot-velocity velocity v- robot-distance grenades-speed / vs* v+ position v- rect-to-polar fire-grenade robot-position target! position robot-position v- unitize 2 vs* robot-velocity v- position home v- unitize v+ 5 vs* position v+ Set-Dest^ Transmit^ time-limit food-sensor-now! return Seek-Dest: energy 1 < if 0 engine-power! return then dest or if dest seek-location else target seek-location then speed eaten or wall-collision not and nif time food-sensor-now! position center World-radius in-range if -10 10 random-int -10 10 random-int else 10 15 random-int center position v- angle random-angle 3 / + polar-to-rect then position v+ Set-Dest^ then return Set-Dest: EdgeSpace max TopEdge min swap EdgeSpace max RightEdge min swap dest! Dest seek-location return Tangent: ;Tangent to target Towards the Center Target position v- unitize swap negate 2dup Center position v- dot 0 < if vnegate then return Tangent2: ;Tangent to Center Away from Target Center position v- unitize swap negate 2dup Target position v- dot 0 > if vnegate then Return Tangent3: ;Tangent to target Away from dest Target position v- unitize swap negate 2dup Dest position v- dot 0 > if vnegate then return ;Fighter type #type Ozzie #color 404 #decoration 000 dot #hardware processor 20 energy 300 50 solar-cells 0.01 armor 100 engine 0.10 repair-rate 0.1 robot-sensor 15 5 shot-sensor 4 ;for both weapons grenades 5 14 20 enemy-syphon 2.5 14 ;2.5 from 2.65 radio send receive #code #var food-sensor-now #var robot-sensor-now #var shot-sensor-time #var side-population #var high-population #var food-scan-distance #var robot-scan-distance #var Damage-Time #var Last-Armor #var World-Radius #var shot-firing-delay #var No-Shots #var TopEdge #var RightEdge #vector Dest #vector Target #vector Target-Velocity #vector Home #vector Center #vector Bump-Zone #const min-construct-energy 400 #const min-scan-energy 20 #const min-fight-energy 200 #const min-help-energy 450 #const Home-Channel 1 #const Target-Channel 2 #const EdgeSpace 2 Armor Last-Armor! position Home! World-width 2 / world-height 2 / Center! Center min 5 - World-Radius! World-Width EdgeSpace - RightEdge! World-Height EdgeSpace - TopEdge! position target! Food-sensor-range 0.1 * food-scan-distance! robot-sensor-range 0.3 * robot-scan-distance! Feed: 0 engine-power! Do Repair^ Read-Home^ Scan-Robots^ ;Scan-Food^ Seek-Dest^ Scan-Shots^ Check-Comms^ Check-Damage^ forever Check-Damage: Armor Last-Armor < if position Home side-population 2.5 * 10 max in-range if time robot-sensor-now! time 350 + Damage-Time! else home position v- 0.5 vs* position v+ Set-Dest^ then then armor Last-Armor! return Transmit: target 2 Target-Channel send return Check-Comms: Target-Channel receive energy min-help-energy > and if target! stack dropn else stack dropn return then Track: target seek-location sync sync do time robot-sensor-now > if fire-robot-sensor sync robot-found if robot-position target! Transmit^ Attack& jump else fire-shot-sensor sync shot-found if shot-position shot-velocity unitize -15 vs* v+ target! then then time 10 + robot-sensor-now! then target seek-location target position 5 in-range energy min-fight-energy < or until-loop 0 food-sensor-now! return Attack: 0 constructor-rate! 0 shot-firing-delay! 0 No-Shots! 0 robot-sensor-sees-friends! enemy-syphon-max-rate enemy-syphon-rate! do grenades-cooldown shot-firing-delay > enemy-syphoned and nif ;blaster-cooldown shot-firing-delay <= if fire-robot-sensor sync robot-found nifr do robot-shield-fraction 0.95 > robot-energy robot-distance 5 * > and Fire-Shot& Check-Next-Bot& ifec while-loop grenades-cooldown shot-firing-delay <= if ;blaster-cooldown shot-firing-delay <= if do robot-shield-fraction 0.5 > Fire-Shot& Check-Next-Bot& ifec while-loop then robot-scan-distance robot-sensor-focus-distance! home position v- angle robot-sensor-focus-direction! Robot-position 2dup position v- unitize grenades-range 0.9 * vs* v- target! Position center robot-position center dist World-Radius max in-range if robot-velocity target-velocity! Else Tangent^ target-velocity! then then target target-velocity seek-moving-location Repair^ energy 20 < No-Shots 10 > or until-loop 0 food-sensor-now! energy 20 < if Home Set-Dest^ then 0 robot-sensor-focus-distance! 0 enemy-syphon-rate! Return Check-Next-Bot: Next-robot dup not No-Shots + No-Shots! return Fire-Shot: ;dual robot-distance enemy-syphon-distance! robot-direction enemy-syphon-direction! robot-position position v- 2dup robot-velocity robot-distance grenades-speed / vs* v+ norm grenades-speed / robot-velocity velocity v- rot vs* v+ rect-to-polar over grenades-range > if 2drop 0 return then time robot-sensor-time - shot-firing-delay! do grenades-cooldown while-loop fire-grenade 0 No-Shots! 0 return ;Leave a zero on the stack so the robot-loop drops out ;Fight-While-Eating: ; 0 shot-firing-delay! ; Do ; Repair^ ; Scan-Food^ ; Seek-Dest^ ; blaster-cooldown shot-firing-delay <= ; energy robot-sensor-firing-cost blaster-firing-cost + 5 + > ; time robot-sensor-now > and and if ; fire-robot-sensor sync robot-found nifr ; do ; robot-shield-fraction 0.3 > Fire-Shot& Check-Next-Bot& ifec ; while-loop ; robot-distance robot-sensor-focus-distance! ; Robot-direction robot-sensor-focus-direction! ; Then ; energy min-fight-energy < while-loop; ;return Repair: armor max-armor < energy 20 > and max-repair-rate 0 ifev repair-rate! 2 type-population 3 type-population + dup high-population! 1 type-population + side-population! Return Read-Home: Home-Channel messages nifr Home-Channel messages 2 - Home-Channel skip-messages Home-Channel receive if Home! Then Return Write-Home: Home side-population vs* position v+ side-population 1 + vs/ 2dup Home! 2 Home-Channel send return Scan-Robots: time robot-sensor-now < ifr 1 robot-sensor-sees-friends! 1 robot-sensor-sees-enemies! fire-robot-sensor sync 0 enemy-syphon-rate! robot-found if do robot-side side = if robot-distance enemy-syphon-distance! robot-direction enemy-syphon-direction! energy 150 < robot-energy energy 1.1 * > and if enemy-syphon-max-rate enemy-syphon-rate! position dest! else energy 100 > robot-energy 20 < and if enemy-syphon-max-rate negate enemy-syphon-rate! position dest! then then else robot-shield-fraction 0.7 > if robot-position target! Transmit^ Attack& jump then then next-robot while-loop then enemy-syphon-rate Spiral-Dest& nifg time 20 + robot-sensor-now! return ;Scan-Food: ; friendly-collision Defer& ifg ; time food-sensor-now < energy food-sensor-firing-cost < eaten or or ifr ; write-home^ energy 490 > Spiral-Dest& ifg ; Home position v- rect-to-polar food-sensor-focus-direction! ; food-sensor-range 0.4 * food-sensor-focus-distance! ; fire-food-sensor sync ; food-found Spiral-Dest& nifg ; do food-position bump-zone 3 in-range while ; next-food Spiral-Dest& nifg loop ; time-limit food-sensor-now! ; Do food-position seek-location sync speed until-loop ; Food-position dest! 0 0 Bump-Zone! ;Return Defer: 1 robot-sensor-sees-friends! 0 robot-sensor-sees-enemies! fire-robot-sensor sync 0 robot-sensor-sees-friends! 1 robot-sensor-sees-enemies! robot-found nifr robot-id id > robot-type 1 > and ifr -6 robot-direction polar-to-rect position v+ Set-Dest^ robot-position bump-zone! time food-sensor-now! return Spiral-Dest: position home v- rect-to-polar pi 8 / + swap dup 10 swap 1 max / + swap polar-to-rect home v+ Set-Dest^ time 30 + food-sensor-now! return Scan-Shots: time Damage-Time > energy min-scan-energy < or ifr fire-shot-sensor sync shot-found if shot-position shot-velocity unitize -15 vs* v+ target! Transmit^ Energy min-fight-energy > Track& ifg then return Seek-Dest: energy 1 < if 0 engine-power! return then dest or if dest seek-location else target seek-location then speed eaten or wall-collision not and nif time food-sensor-now! position center World-radius in-range if -15 15 random-int -15 15 random-int else 10 15 random-int center position v- angle random-angle 3 / + polar-to-rect then position v+ Set-Dest^ then return Set-Dest: EdgeSpace max TopEdge min swap EdgeSpace max RightEdge min swap dest! Dest seek-location return Tangent2: Center position v- unitize negate 2dup Target position v- dot 0 > if vnegate then Return Tangent: Target position v- unitize negate 2dup Center position v- dot 0 < if vnegate then return ;Blocker type #type Charlie #color 852 #hardware processor 20 energy 200 50 eater 0.45 solar-cells 0.006 armor 200 engine 0.10 repair-rate 0.10 food-sensor 9 robot-sensor 10 3 shot-sensor 4.5 blaster 100 1 100 radio send receive #code #var food-sensor-now #var robot-sensor-now #var shot-sensor-now #var side-population #var high-population #var food-scan-distance #var robot-scan-distance #var Damage-Time #var Last-Armor #var World-Radius #var shot-firing-delay #var No-Shots #var Talk-Now #var TopEdge #var RightEdge #vector Dest #vector Target #vector Target-Velocity #vector Home #vector Center #vector Aim-Point #vector Bump-Zone #const min-construct-energy 300 #const min-scan-energy 20 #const min-fight-energy 75 #const min-help-energy 150 #const Home-Channel 1 #const Target-Channel 2 #const EdgeSpace 2 Armor Last-Armor! position Home! World-width 2 / world-height 2 / Center! Center min 5 - World-Radius! World-Width EdgeSpace - RightEdge! World-Height EdgeSpace - TopEdge! position target! Food-sensor-range -0.4 * food-scan-distance! Initial-Construct^ Feed: 0 engine-power! Do Construct^ Repair^ Read-Home^ Scan-Robots^ Scan-Food^ Seek-Dest^ Scan-Shots^ Check-Comms^ Check-Damage^ 0 shield! forever Check-Damage: Armor Last-Armor < if position Home side-population 2.5 * 10 max in-range if time robot-sensor-now! time 350 + Damage-Time! else home position v- 0.5 vs* position v+ Set-Dest^ then then armor Last-Armor! return Transmit: target 2 Target-Channel send time 100 + talk-now! return Check-Comms: Target-Channel receive energy min-help-energy > and if target! stack dropn else stack dropn return then Track: target seek-location sync sync do time robot-sensor-now > if fire-robot-sensor sync robot-found if robot-position target! Transmit^ Attack& jump else fire-shot-sensor sync shot-found if shot-velocity unitize 2dup shot-distance vs* shot-position v+ aim-point! -10 vs* shot-position v+ target! target position v- unitize swap negate 2dup aim-point position v- dot 0 > if vnegate then target-velocity! else 0 0 target-velocity! then position target 15 in-range max-shield 0 ifev shield! ;shot-position shot-velocity unitize -15 vs* v+ target! then time 5 + robot-sensor-now! then target target-velocity seek-moving-location target position 5 in-range energy min-fight-energy < or until-loop 0 food-sensor-now! return Attack: 0 constructor-rate! 0 shot-firing-delay! 0 No-Shots! do time robot-sensor-now > if fire-robot-sensor sync robot-found nifr 0 No-Shots! do robot-bomb robot-reloading robot-energy 20 > and or blaster-cooldown or Escape& Check-Next-Bot& ifec while-loop no-shots if Fire-Shot^ drop robot-position position v- unitize -9.5 vs* robot-position v+ target! robot-velocity target-velocity! else 1 No-Shots! do robot-shield-fraction 0.9 > Fire-Shot& Check-Next-Bot& Ifec while-loop robot-position target! robot-velocity target-velocity! then time 10 + robot-sensor-now! then time talk-now > Transmit& ifc target target-velocity seek-moving-location Repair^ energy 40 < until-loop 0 food-sensor-now! position Set-Dest^ 0 shield! 0 robot-sensor-focus-distance! Return Check-Next-Bot: Next-robot return Fire-Shot: 0 robot-distance robot-radius - blaster-range > blaster-cooldown or ifr robot-position robot-velocity v+ position v- angle fire-blaster 0 no-shots! return Escape: 1 no-shots! 0 return Fight-While-Eating: 0 shot-firing-delay! 0 robot-sensor-focus-distance! Do do robot-shield-fraction 0.6 > robot-energy 20 > and Fire-Shot& Check-Next-Bot& ifec while-loop enemy-syphon-rate nif Fire-Shot^ drop then Scan-Food^ Seek-Dest^ no-shots 10 > if 0 shield! Repair^ else energy 50 / 1 min max-shield * shield! armor max-armor < if energy 50 / 1 min max-repair-rate * repair-rate! else 0 repair-rate! then then time robot-sensor-now > if fire-robot-sensor fire-shot-sensor sync shot-found if 0 no-shots! else no-shots 1 + no-shots! then time 10 + robot-sensor-now! then time talk-now > transmit& ifc 0 enemy-syphon-rate! Robot-found energy min-fight-energy < and while-loop return Initial-Construct: ;0 constructor-type! return Construct: 2 type-population 3 type-population + dup high-population! 1 type-population + side-population! energy min-construct-energy > energy constructor-remaining 1.3 * > or constructor-type and constructor-max-rate 0 ifev constructor-rate! constructor-type 1 type-population or nif 1 constructor-type! then return Repair: armor max-armor < energy 20 > and max-repair-rate 0 ifev repair-rate! Return Read-Home: Home-Channel messages nifr Home-Channel messages 2 - Home-Channel skip-messages Home-Channel receive if Home! Then Return Write-Home: Home side-population vs* position v+ side-population 1 + vs/ 2dup Home! 2 Home-Channel send return Scan-Robots: time robot-sensor-now < energy min-scan-energy < or ifr fire-robot-sensor sync robot-found if do robot-shield-fraction 0.6 > robot-energy 50 > and if robot-position target! Transmit^ energy min-fight-energy > Attack& ifg then next-robot while-loop then time 25 + robot-sensor-now! return Scan-Food: friendly-collision Defer& ifg time food-sensor-now < energy food-sensor-firing-cost < eaten or or ifr write-home^ energy 690 > Spiral-Dest& ifg Home position v- rect-to-polar food-sensor-focus-direction! food-sensor-range 0.4 * food-sensor-focus-distance! fire-food-sensor sync food-found Spiral-Dest& nifg do food-position bump-zone 3 in-range while next-food Spiral-Dest& nifg loop time-limit food-sensor-now! Do food-position seek-location sync speed until-loop Food-position dest! 0 0 Bump-Zone! Return Defer: 1 robot-sensor-sees-friends! 0 robot-sensor-sees-enemies! fire-robot-sensor sync 0 robot-sensor-sees-friends! 1 robot-sensor-sees-enemies! robot-found nifr robot-id id > robot-type 3 = and ifr -6 robot-direction polar-to-rect position v+ Set-Dest^ robot-position bump-zone! time food-sensor-now! return Spiral-Dest: position home v- rect-to-polar pi 8 / + swap dup 10 swap 1 max / + swap polar-to-rect home v+ Set-Dest^ time 30 + food-sensor-now! return Scan-Shots: time shot-sensor-now < energy min-scan-energy < or ifr fire-shot-sensor sync shot-found if shot-position shot-velocity unitize -5 vs* v+ target! Transmit^ Energy min-fight-energy > Track& ifg then time 10 + shot-sensor-now! return Seek-Dest: energy 1 < if 0 engine-power! return then dest or if dest seek-location else target seek-location then speed eaten or wall-collision not and nif time food-sensor-now! position center World-radius in-range if -15 15 random-int -15 15 random-int else 10 15 random-int center position v- angle random-angle 3 / + polar-to-rect then position v+ Set-Dest^ then return Tangent2: Center position v- unitize negate 2dup Target position v- dot 0 > if vnegate then Return Tangent: Target position v- unitize negate 2dup Center position v- dot 0 < if vnegate then return Tangent3: shot-velocity unitize 2dup shot-distance vs* shot-position v+ aim-point! -12 vs* shot-position v+ target! target position v- unitize swap negate 2dup aim-point position v- dot 0 > if vnegate then 10 shot-distance - vs* target position v- unitize shot-distance 4 + vs* v+ position v+ Set-Dest^ Seek-Dest^ Transmit^ return Set-Dest: EdgeSpace max TopEdge min swap EdgeSpace max RightEdge min swap dest! Dest seek-location return #end