Bots & leaderboard · Three AI rivals (Nova / GravityKid / VoidRider) compete for the same cubes. Bigger absorbs smaller. Defeated holes respawn after 1.4 s with brief ghost-blink invulnerability. Live leaderboard top-left.
BotPersonalityDefinition ScriptableObject with six knobs per bot: speedMultiplier, valueBias, chaseBias, dangerThreshold (radius ratio, default 1.15× = 'bigger than me'), dangerAvoidanceRadius, chaseRadius. Plus a color for the disc tint.valueBias (chases big cubes), low chaseBias, normal danger.speedMultiplier, low chaseBias, balanced everything else.chaseBias (loves chasing smaller players), low dangerThreshold (overconfident).≥ myRadius * dangerThreshold within dangerAvoidanceRadius. If one exists, target a point opposite the threat, clamped to city bounds. Wins over everything else.chaseRadius. Roll random against chaseBias + 0.3; if it passes, target the rival's current position. The +0.3 means even cautious bots occasionally pounce.cube.scoreValue * valueBias - distance * 2.5. Highest score wins.wanderAreaRadius, clamped.Rigidbody.MovePosition in FixedUpdate.(8 - radius * 0.4) * speedMultiplier units/sec — bigger holes are slower (built-in soft anti-snowball).OnTriggerEnter checks myRadius >= otherRadius * 1.15; if true, Growth.Consume(otherRadius * 0.6 mass, otherRadius * 200 score) and call other.Defeat().MeshRenderers + disable collider. 2. Wait 1.4 s. 3. Teleport to a random ring point 7–14 units from origin. 4. Growth.ResetTo(currentRadius * 0.85) — 15% size penalty. 5. Re-show + re-enable, set Invulnerable = true, blink renderers every 0.18 s. 6. After 1.5 s, stop blinking, drop invulnerability.dangerAvoidanceRadius, the bot stops fleeing immediately.