The short version of a long README
What actually changed
Stock Overload robots are individually competent and collectively simple. They know where you are at all times, they forget you the instant you break line of sight, they fight as independent units that happen to share a room, and they all shoot at once. This changes each of those.
Perception
Robots have to actually find you
A robot no longer queries your true position. It holds a belief about where you are, and that belief only updates through an event — it saw you, it heard your weapons, a squadmate radioed it, or you shot it. Everything downstream reads from that belief, which is what finally makes cover, silence and distance mean something.
Break line of sight and you are not forgotten; you are hunted. Robots move to your last known position, extrapolate the direction you were travelling, and fan out to check different corners rather than clumping into one searchable blob. Get far enough away and they give up and return — that distance is a setting.
Coordination
Groups behave like groups
Nearby robots share contacts, divide the angles around you between themselves, and take turns applying pressure. Each is given a job.
| Role | Behaviour |
|---|---|
| Anchor | Holds a firing line in front of you and keeps your attention |
| Flanker | Swings wide to attack from your side or rear |
| Harasser | Darts in, fires, withdraws before you can retaliate |
| Sniper | Holds maximum range and takes deliberate aimed shots |
| Blocker | Sits on your likely escape route instead of attacking head-on |
Roles are assigned by distance rank, not at random — the robot already in your face makes a poor sniper, and a robot that suddenly turns and flies away to snipe looks broken. Roles are also committed for a number of seconds rather than re-rolled on every squad update, which is what stops a robot oscillating between approaching and standing off without ever completing either.
Aiming
Something you can play against
The intercept problem is solved properly — four fixed-point iterations against the actual projectile speed for that robot type — and then deliberately degraded with error terms you can influence:
- Aim tightens the longer a robot holds sight of you, so sitting in one firing lane gets progressively more punishing.
- Aim loosens when the robot itself is moving fast, so keeping them chasing is worth something.
- Lead error scales with your speed, so changing direction defeats prediction while moving predictably does not.
A robot that always leads perfectly is not difficult, it is just unfair — there is no counterplay. This model gives you something to actually do about it.
Pacing
A director that watches your state
Walk into a room at full armour and you steamroll it; walk into the same room at fifteen percent and it is an unavoidable death. Neither is interesting.
The director watches your actual state and nudges how many robots press an attack and how quickly pressure rebuilds after an exchange. It is a nudge, not a rubber band: it never makes robots miss on purpose and never grants you invulnerability. Everything it does is visible in the live status readout at the top of the panel, and it can be switched off entirely.
Abilities
Nine special moves, not granted to everyone
Each has a wind-up, a release and a recovery, on top of ordinary shooting.
| Ability | What it does |
|---|---|
| Volley | Fires a burst of shots in a spread instead of one aimed round |
| Suppression | Sprays your last known position — needs no line of sight |
| Shockwave | Damaging pulse, strongest at point-blank, blocked by geometry |
| Repair | Restores hull to itself or the worst-hurt squadmate in range |
| Cloak | Turns invisible for a few seconds to reposition or break your lock |
| Dash | Bursts toward you to close, or away to disengage — never into a wall |
| Rally | Calls nearby robots in and stiffens their resolve. No damage at all |
| Overcharge | Briefly fires faster and straighter than normal |
| Bulwark | Hardens against incoming fire for a short window |
- Not everyone gets everything
- Each ability is rolled per robot against
AbilityGrantChance, capped byMaxAbilitiesPerRobot, using that robot's own seeded RNG — so its loadout is stable for its whole life, and two Grunts in the same room can be genuinely different opponents. Granting everything to everyone would flatten Overload's bestiary into one enemy with nine buttons. - The wind-up is the point
- An ability that arrives with no warning is not a mechanic, it
is just damage. During a charge the robot slows and its headlight comes on; that window
is your opportunity to break line of sight. The recovery afterwards leaves it committed
and punishable.
AbilityChargeScaleat 0 removes the tell entirely — harsher, and arguably unfair. - A robot winding up does not also shoot
- That would erase the tell the whole design rests on.
Combat actions
Eight movement behaviours that compose
Actions are what a robot layers on top of wherever it is trying to be.
| Action | What it does |
|---|---|
| Strafe | Slides sideways around you while holding a firing position |
| Weave | Jinks side to side while closing instead of flying straight |
| Vertical Orbit | Climbs above or drops below you, off your horizontal plane |
| Backpedal | Retreats to a comfortable range when you crowd it |
| Steady Aim | Holds still to shoot much straighter — and is much easier to hit |
| Break Line of Sight | Ducks behind real cover when badly damaged |
| Reposition | Moves to a fresh angle when its firing position has gone stale |
| Regroup | Falls back toward a healthier squadmate when isolated |
Actions do not move the robot themselves. Each contributes to a shared influence — a position offset, a speed scale, a turn scale, or a destination override — which the brain then sums and applies. That is what lets several run at once: a strafe and a weave compose into a spiral, instead of two systems fighting over the same rigidbody.
Loadouts
Two weapons, and a different way of fighting with each
Overload gives a robot exactly one weapon, described by public fields on
Robot: projectile, upgrade level, spread, firing distribution, burst delays,
fire distance and fire angle. A weapon "type" here is a snapshot of exactly those fields, and
switching is writing them — so after a swap the game's own firing code reads the new values
and behaves accordingly, because they are the same fields it always read.
- Slot one is native
- The robot's own weapon, captured as it spawns rather than
hardcoded — so it survives custom levels, robot data overrides and olmod's own
robotdata.txt, and can always be restored exactly. - Slot two is derived
- Scaled from slot one by config rather than invented, so a Grunt's secondary is still a Grunt's secondary and cannot accidentally out-gun a Hulk.
- Lead stays correct after a swap
- The game's own projectile speed table is indexed by
robot type and was built from each prefab's native weapon, so it is simply
wrong for a robot carrying its secondary. The loadout reads the real number from
ProjectileManager.proj_infoinstead, which is indexed by projectile. - The native weapon is restored on retire
- A robot is never left holding a mod-assigned weapon in game state that outlives this mod's involvement.
For other plugin authors
40 events you can subscribe to
Every meaningful thing a robot does raises an event.
32 per-brain events
Across seven groups — detection, combat, health, behaviour, movement, abilities, and weapons & actions. Every raise is guarded, because these fire once per robot per frame and an unguarded exception from a subscriber would fire sixty times a second per robot. A throwing subscriber is reported once and then ignored; the robot keeps thinking.
8 level-wide events
Static, on AIGlobalEvents — brain created and retired, any target
detected, any robot death or damage, any ability invoked, player noise, level reset. Another
olmod plugin can subscribe once at startup and never chase individual robot lifetimes.
Subscribers are dropped when a brain retires, so a long-lived subscriber cannot keep a
dead robot's whole object graph alive for the rest of the level.
Under the hood
Why a full replacement is safe here
The brain replaces Robot.DoAIModes via a Harmony prefix. That hook point sits
inside Robot.FixedUpdate after the game has refreshed the robot's
transform, target distance, visibility and stun state, and before pathfinding and
flocking run. Two things follow from that position:
- Everything the brain reads was freshly computed by the game a moment earlier, so there is no duplicated work and no disagreement between the mod's view of the world and the game's.
- Returning false skips only the mode dispatch. Pathfinding, flocking, teleporting, wind tunnels, stun handling and the death sequence all still run afterwards, because they live outside that method.
All movement routes through the game's own MoveTowardsPoint and
AimTowardsPoint, which apply forces to the robot's rigidbody exactly as the
stock AI does. The mod never bypasses the physics — it only decides where to push and where to
look. Navigation between rooms is left entirely to the stock pathfinder, so locked doors, keyed
segments and matcen routing behave as their designers intended. Firing is intercepted rather
than reimplemented: the prefix decides whether a shot happens and adjusts spread and refire
timing, then the game's own firing code does the work.