{"controllers":[{"id":"spin-cube","kind":"automation","bind":{"object":"spinner"},"clock":{"rateHz":60},"signals":{"bang":"pulse(t, 3, 0.05)"},"effectors":[{"type":"wake"},{"type":"torqueY","expr":"35"},{"type":"impulse","vec":"[2,0,0]","massAware":true,"when":"bang > 0.5"}]},{"id":"bob-ball","kind":"automation","bind":{"object":"ball"},"clock":{"rateHz":60},"signals":{"tick":"pulse(t, 0.6, 0.03)"},"blocks":[{"type":"lowpass","id":"smooth","in":"sin(t*3.0)*2.5","tau":0.2},{"type":"pd_velocity","id":"pdXZ","target":"{ x: 2.0*sin(t*0.8) + smooth*0.15, z: 2.0*cos(t*0.8) }","measure":"vel","kp":3,"kd":1.2,"clampAccel":28}],"observations":{"vel":"truth://ball/velocity","pos":"truth://ball/position"},"effectors":[{"type":"wake"},{"type":"targetVy","expr":"8","when":"tick > 0.5"},{"type":"setVelocityXZ","from":"pdXZ"},{"type":"impulse","vec":"[0,6,0]","massAware":true,"when":"pos[1] < 0.6"}]},{"id":"rover-follow","kind":"automation","bind":{"object":"rover"},"clock":{"rateHz":60},"observations":{"posSelf":"truth://rover/position","posBall":"truth://ball/position","velR":"truth://rover/velocity"},"blocks":[{"type":"pd_velocity","id":"chase","target":"{ x: clamp(posBall[0]-posSelf[0], -4, 4), z: clamp(posBall[2]-posSelf[2], -4, 4) }","measure":"velR","kp":2.2,"kd":0.8,"clampAccel":20}],"effectors":[{"type":"wake"},{"type":"setVelocityXZ","from":"chase"}]},{"id":"cannon","kind":"automation","bind":{"object":"spinner"},"clock":{"rateHz":60},"signals":{"fire":"pulse(t, 0.7, 0.04)"},"effectors":[{"type":"spawn","primitive":"sphere","when":"fire > 0.5","maxAlive":12,"namePrefix":"pellet_","opts":{"pos":[-5,2,0],"radius":0.3,"material":{"type":"standard","color":16763904,"metalness":0.3,"roughness":0.5},"physics":{"motionType":"dynamic","mass":0.5,"restitution":0.4}}}]}]}