LASER LEAGUE REVIVAL
← Dev Blog

AI & GAMEPLAY / DEVELOPMENT NOTE 01

Inside Laser League Revival’s bots: what “Hard” was actually doing

I’ve been investigating why bots sometimes ignored downed teammates and seemed less capable than their difficulty setting suggested. The biggest discovery was that the published Hard preset was selecting a much weaker set of native AI settings than intended.

The game translates its difficulty IDs into a separate table of behavior settings. Revival’s Hard preset passed difficulty ID 4, but the native code mapped that to table row 5. That row disabled deliberate revive targeting, disabled several tactical checks, and gave eligible ability decisions only a 34% chance of proceeding to evaluation.

That last number doesn’t mean 34% accuracy. It means the bot could reach an opportunity to consider its ability and then randomly skip evaluating it.

How a bot decides what to do

The bots use the game’s native utility-based AI. Each controller has 19 task objects covering actions such as capturing nodes, avoiding danger, chasing players, collecting powerups, reviving teammates, and activating abilities.

Broadly, the decision process looks like this:

  1. Check whether an action is possible. Is the bot active? Is its ability available? Is there a relevant target?
  2. Evaluate potential targets. Tasks inspect things such as distance, path cost, hazards, team relationships, and target state.
  3. Assign a score. Eligible actions receive scores that help determine which task the bot selects.
  4. Move or act on that decision. Task timers and commitment rules influence when it reconsiders.

Different actions compete for the bot’s attention, and some checks depend on difficulty. I’ve confirmed this structure, although I haven’t fully labelled every scoring rule.

Why reviving was unreliable

Deliberate revival has its own eligibility check. On the published Hard settings, that check was disabled. A bot could still accidentally revive someone by passing over them, but it wasn’t intentionally choosing to rescue them.

Once enabled, the existing revive logic is more sophisticated than that behavior suggested. It evaluates downed teammates, considers path costs and hazards, and penalizes choosing a target that another live AI teammate is already pursuing. One scoring branch also gives human-controlled teammates a stronger preference.

I tested this in a controlled arena. A teammate stayed down while the bots used the old Hard settings. Changing only their difficulty setting during the same point caused a bot to select the revive task, target that teammate, and revive them shortly afterward.

Each class has its own ability logic

Smash, Ghost, Thief, Snipe, Shock, and Blade each have a separate native ability evaluator. The shared ability task checks readiness and difficulty conditions before asking that class-specific evaluator whether an activation makes sense.

The code I inspected includes:

  • Thief: checks for eligible nodes belonging to another team within ability range.
  • Ghost: considers nearby laser hazards and enemy ability threats.
  • Shock: examines nearby enemy states and range.
  • Blade and Smash: calculate attack destinations, with difficulty-dependent aiming adjustments.
  • Snipe: performs its own targeting and situational checks before approving an activation.

These are findings from specific code paths, not a complete description of every class’s strategy.

What the revised Hard changes

I’ve made Hard use the strongest existing native tuning row. It enables deliberate revival and additional tactical checks, removes the weaker row’s artificial aiming error, and raises the shared ability-evaluation gate to 100%.

That does not mean bots constantly activate their abilities. Their class-specific evaluator still has to approve the action, and normal cooldowns, ranges, and gameplay rules still apply.

The change happens once when the game starts. It does not add a continuous Python scan of every bot.

I also made Hard the default for dedicated servers, with a migration for existing server settings. Difficulty voting remains available.

What I’ve verified

I ran an isolated 4v4 test covering all six classes. Every class moved and either scored or selected an ability action, and revive targeting appeared on both teams. Dedicated-server testing confirmed that Hard was selected without a difficulty vote.

These are functional checks, not proof that the bots now make optimal decisions or win more matches. The improvement restores capabilities that were being held back by the wrong settings; it doesn’t replace the original AI.

← All development notesDiscuss on Discord ↗