CompanionManager
SingletonCentral singleton managing all active and stored companions. Add to a persistent GameObject in your scene. Handles summoning, recalling, storage, group commands, and formation updates.
Properties
| Property | Type | Description |
|---|---|---|
| MaxActiveCompanions | int | Maximum companions in scene (from CompanionSettings) |
| ActiveCompanions | List<ICompanionBrain> | Currently active companions (read-only) |
| StoredCompanions | List<CompanionData> | Companions in storage (read-only) |
| ActiveCount | int | Number of active companions |
| CanSummonMore | bool | True if below the MaxActiveCompanions limit |
Methods
SummonCompanion(definition, position, owner) — Spawn and initialize a companion
RecallCompanion(brain, delay?) — Remove companion from scene (optional VFX delay)
RecallAllCompanions() — Recall all active companions
StoreCompanion(brain) — Move companion to storage
RetrieveFromStorage(definition, position, owner) — Spawn a stored companion
GroupSetState(state) — Set all companions to same state
GroupSendCommand(command) — Send command to all (skips unsupported)
GroupSetFormation(formation) — Change formation for all companions
FindActiveByDefinition(definition) — Get brain by definition
IssueCommand(brain, command) — Issue command on a specific brain
SwapActive(stored, active, position?, owner?) — Store one active companion and retrieve a stored one in its place (see Swapping Companions below)
CanSwapActive(definition, brain, owner) / ValidateSwap(...) — Pure checks; return a CompanionSwapCheck
RecruitCompanion(gameObject, definition, owner) — Turn a scene Character into a managed companion (see Recruiting a Scene Character below)
DismissCompanion(definition) — Remove a companion from the party, leaving its GameObject in the scene
CanRecruitCompanion(...) / ValidateRecruit(...) — Pure checks; return a CompanionRecruitCheck
FindActiveByGameObject(gameObject) / IsCompanion(gameObject) — Query whether a GameObject is currently an active companionCompanionBrain
MonoBehaviourThe central component on each companion prefab. Drives state machine, motor control, follow behavior, idle system, bonding, and events. Initialized by CompanionManager on summon.
Properties
| Property | Type | Description |
|---|---|---|
| Definition | CompanionDefinition | The companion species/type |
| CurrentState | CompanionState | Current state (Following, Idle, Waiting, Commanded, etc.) |
| ProximityState | ProximityState | Distance to formation slot (Beside / Near / Far) |
| Owner | ICompanionOwner | The character this companion follows |
| CustomName | string | Display name (overrides definition name) |
| CompanionId | string | Unique runtime identifier |
| IsInitialized | bool | True after Initialize() completes |
| ActiveCommand | CompanionCommand | Currently executing command (or null) |
| BondLevel | float | Current bond 0–1 |
| BondTier | BondTier | Stranger / Familiar / Loyal / Bonded |
| IsOwnerStationary | bool | True when owner hasn't moved for Idle Enter Delay |
| IsVisitingInterestPoint | bool | True when navigating to or at a POI |
| Bonding | BondingBehavior | Bond level management (internal) |
| Events | CompanionEvents | Inspector-wirable UnityEvents |
Methods
SetState(state) — Transition to new state (fires events)
IssueCommand(command) — Execute a command (validates against CommandSet)
SendCommand(command) — Group-safe command (silently skips if unsupported)
CompleteCommand() — Signal command is done, return to Following
SetOwner(owner) — Transfer to a new owner at runtimeCompanionMotor
MonoBehaviourThe single boundary to GC2 Character Motion — no other CPS code touches GC2 movement directly. Provides follow, stop, teleport, speed control, gesture, and LookAt. Driver-aware: detects whether the Character uses the NavMesh Agent driver and can upgrade it for pathfinding. Added automatically to companion prefabs. See the Navigation & Following page for the full movement model.
Properties
| Property | Type | Description |
|---|---|---|
| IsReady | bool | True when GC2 Character is resolved |
| IsFollowing | bool | Currently following a target |
| IsMoving | bool | Companion is in motion |
| UsesNavMeshDriver | bool | True when the Character runs GC2's NavMesh Agent driver (native pathfinding) |
| DriverName | string | Display name of the active GC2 driver (e.g. "Navmesh Agent") |
| IsOnNavMeshLink | bool | True while traversing a NavMesh / climb link |
| CurrentSpeed | float | Current movement speed (m/s) |
Methods
StartFollow(target, minDist, maxDist) — Follow a Transform via GC2 Motion (pathfinds on the NavMesh driver)
StopFollow() — Stop following and halt movement
EnsureNavMeshDriver() — Upgrade the Character to the NavMesh Agent driver when a baked mesh is present
SetSpeed(speed) — Set movement speed
Teleport(position, rotation) — Instant reposition
LookAt(target) — Face a target via GC2 Facing layer
StopLookAt() — Remove LookAt layer
PlayGesture(clip) — Play animation clip as a gestureCompanionOwnerAdapter
MonoBehaviourAdd to your Player Character to make it a companion owner. Bridges the GC2 Character to the ICompanionOwner interface, providing position, forward direction, and velocity tracking. Also records the breadcrumb trail companions follow while you move (see Navigation & Following). Auto-added by the Summon instruction if missing.
Properties
| Property | Type | Description |
|---|---|---|
| OwnerTransform | Transform | Owner world transform |
| Forward | Vector3 | Owner facing direction |
| Velocity | Vector3 | Current movement velocity |
| TrailLength | float | Length of the recorded breadcrumb trail (m) |
| TrailPositions | IReadOnlyList<Vector3> | Recorded breadcrumbs, oldest → newest |
CompanionDefinition
ScriptableObjectDefines a companion type — its prefab, display name, follow/idle profile overrides, commands, personality, and reaction profile. Create via Create > Companion System > Companion Definition.
Create via:
Create > Companion System > Companion DefinitionProperties
| Property | Type | Description |
|---|---|---|
| DisplayName | string | Name shown in UI |
| Description | string | Tooltip description |
| Category | CompanionCategory | Pet / Ally / Mount / Summon / Other |
| Icon | Sprite | Portrait for party UI |
| Prefab | GameObject | Companion prefab (needs GC2 Character) |
| Guid | string | Auto-generated unique identifier for save/load |
| FollowProfile | FollowProfile | Override follow profile (falls back to Settings default) |
| IdleBehavior | IdleBehaviorProfile | Idle behavior configuration |
| Personality | CompanionPersonality | Bonding speed and reaction intensity (optional) |
| ReactionProfile | ReactionProfile | Audio/VFX reactions to events (optional) |
| CommandSet | CompanionCommand[] | Available commands for this companion type |
| IsMountable | bool | Metadata flag, off by default. Marks the companion as rideable (see Mount Metadata below) |
| MountPointName | string | Name of the child transform on the prefab where a rider should be attached. Only shown when IsMountable is on |
FollowProfile
ScriptableObjectControls follow behavior parameters. Multiple profiles allow different companion types to move differently (e.g., a dog runs faster than a turtle).
Create via:
Create > Companion System > Follow ProfileProperties
| Property | Type | Description |
|---|---|---|
| InnerRadius | float | Stop distance from owner (default: 2m) |
| OuterRadius | float | Run-trigger distance (default: 8m) |
| TeleportRadius | float | Teleport-trigger distance (default: 25m) |
| WalkSpeed | float | Speed when Near proximity |
| RunSpeed | float | Speed when Far proximity |
| AvoidanceRadius | float | Formation spacing between companions |
| FormationOffset | Vector3 | Base offset behind owner |
| StuckTimeout | float | Seconds before stuck recovery (default: 3s) |
Swapping Companions
CompanionManager.SwapActive stores one active companion and retrieves a stored one in its place, in a single call. It is built on the existing StoreCompanion / RetrieveFromStorage pair, and always stores first — so Max Active Companions can never be exceeded and a swap works even with a full party, where a plain Retrieve would be refused.
SwapActive(stored, active)— in-place: the incoming companion spawns where the outgoing one stood, with the same ownerSwapActive(stored, active, position, owner)— explicit position and ownerCanSwapActive(...)— ask first; returnsCompanionSwapCheck.Ok, or the reason it would be refusedValidateSwap(...)— the pure static version of the same check
A swap raises no new events — you get exactly one On Companion Stored followed by one On Companion Summoned, so existing listeners keep working unchanged.
CompanionSwapCheck values: Ok, NoDefinition, NoActiveCompanion, SameCompanion, AlreadyActive, NotInStorage, NoPrefab, NoOwner. All checks run before anything is mutated, so a refused swap leaves both companions untouched.
Recruiting a Scene Character
No Dialogue module is required. RecruitCompanion turns a Character that already exists in the scene into a managed companion without spawning anything — the Character keeps its own GameObject and everything on it, and the Companion Definition supplies behaviour data only (its Prefab field is ignored). The target needs a Game Creator 2 Character component; CompanionBrain and CompanionMotor are added automatically.
RecruitCompanion(npcGameObject, definition, owner)— recruitDismissCompanion(definition)— leaves the GameObject in the scene, frees the party slot, keeps the bondIsCompanion(gameObject)/FindActiveByGameObject(gameObject)— queriesCanRecruitCompanion(...)/ValidateRecruit(...)— pure checks; return aCompanionRecruitCheck
CompanionRecruitCheck values: Ok, NoCharacter, NoDefinition, NotAGameCreatorCharacter, NoOwner, AlreadyRecruited, DefinitionAlreadyActive, PartyFull. As with SwapActive, all checks run before anything is mutated.
RecallCompanion destroys the GameObject. DismissCompanion leaves it standing in the world with its CompanionBrain — and its bond level — intact, so the same character can be recruited again later without resetting the relationship. Both reuse the existing OnCompanionRecalled event, so party UI and save data stay in sync. See GC2 Integration → Instructions for the node-level recipe.Mount Metadata
Be clear about what this is: the Companion Party System contains no riding code. Movement is GC2 Character plus CompanionMotor; parenting a player to a saddle, swapping the camera and handing over input are GC2 Character concerns, not companion-lifecycle concerns. What 1.2.0 adds is the two pieces CPS is actually the right owner of:
IsMountable— a flag on the definition, read by the Companion Is Mountable Condition, so you can gate your own mount interaction without writing C#MountPointName— the name of the child transform a rider should be attached to. It is a name rather than a Transform reference because a ScriptableObject that describes a prefab cannot hold a scene reference.
Transform saddle = definition.FindMountPoint(companionInstance);
// or, without a definition:
Transform saddle = CompanionDefinition.FindMountPoint(companionInstance, "Saddle");FindMountPoint searches the whole hierarchy including the root and inactive children, matches the name exactly (case-sensitive), and returns the first hit or null.
Mount Category on purpose — you can mark a large Pet as rideable without re-categorising it. For the recommended mount/dismount node pattern, see GC2 Integration → Mount Nodes.Companion Vitals
A standalone health and secondary resource system that works without GC2 Stats. Add CompanionVitals to any companion prefab to enable HP, damage, healing, death, and auto-revive.
CompanionVitals MonoBehaviour
| Property / Method | Description |
|---|---|
| MaxHealth | Maximum health points |
| CurrentHealth | Current health (read-only) |
| HealthPercent | 0–1 fraction of max health |
| IsDead / IsAlive | Death state flags |
| IsInCombat | True when recently damaged (CombatTimeout window) |
| IsInvulnerable | Get/set — blocks all incoming damage |
| ResourceType | None / Mana / Energy / Stamina / Rage |
| CurrentResource / MaxResource | Secondary resource values |
| TakeDamage(amount, source) | Apply damage; returns actual amount dealt |
| Heal(amount, source) | Restore health; returns actual amount healed |
| HealToFull() | Restore health to max |
| Die() / Revive(percent) | Kill or revive at given health percentage |
| SpendResource(amount) | Deduct resource; returns false if insufficient |
| RestoreResource(amount) | Add to secondary resource |
VitalsProfile ScriptableObject
A reusable template for vitals configuration. Assign in CompanionDefinition to apply the same stats to multiple companions of the same type. Create via Create → Companion System → Vitals Profile.
Die() is called, CompanionVitals automatically sets the companion's state to Recalled. On Revive(), it transitions back to Following.Ability System
Companions can have up to 8 ability slots. Each ability is a ScriptableObject defining timing, cost, targeting requirements, and optional GC2 instructions that execute on cast.
CompanionAbility ScriptableObject
Create via Create → Companion System → Ability.
| Section | Properties |
|---|---|
| Identity | AbilityId, DisplayName, Icon, Description |
| Timing | Cooldown (0–300s), CastTime (0=instant), TriggersGCD |
| Cost | ResourceCost, HealthCostPercent |
| Targeting | TargetType (None/Self/Friendly/Enemy/Ground), Range, RequiresLineOfSight |
| Requirements | MinBondTier, RequiresIdle |
| Effects | GC2 InstructionList, AnimationTrigger, CastSound, VFXPrefab |
| Events | OnCastStart, OnCastComplete, OnCooldownEnd (UnityEvents) |
CompanionAbilitySet MonoBehaviour
Add to the companion prefab. Manages 8 slots, GCD, and cast state.
| Property / Method | Description |
|---|---|
| IsCasting | True during a cast (cast time > 0) |
| IsOnGCD | Global cooldown active |
| UseAbility(slot, target) | Attempt to use ability in slot (validates requirements) |
| CanUseAbility(slot, target, out reason) | Check usability without executing |
| SetAbility(slot, ability) | Assign ability to slot |
| ClearSlot(slot) | Remove ability from slot |
| ResetAllCooldowns() | Instantly reset all ability cooldowns |
| CancelCast() | Interrupt current cast |
| GetSlot(index) | Get AbilitySlot runtime state by index |
MinBondTier set above Stranger will fail CanUseAbility until the companion's bond reaches that tier. This creates a natural progression mechanic.Traits System
Traits are permanent modifiers assigned to companions. They apply stat multipliers, grant bonus abilities, and can spawn aura VFX. Use traits to create unique companions — a "Fierce" wolf that deals more damage, or a "Loyal" companion that gains bond faster.
CompanionTrait ScriptableObject
Create via Create → Companion System → Trait.
| Section | Properties |
|---|---|
| Identity | TraitId, DisplayName, Icon, Description, Rarity (Common→Legendary), Category (Combat/Support/Utility/Social) |
| Stat Modifiers | Array of StatModifier (stat type + value). Applied by CompanionTraitHolder. |
| Abilities | BonusAbility (CompanionAbility) + BonusAbilitySlot — granted while trait is active |
| Requirements | MinBondTier, IncompatibleTraits[], RequiredTrait |
| Visual | TraitColor, AuraPrefab (spawned on companion while trait is active) |
| Events | OnAssigned, OnRemoved (UnityEvents) |
CompanionTraitHolder MonoBehaviour
Add to the companion prefab to enable trait assignment.
| Property / Method | Description |
|---|---|
| TraitCount | Number of currently active traits |
| CanAddTrait | True if below MaxTraits limit |
| AssignTrait(trait) | Add trait (validates compatibility and requirements) |
| RemoveTrait(trait) | Remove trait and reverse its effects |
| HasTrait(trait) | Check if a specific trait is active |
| ClearAllTraits() | Remove all traits |
| AssignRandomFromPool(pool) | Pick a weighted random trait from a TraitPool |
| OnTraitAssigned / OnTraitRemoved | C# events fired on trait change |
TraitPool ScriptableObject
A curated list of traits with weighted random selection. Rarity affects weight automatically. Use with the Assign Random Trait instruction to create unique companions on summon. Create via Create → Companion System → Trait Pool.
Target System
A lightweight targeting system that works alongside abilities. The player or game logic selects a target; abilities validate it against their TargetType and range requirements.
TargetManager Singleton
Add to a persistent GameObject alongside CompanionManager (optional — only needed if using the targeting features).
| Property / Method | Description |
|---|---|
| HasTarget | True if a target is currently selected |
| CurrentTargetType | Enemy / Friendly / Neutral / Self |
| SetTarget(targetable) | Select a specific target |
| ClearTarget() | Deselect current target |
| TargetNearest(type, maxRange) | Auto-select the nearest entity of a given type |
| CycleTargets(type) | Tab-cycle through available targets |
| IsTargetInRange(from, range) | Check distance to current target |
| OnTargetChanged | C# event: fires when target changes (prev, current) |
Targetable MonoBehaviour
Add to any GameObject to make it targetable (enemies, allies, companions, objects). Exposes Faction (Player / Enemy / Neutral) and a highlight method called by TargetManager when the entity is selected or deselected.
Bridges (Optional Integrations)
Each bridge is an independent, deletable assembly that connects CPS to one optional GC2 module. Neither is required for the core feature set — see Getting Started → Requirements.
Companion Inventory Bridge MonoBehaviour
Requires the GC2 Inventory module. Folder: Runtime/Bridges/Inventory (assembly CompanionSystem.InventoryBridge, define CPS_INVENTORY_BRIDGE). A thin adapter, not an inventory implementation — you still set up the actual GC2 Bag component on the companion prefab yourself. The bridge caches the Bag reference and provides CPS-aware queries.
Requirements: Companion Brain and a GC2 Bag must be on the same GameObject — the bridge disables itself with a warning if either is missing.
API: Bag (the GC2 Bag reference), HasBag. See GC2 Integration → Inventory Bridge Nodes.
Companion Needs Bridge MonoBehaviour
Requires the GC2 Stats module. Folder: Runtime/Bridges/Stats (assembly CompanionSystem.StatsBridge, define CPS_STATS_BRIDGE). Drives configurable decay of GC2 Stats Attributes (hunger, happiness, energy, etc.) on a companion and fires threshold events.
Requirements: Companion Brain and GC2's Traits component (holds Attributes) must be on the same GameObject.
API: SatisfyNeed(attribute, amount), GetNeedRatio(attribute), IsNeedCritical(attribute). Events: OnNeedCritical, OnNeedSatisfied, OnNeedChanged. See GC2 Integration → Needs Bridge Nodes.
Runtime/Bridges/Inventory or Runtime/Bridges/Stats folder. Each is its own asmdef with no back-references from core CPS code — the rest of the package compiles unaffected.Autonomous Abilities (Optional)
Companion Ability Auto Caster MonoBehaviour
Add this next to a Companion Ability Set on a companion prefab. Every Decision Interval it asks its AI whether to cast, and if so casts through the ordinary CompanionAbilitySet.UseAbility path — same resource cost, slot cooldown, and global cooldown as a player-triggered cast.
| Field | Default | Description |
|---|---|---|
| AI Asset | none | The CompanionAbilityAIAsset to ask. Leave empty to use a sibling ICompanionAbilityAI component. With neither, the component does nothing. |
| Decision Interval | 0.5s | Seconds between decisions |
| Only While In Combat | on | Gate on CompanionVitals.IsInCombat |
| Require Target | on | Only decide while the Target Manager has a current target |
| Pause While Commanded | on | Never cast while executing a CompanionCommand |
SetAI(ICompanionAbilityAI) swaps the AI at runtime; pass null to make the component inert again.
First Ready Ability AI ScriptableObject
Create via Create → Companion System → Ability AI → First Ready. The one built-in AI, deliberately simple — a starting point and a worked example, not a combat rotation. Tests every slot with the existing CanUseAbility check and, among those that pass, picks the ability with the shortest configured cooldown.
Fields: Only If Target Is Hostile (on) and Allow Without Target (off, for self-buffs or heals).
ICompanionAbilityAI interface
bool TryChooseAbility(
CompanionBrain brain,
CompanionAbilitySet abilities,
ITargetable currentTarget,
out int slotIndex,
out ITargetable target);Return true with a slot index to cast. Two helpers in CompanionAbilityAIUtility are available to custom implementations: SelectLowestCooldownSlot(...) and AdvanceDecisionTimer(...).
Party Frame Manager
Component → Companion System → UI → Party Frame Manager drives the party HUD: it pools Companion Frame UI instances, binds one per active companion, re-binds when companions are summoned or recalled, and lays the frames out vertically or horizontally.
| Field | Default | Description |
|---|---|---|
| Frame Prefab | — | The Companion Frame UI prefab to pool. If empty, bare frames are created at runtime. |
| Max Frames | 4 | Size of the frame pool |
| Set Target On Select | on | Exposed in 1.2.0. Selecting a companion also makes it the Target Manager's current target. |
| Search Children For Targetable | off | New in 1.2.0. Also look for the ITargetable on the companion's children. |
Two pure helpers are public so custom UI can reuse the same rules: PartyFrameManager.ResolveTargetable(companion, searchChildren) and PartyFrameManager.ShouldSetTarget(setTargetOnSelect, targetable, targetManagerExists). Requires a Targetable component (or any ITargetable) on the companion and a Target Manager in the scene — with neither, frame clicks still select and highlight normally.
Companion Banter Trigger
Decides when two active companions should exchange a line and who the two are. It does not decide what is said: that is the job of whatever listens to the GC2 Event On Companion Banter — a Dialogue, a bark, a subtitle, an animation. Put it on the Companion Manager's GameObject, or any scene object you like.
| Field | Default | Description |
|---|---|---|
| Ambient Banter | on | Raise a line on a random timer |
| Min / Max Interval | 25s / 60s | Range the ambient wait is drawn from |
| Banter On Bond Tier Up | on | Also raise a line when an active companion's bond tier increases |
| Min Active Companions | 2 | Values below 2 are treated as 2 |
| Global Cooldown | 10s | Minimum seconds between any two lines, whatever raised them |
| Avoid Repeat Speaker | on | The companion that opened the last line is skipped as a speaker, unless it is the only candidate left |
CompanionBanterTrigger.OnBanter += args =>
{
Debug.Log($"{args.Speaker.CustomName} -> {args.Listener.CustomName} ({args.Cause})");
};OnBanter is static, so a listener needs no reference to the component. CompanionBanterEventArgs carries Speaker, Listener, Cause (CompanionBanterCause: Timer / BondTierUp / Manual) and the two GameObject shortcuts.
TryRaiseBanter() raises a line on demand (cause Manual) and returns whether the rules allowed it. The rules themselves live in the public CompanionBanterUtility. See GC2 Integration → Banter Nodes.
Personality & Reactions
Two optional ScriptableObjects that bring companions to life. Assign both in the CompanionDefinition.
CompanionPersonality ScriptableObject
Controls bonding speed, reaction frequency, and idle behavior intensity. Create via Create → Companion System → Personality.
| Property | Description |
|---|---|
| BondGrowthRate | Multiplier on all bond gains (0.5 = slow, 2 = fast) |
| PassiveBondPerMinute | Bond gained per minute while near owner |
| BondPerCommand | Bond gained when completing a command |
| BondPerPOI | Bond gained when visiting an interest point |
| Tier thresholds | Bond levels at which Familiar / Loyal / Bonded unlock |
| ReactionCooldown | Minimum seconds between reactions |
| BaseReactionChance | Probability of reacting (scales with bond level) |
ReactionProfile ScriptableObject
Defines what audio clips, gestures, and VFX to play for each reaction trigger. Create via Create → Companion System → Reaction Profile.
Each ReactionEntry maps a trigger type to a random audio clip array, volume, optional gesture, and VFX prefab. Reactions can be gated to specific bond tiers.
OnSummonedOnRecalledOnCommandReceivedOnCommandCompletedOnIdleEnterOnArrivedBesideOwnerOnOwnerSprintOnStuckOnStuckRecoveredOnInterestPointReachedOnBondTierUpOnCompanionJoinedOnCompanionLeftOnGroupAlertInterest Points
Place CompanionInterestPoint in your scene to create locations that idle companions will navigate to and interact with (campfires, fountains, food bowls, etc.).
CompanionInterestPoint MonoBehaviour
| Property | Description |
|---|---|
| InteractionRadius | How close the companion needs to be to interact |
| InteractionDuration | Seconds spent at the point |
| Cooldown | Minimum time before the same companion revisits |
| MaxSimultaneous | Max companions at this point at once |
| PointType | Tag for IdleBehaviorProfile filtering |
Companions also passively "glance" at nearby interest points they haven't visited yet. Bond points are awarded upon a successful POI visit (configured in CompanionPersonality).
IdleBehaviorProfile
ScriptableObject configuring what companions do when idle. Assign to a CompanionDefinition or set a default in CompanionSettings.
| Property | Description |
|---|---|
| InitialDelay | Seconds before idle actions begin after entering Idle state |
| MinInterval / MaxInterval | Random interval between idle actions |
| ActionPool | List of IdleActions to randomly pick from (weighted) |
| EnableInterestPoints | Allow visiting nearby CompanionInterestPoints |
| InterestPointRadius | Search radius for interest points |
| NavigationTimeout | Max seconds to reach a POI before aborting |
CompanionSettings
Project-wide defaults. Access via Window → Companion System → Settings. The Settings window auto-creates the asset if not found.
| Section | Settings |
|---|---|
| General | Max Active Companions, Debug Logging |
| Follow Defaults | Default Follow Profile, Default Formation (Line/VShape/Circle) |
| Navigation | Obstacle Avoidance (Auto / Prefer NavMesh / Raycast Only) — see Navigation & Following |
| Stuck Recovery | Teleport Fade Duration |
| Traits | Max Traits per companion |