Developer Journal
Six BOBs, One Maniple: Building a Machine Ecosystem That Knows Who Owns What
How the BOB Maniple grew from a set of commanded machines into a streamed-world-safe ecosystem of autonomous units, physical formations, honest support requests and an alarming number of ownership serials.
Real-world production notes for The Outer Islands. This entry is not an Asylum Rock Trust record.
The BOB Maniple has changed rather a lot.
What began as a small group of machines which could be told where to stand has become a complete machine ecosystem. Individual BOBs can now roam, idle, observe, report a genuinely visible player, join generated formations, leave deliberate escape opportunities, request help from a Custodian, survive streamed levels and occasionally have a deeply unhelpful machine conversation.
That sounds like a list of features. In practice, the difficult part was not making six BOBs do more things. It was making sure every BOB knew which thing currently owned it, every callback knew whether it was still relevant, and every subsystem remained politely on its own side of the fence.
This is the technical account of how that system now works, what went wrong along the way and why the least exciting words in the project—ownership, readiness, validation and compatibility—turned out to be the ones keeping the whole thing upright.
From a formation into an ecosystem
The original Maniple runtime was comparatively direct. A group requested some BOBs, assigned positions and attempted to assemble them. That remains at the centre of the design, but it is no longer the whole design. The same machines now need to exist convincingly before and after an encounter, cooperate with other machines and remain safe when the world around them is being streamed in and out.
The resulting structure is deliberately divided. A world subsystem knows which BOBs, groups, zones, chargers and markers currently exist. A Maniple group owns one formation attempt. Each BOB owns its readiness, optional autonomy and current physical movement. Separate world services arbitrate support, presentation, player-control locks, conversations, save state and shared wake behaviour.
It is, in other words, a small government built around six alarming cupboards. That is more architecture than I originally expected, but the alternative was allowing every machine to phone every other machine and quietly change its state. Systems built that way work beautifully until two interesting things happen at once.
Compatibility before cleverness
The first rule was that installing the new ecosystem must not make an existing level behave differently. Old placed actors retain Existing or Detailed Settings and therefore keep their previous autonomy values. Only a genuinely new BOB placed in the editor receives the Friendly Roaming setup. A designer can also choose Commanded, Stationary or Roaming without opening the older engineering controls.
Profiles provide reusable operation, disposition, role, readiness and autonomy settings, while a placed instance can override the parts that genuinely need to differ. Old reflected properties and compatibility components remain available to existing Blueprints and saved assets. They have not been casually renamed or deleted simply because a cleaner system now exists above them.
There is a temptation during a large refactor to improve everything at once. This is normally the moment when an innocent cupboard in a map made four years ago learns to patrol. Preserving the serialized default and changing only newly created editor actors avoided that particularly exciting form of progress.
The ownership problem
A BOB may be roaming when a formation wants it. It may already be following a manual Level Blueprint command when support is requested. A Pacifier may be repathing towards a moving player while an older path completion is still somewhere inside Unreal waiting to report success. Without an ownership rule, all of those operations can believe they are current.
The rule is simple: an explicit movement request or existing group reservation owns the BOB until it completes or releases it. CanBeSummoned excludes a BOB with an active move. Autonomy exits immediately when the unit is unready, reserved, manually busy or inside global grace. Formation and support selection use only placed, loaded, registered and currently available actors; nobody manufactures reinforcements because a scene would look nicer with two more.
Every movement request also receives a monotonically increasing serial. The AI request, the destination, the purpose and the eventual result remain correlated with that serial. A completion can advance state only when the current owner recognises the BOB, serial and expected destination. A late callback from movement 41 cannot complete movement 42, however confident it may sound when it arrives.
This serial rule now appears throughout movement, formation slots, Custodian missions, presentation actions, player-control locks and conversation sessions. It is not glamorous. It is also the difference between a machine ecosystem and six asynchronous ghosts arguing over the same actor.
Putting the BOBs properly on the floor
The largest physical change was moving the base BOB onto Unreal's native Character pipeline. ABobUnitPawn now derives from ACharacter. Its Character capsule is the permanent physical root, Character Movement owns low-level locomotion and an AI controller with Crowd Following translates each owned movement serial into an ordinary Unreal move request.
That gives the BOBs floor finding, gravity, steps, slopes, wall sliding, depenetration and proper physical collision with the player and one another. Ordinary multi-BOB travel uses Detour Crowd steering and separation. The old body blocker and experimental movement box still exist for asset compatibility, but they are disabled while the native capsule is active. Gameplay code no longer advances a BOB by pushing its transform a little farther every frame.
This exposed a wonderfully fundamental problem in the first 22 July live reproduction. Existing BOBs had been authored at a floor pivot. A Character expects its actor transform at the centre of its capsule. Feeding a perfectly good floor-level NavMesh location into that transform therefore put half the capsule underground.
The fix was to preserve the visual root's floor-level contract while converting the actor once to Ground plus scaled capsule half-height and clearance before enabling physical collision. GetBobGroundLocation performs the inverse calculation. The system now reports capsule centre, capsule bottom and logical ground separately rather than concealing an overlap and declaring the problem solved.
When physical BOBs still obstruct one another, the bounded recovery order is yield, attempt a genuine local two-waypoint detour and then fail once. It does not phase through the obstruction and it does not request the same impossible Recast path forever. The machine may look stubborn, but the retry budget is not.
Autonomy without psychic powers
Autonomy runs on staggered timers rather than every frame. A Friendly BOB chooses between weighted idle, roaming and observation. Its roam destination must be a reachable NavMesh point inside the configured radius and far enough away to constitute an actual journey rather than a nervous shuffle.
Hostile knowledge has a stricter path. The target must be within detection range, inside the field of view and unobstructed on the Visibility channel when direct sight is required. Only after that observation may a General or Spotter request coordinated support. A Pacifier uses its established navigable pursuit and repaths when the subject has moved far enough.
Speech, a presentation cue, another machine's dramatic announcement and a Level Blueprint sequence do not grant player knowledge. This was an important boundary to make explicit. A BOB saying DETENTION GEOMETRY ACCEPTED may be atmospheric, but it is not evidence that the player is behind a wall.
Readiness sits beneath every decision. Ground support, slope and NavMesh projection are checked before movement, and the most recent safe transform is retained. If a World Partition cell, its floor or its navigation disappears, the BOB stops and waits. Missing world data is not interpreted as a bold shortcut.
Getting a maniple into position
Formation geometry is now reusable rather than tied to the original Cross-4. Native patterns include Ring, Horseshoe, Corridor, Funnel, Wall, Cordon, Box Room, Escort Cage, Search Line, Pincer, Airlock, Tribunal and Guard of Honour. A formation Data Asset can replace the native slots entirely when a level needs a custom arrangement.
Candidate selection filters for loaded, ready, summonable and unreserved actors, with optional zone and group restrictions. All available BOBs and all requested slots are then solved together using a deterministic minimum-cost assignment. This replaced the earlier greedy selection, which could make a perfectly sensible first choice followed by several increasingly absurd journeys. Blocker-role machines remain preferred for walls, gates and containment duties.
Rapid assembly sends the whole cohort directly under Crowd steering. Balanced adds route-conflict gating where planned paths cross too closely. Ceremonial retains the larger outer staging and bounded waves used for deliberately paced scenes. The default operational speed is 800 units per second, while autonomous roaming remains at 220, because a BOB responding to an emergency and a BOB wandering around considering tea should not move with the same urgency.
Crowd movement is excellent for sharing space but less interested in landing on a mathematically exact slot. Inside the final-approach radius, the BOB switches to a regular Unreal path and must remain within the final twelve-unit tolerance for the settle interval before it counts as arrived. A transport success outside physical tolerance is not promoted to a formation success. This sounds obvious now. It was less obvious while watching a BOB proudly finish its path some distance from the place it had been asked to occupy.
A circle of machines is not necessarily a cage
One of the most useful lessons was separating Formation Established from Containment Confirmed. Formation Established means the required BOBs reached and settled at their assigned slots. It says nothing by itself about whether the player can walk between them.
Containment is calculated from the final runtime transforms, actual capsule sizes, active held-shield spans and the subject's traversable diameter. The purpose must genuinely be containment, the pattern must be capable of closing, every required unit must remain within tolerance, the subject must remain near the centre and no intentional escape opportunity may be active.
Open patterns such as Horseshoe, Corridor, Funnel, Wall, Search Line, Pincer, Tribunal and Guard of Honour can establish beautifully but can never claim to be a sealed boundary. If a measured gap is large enough for the player, the group remains established and open. Downstream capture code receives the truth rather than a flattering description of the geometry.
This is important for player agency as well as correctness. Escape policies can create a guaranteed gap, open funnel, weak link, delayed closure, degrading formation or conditional release. The system can make an enclosure look threatening without secretly deciding that looking enclosed and being enclosed are the same thing.
Bringing in the Custodian
A BOB formation may request Custodian support at formation acceptance, visual establishment or confirmed physical containment. The support broker acquires a short world-scoped claim first, preventing two groups from repeatedly dispatching help for the same subject and event window.
The request does not take ownership of Custodian behaviour. It provides a target, operation serial, mission intent and arrival policy through a narrow support seam. The Custodian's existing perception, pursuit, stalking, attack, capture and tactical planning remain authoritative. If she is already honestly pursuing the same player, the mission adopts that state instead of clearing it and starting again.
A choreography marker can provide an honest two-stage route: staging behind the authored arrow and ingress into the scene. During those stages the support mission owns only its exact movement serial and destination. Failure releases the formation hold and falls back to existing pursuit rather than freezing everybody in a tableau while the player goes away to make tea.
There is also an explicit physical-gate mode for a deliberately oppressive first-use scene. One assigned BOB moves out of its real slot, its containment shield switches off, the Custodian physically crosses the validated gap and the BOB returns before the shield is restored. No timer-only opening is accepted, no invisible replacement blocker appears and a stale movement completion cannot open or reseal the gate.
The fast concealed staging option exists only inside that gate contract. The location must be loaded, grounded, on NavMesh, capsule-clear, permitted and outside the player's camera. If it is not, the Custodian walks there normally. Supernatural-looking presentation still requires an honest technical reason for being safe.
Presentation is allowed to be dramatic, not authoritative
Room-specific lights, doors, sound, cameras and sequences belong to the Level Blueprint. The presentation router publishes lifecycle events and action requests with their own serials, acknowledgement and absolute timeout. Most are fire-and-forget. Only Staging Ready and Formation Established deliberately support gameplay gates.
That prevents a decorative door animation from quietly becoming the owner of a capture state. Presentation can observe gameplay, delay a narrowly supported checkpoint and report success or failure. Gameplay does not depend on somebody remembering to finish an unrelated cinematic node in a Level Blueprint.
The same principle applies to player control. Pacifier stun and Custodian presentation acquire explicit movement or look-lock tokens from a world subsystem. Releasing one token cannot restore an axis which another owner still needs locked, and the final release restores the exact original player state once.
Friendly BOB-to-Custodian conversations are similarly bounded. Both machines must be close, mutually visible, available and suitably disposed. The session pauses autonomous movement, produces four alternating presentation beats and cleans itself up through one path if either actor becomes invalid, busy or hostile. The conversation does not create evidence or tactical knowledge. It is two machines being strange together, which is quite enough.
Speech without accidentally creating AI
Primitive BOB speech is opt-in and deliberately separate from Custodian speech. Each BOB owns a speech component, while a world subsystem handles the asynchronous Flite queue, processed audio cache, group claims, controlled chants, presentation routing and shutdown.
The native catalogue contains 250 lines divided between Friendly, Machine Protocol, Formation, Custodian Arrival and Failure banks. One group-arbitrated speaker handles most events; selected formation and Custodian moments may use a staggered chant capped at three machines. I have no wish to discover what fifty BOBs chanting simultaneously does to either performance or the human spirit.
The audio is local, positional and processed into a slower, deeper primitive voice with stable per-unit variation. More importantly, the dependency remains one-way: an existing gameplay fact can request speech, but speech cannot call perception, report noise, request support, move a machine, capture the player or delay a formation.
Streaming, saving and the first Cross-4
The original Cross-4 remains the first successful cinematic Maniple for a save. Later requests choose among approved alternatives, preventing the signature formation from becoming the only joke the machines know. The ecosystem save data records whether Cross-4 has been shown, the last wake marker and stable per-unit identity, autonomy, role, disposition and safe-home information.
Shared wake uses the existing Custodian marker infrastructure, but only markers which explicitly allow BOB Maniple use. Selection rejects unloaded, cooling, occupied or incompatible markers and validates navigation and capsule clearance. After relocation, a world-wide grace period suppresses new formation and Pacifier pressure even in levels which do not use BOB zones.
The plugin does not invent a fade, pause or input policy around relocation. It expects the project to call it during an existing safe presentation hand-off. This is another ownership boundary: a reusable machine system can supply a safe destination, but it should not guess how a particular game wishes to hide the journey.
What I learned, and what remains
The main lesson is that the visible behaviour is the final ten per cent. The player sees BOBs spread out, close a corridor or admit a Custodian. Underneath that are compatibility rules, streamed-world checks, movement correlation, physical tolerances, claims, recovery budgets and cleanup paths making sure the performance means what it appears to mean.
The other lesson is that Unreal's successful path result and the design's successful arrival are not always the same fact. The same applies to a formation which looks closed, a presentation which looks complete and a machine which appears to know something. Each required a separate physical or semantic check rather than trust in the nearest convenient signal.
The system is now considerably more capable, but it is not declared finished merely because the architecture is satisfying. Crowd travel and precision settling materially change multi-BOB traffic and still need the complete production-map regression. Every capsule, radius and formation combination needs real player passage testing. Twenty-four active BOBs in one area is the conservative design target; thirty-two is the first deliberate stress test, not a promise made to every computer in existence.
What I am pleased with is that failure is now an ordinary outcome. A BOB can wait for navigation, reject a stale callback, abandon a blocked route or establish an open formation without lying about containment. A Custodian can fail to reach staging without trapping the scene. Speech can fail without changing gameplay. Clever systems are useful; clever systems which know when to stop are considerably more useful.
So that is the new BOB Maniple: autonomous when permitted, commanded when required, physically present, rather particular about serial numbers and entirely unwilling to walk across a floor which has ceased to exist. KEEP ON SWIMMING! Although, in this case, preferably on a valid NavMesh.
Working Material