Wardogs — GameFeatures: AI
Extracted from cooked game data (UE 5.7 export JSON, read-only dump). Source folder: Plugins/GameFeatures/AI/ — 39 JSON files. Each file was parsed as a sequence of --- export: blocks; the first block is the asset, later blocks are sub-objects (EQS options, tests, generators, data providers, goals). Values below are raw export values.
1. What This Folder Holds
The AI folder is the PvE AI stack plus several example/test feature packs. It is organised as ten feature folders and contains three kinds of data:
- Core config in
WDAIPvEAICore/— the character AI preset, alert-state thresholds, influence-map settings, the blackboard, and the smart-object/action definitions that the rest of the game references. - Behaviour content — goal classes (
BHGameFeatureAction_AddGoal) and Environment Queries (EQS) used by the behaviours. - Example packs (
*Example,Behavior_*,BesiegeExample,CoverExample,SmartObjectExample,AINavigation_Example) — these are GameFeature packs with EQS and goals. The dump does not say whether they ship in the live build; treat them as example/test content unless a live reference is found.
| Metric | Value |
|---|---|
| Files | 39 |
| GameFeatureData assets (across all files, including sub-exports) | 10 |
EQS query assets (EQS_*.json with an EnvQuery or equivalent root) | 22 |
| Blackboard assets | 1 (BB_PVEAI) |
| Behaviour goals | 4 |
| Smart-object / action definitions | 2 |
1a. Subfolder breakdown
| Subfolder | Files | Contents |
|---|---|---|
WDAIPvEAICore/ | 16 | Core AI: DefaultAIPreset, BB_PVEAI, alert thresholds, influence data, influence-map config, EQS_FindTarget, 8 cover/position EQS, 2 action defs, the core GFD |
Behavior_Besiege/ | 7 | GFD + 6 besiege EQS (cover and point search around a besiege target) |
SquadExample/ | 4 | GFD + goal Goal_Example_AttackPlayer + 3 squad EQS (closest cover, cover toward goal, leap-frog token handling) |
Behavior_Patrol/ | 3 | GFD + goal Goal_Patrol + 2 patrol-point EQS |
Behavior_Search/ | 2 | GFD + goal Goal_Search + 1 EQS EQS_FindSearchLocation |
Behaviour_Example/ | 2 | GFD + goal Goal_Example_Flee + 1 EQS flee point |
CoverExample/ | 2 | GFD + EQS_FindRandomPeekPoint |
AINavigation_Example/ | 1 | GFD with BH.AISpawn scan rule (WDAICharacterConfigData) |
BesiegeExample/ | 1 | GFD only (no actions) |
SmartObjectExample/ | 1 | GFD only (no actions) |
2. Core AI Preset (WDAIPvEAICore/Content/DefaultAIPreset)
This is the WDAICharacterConfigData that the PvE configs in the PvE folder follow. Its fields define the AI character baseline.
| Field | Value |
|---|---|
| AICharacterClass | B_WDCore_MoverPlayerCharacter_C (WDCore) |
| AIControllerClass | BP_CoreAIController_C |
| FireModePriority | Burst > Automatic > SemiAutomatic |
| FactionTag | Meta.Alignment.Faction.Bravo |
| AIInventory | Id.Item.AK74M ×1 |
| BehaviorTree | BT_WDAIPvECore_Base |
| AlertStatesWithThreashold | AlertStateThreashold_DataConfig |
| AIInfluenceDataAsset | AIInfluence_DataConfig |
(The asset name spells “Threashold” as in the source; keep the spelling when searching.)
3. Alert State Thresholds (AlertStateThreashold_DataConfig)
| Alert state | LowerThreshold | Require sight to go up from lower | Require sight to go down from higher |
|---|---|---|---|
EWDAIAlertState::Relaxed | 0.0 | false | false |
EWDAIAlertState::Alert | 0.8 | false | false |
EWDAIAlertState::Combat | 1.0 | true | false |
Meaning: The threshold is compared against a continuous value. The blackboard has a Pressure key, which is the likely input, but the export does not say so explicitly. This is an inference.
4. Influence Maps
4a. Influence data (AIInfluence_DataConfig, type WDAIInfluenceData)
| Influence tag | Radius | Strength |
|---|---|---|
InfluenceMap.TeamMap | 1000.0 | 1.0 |
InfluenceMap.EnemyMap | 500.0 | 1.0 |
InfluenceMap.AlertMap | 1000.0 | 1.0 |
SensesToUseForAlertMap: AISense_Hearing — hearing feeds the alert map.
4b. Influence-map config (WDInfluenceConfigData, type SDInfluenceMapConfigDataAsset)
| Map | DecayPercentagePerSecond | UpdateFrequency (s) | PropagateInfluence | EvaluationType | CreateArea | CheckPathExistToAreaID | RemoveEvaluation |
|---|---|---|---|---|---|---|---|
TeamMap | 10.0 | 5.0 | true | NavRaycast | false | false | None |
EnemyMap | 10.0 | 2.0 | true | None | false | false | None |
AlertMap | 1.0 | 0.5 | false | None | true | true | NavRaycast |
AIPawnClass: B_WDCore_MoverPlayerCharacter_C. Debug is off on all three maps.
5. Blackboard (BB_PVEAI)
13 keys. The types come from the sub-exports (Bool, Enum EWDAIAlertState, Object/Actor, Vector).
| # | Key | Notes |
|---|---|---|
| 1 | HasLineOfSight | Bool, default true |
| 2 | MoveGoal | Vector |
| 3 | SelfActor | Object |
| 4 | TargetActor | Object |
| 5 | Pressure | Float-like driver of alert state (inferred) |
| 6 | HasTeleportedToAO | Bool |
| 7 | Cover | Object, with EQS context EQS_Context_TargetEnemy in some sub-exports |
| 8 | PeekPoint | Vector |
| 9 | SOClaimHande | Smart-object claim handle. The spelling is in the source. |
| 10 | GoalActor | Object |
| 11 | LastAlertState | Enum EWDAIAlertState |
| 12 | TargetAreaId | Int-like area id |
| 13 | AlertInterruptible | Bool |
6. Goals (BHGameFeatureAction_AddGoal)
Goal purposes are inferred from class names and folder EQS; the goal logic is not in this folder.
| Goal class | Source file | Notes |
|---|---|---|
Goal_Patrol_C | Behavior_Patrol/Content/Behavior_Patrol.json | Patrol (inferred from name; folder EQS EQS_PatrolPoint) |
Goal_Search_C | Behavior_Search/Content/Behavior_Search.json | Search (inferred from name; folder EQS EQS_FindSearchLocation) |
Goal_Example_Flee_C | Behaviour_Example/Content/Behaviour_Example.json | Flee (inferred from name; folder EQS EQS_FindFleePointFromGoalTarget) |
Goal_Example_AttackPlayer_C | SquadExample/Content/SquadExample.json | Attack-player example (inferred from name) |
7. Actions and Smart Objects
| Asset | Type | Tag / context | Action class |
|---|---|---|---|
DA_Action_AIIdle | BHActionDefinition | Action.Player.Idle; contexts TwoHanded, Holdable | B_Action_AIIdle_C |
DA_Action_UseComputer | BHActionDefinition | Action.SmartObject.UseComputer; contexts Interaction, TwoHanded, Holdable; activation context WDSmartObjectActionContext | B_Action_UseComputer_C |
The WDAIPvEAICore GFD scans BH.Action in /SmartObject/UseComputer and /WDAIPvEAICore/Actions.
8. Components Added by the Core GFD (WDAIPvEAICore)
Feature actions in WDAIPvEAICore (from GameFeatureAction_AddComponents):
| Host actor | Component added | Module |
|---|---|---|
WDGameState | WDAIPvEGameStateComponent | WDAIPvEAICoreRuntime |
WDGameMode | SDAIRuleManagerComponent | SDAIRules |
Player character (B_WDCore_MoverPlayerCharacter) | SDAISmartObjectActorComponent | SDUESmartObject |
| Player character | BP_PlayerCharacterDetectabilityComponent | WDAIPvEAICore |
| Player character | WDAISightTargetComponent | WDAIPvEAICoreRuntime |
BP_CoreAIController | WDAITetherComponent | WDAIPvEAICoreRuntime |
BHBaseVehiclePawn | WDVehicleDetectabilityComponent | WDAIPvEAICoreRuntime |
It also activates SDGameFeatureAction_ActivateSubsystem.
9. EQS Catalogue
22 query assets. Purpose is inferred from the file name and the tests. The “Tests” column lists the test or generator classes with counts across the query’s options.
| Query | Folder | Generator | Main tests | Purpose (inferred) |
|---|---|---|---|---|
EQS_FindTarget | WDAIPvEAICore | WDEnvQueryGenerator_ThreatActors ×3 | GameplayTags ×3 | Pick a target from threats |
EQS_FindCoverNearby | WDAIPvEAICore/Cover | SDEnvQueryGenerator_Covers | Distance ×2, Dot, AIConfigData provider | Nearby cover |
EQS_FindCoverCloserToEnemy | WDAIPvEAICore/Cover | SDEnvQueryGenerator_Covers, Composite provider | WeaponData ×4, Distance ×3, Dot, PathfindingBatch, WDEnvQueryTest_CoverTrace | Cover that closes on the enemy |
EQS_FindCoverTowardsEnemy | WDAIPvEAICore/Cover | SDEnvQueryGenerator_Covers | Distance ×3, Dot, Pathfinding, Distance provider | Cover facing the enemy |
EQS_FindBestPeekPointOfCurrentCover | WDAIPvEAICore/Cover | SDEnvQueryGenerator_PeekPoints | WDEnvQueryTest_CoverTrace | Peek point off current cover |
EQS_FindPeekPointToStimulus | WDAIPvEAICore/Cover | SDEnvQueryGenerator_PeekPoints | — | Peek toward a stimulus |
EQS_FindCombatPositionCloserToTarget | WDAIPvEAICore/Cover | Donut | Distance ×2, Pathfinding, WeaponData ×2, Composite, Distance provider | Combat position |
EQS_FindShootPositionInTheOpen | WDAIPvEAICore/Cover | Donut | WeaponData ×3, Distance ×2, Pathfinding, Trace, AgentHeight provider | Open-ground shot position |
EQS_BesiegeTakeOverMovementTokenHandling | Behavior_Besiege | SDEnvQueryGenerator_TokenRequests | WDEnvQueryTest_InfluenceMapValue | Movement tokens during besiege takeover |
EQS_FindCoverInBesiegeArea | Behavior_Besiege | SDEnvQueryGenerator_Covers | Distance, Dot, PathfindingBatch, Volume, InfluenceMapValue, VolumeSize provider | Cover inside besiege volume |
EQS_FindCoverInBesiegeAreaClosest | Behavior_Besiege | SDEnvQueryGenerator_Covers | Distance ×2, PathfindingBatch, Volume, VolumeSize provider | Nearest cover inside besiege volume |
EQS_FindCoverTowardBesiegeTarget | Behavior_Besiege | SDEnvQueryGenerator_Covers | Distance ×2, Dot, PathfindingBatch, Volume, SDAIGoalDataProvider_Target | Cover toward besiege target |
EQS_FindPointAroundBesiegeTarget | Behavior_Besiege | Donut | Distance ×2, PathfindingBatch, Volume | Ring points around besiege target |
EQS_FindPointCloseToBesiegeTarget | Behavior_Besiege | Donut | Distance ×2, PathfindingBatch | Points close to besiege target |
EQS_PatrolPoint | Behavior_Patrol | ProjectedLocation | Distance ×2, PathfindingBatch | Patrol point |
EQS_PatrolPoint_Follower | Behavior_Patrol | Donut | Distance, PathfindingBatch | Patrol point for a follower |
EQS_FindFleePointFromGoalTarget | Behaviour_Example | Donut | Distance | Flee point |
EQS_FindSearchLocation | Behavior_Search | BP_InfluenceEvaluator_AlertLocationGenerator | Dot, Pathfinding, Covers | Search location from alert data |
EQS_FindRandomPeekPoint | CoverExample | SDEnvQueryGenerator_PeekPoints | — | Random peek point (example) |
EQS_FindClosestCoverToQuerier | SquadExample | SDEnvQueryGenerator_Covers | Distance, Dot, Pathfinding | Closest cover (squad example) |
EQS_FindCoverTowardGoalTarget | SquadExample | SDEnvQueryGenerator_Covers | Distance ×2, Dot, Pathfinding, Target provider | Cover toward goal (squad example) |
EQS_LeapFrogTokenHandling | SquadExample | SDEnvQueryGenerator_TokenRequests | Distance | Leap-frog token handling |
Note: EQS_FindSearchLocation has BP_InfluenceEvaluator_AlertLocationGenerator_C as its first export, not an EnvQuery. The count of 22 includes it.
10. How Values Combine
These are general UE EQS semantics. The dump gives the test settings, but this pass did not verify scoring behaviour in the runtime.
- Each test has a
TestPurpose(Filter,Score, or both) and aTestOrder. Filters run first; scoring tests then combine. FilterType(Minimum/Maximum) withFloatValueMin/FloatValueMaxdefines the pass range. Values seen include minimum distances of 100 to 400 and dot thresholds of 0.4 to 0.8 (Dot2D).ScoringFactor(typically 0.5 to 10) andScoringEquation(for exampleInverseLinear) weight a test’s contribution.MultipleContextScoreOpisMinScoreon most distance tests, so an item must satisfy the nearest context.WDAIDataProvider_*nodes feed AI config values (cover radius, weapon min/max range, agent height) into the test’sDataBinding.
11. Still not pulled / limitations
- Unit system. Distances are in the export’s native units. The export does not name them. Treat them as Unreal units (cm) only after checking against a known value.
- Enum meanings.
EWDAIAlertStatevalues are given by name, but the numeric thresholds are not linked to a documented meaning. The Pressure key is inferred to drive them. - Example packs. Whether
*ExampleandBesiegeExample/CoverExample/SmartObjectExampleship in the live build is not established here. - Blackboard key use. Which AI task reads or writes each key is in behaviour trees and BP graphs, not in this folder. This doc does not map key use.
- Behaviour trees.
BT_WDAIPvECore_Baseis referenced but not in this folder. - Sub-exports not expanded. EQS sub-exports (individual test settings) are summarised by count and type, not every field.
- Unnamed localisation keys. Some properties appear as
_aaa…hashes; those were not resolved.
12. Round 36: controller senses, detectability, firing, health
Source: BP_CoreAIController, BP_PlayerCharacterDetectabilityComponent, BTS_FireWeapon, BTS_AimAtTarget, the BT_* trees and native constructors 0x8863540, 0x8863AB0, 0x8863090, 0x8864400 (static reading). Full table and method: docs/evidence/round36-ai.md.
| Item | Value |
|---|---|
| AI health | The soldiers are B_WDCore_MoverPlayerCharacter_C, the player character: max health 100 (native UWDVitalityComponent ctor); no AI-specific health, attribute or damage multiplier found |
| Sight | SightRadius 200000, LoseSightRadius 210000, MaxAge 30 s |
| Hearing | HearingRange 100000, MaxAge 30 s |
| Damage sense | MaxAge 10 s |
WDAIPerceptionComponent | VisionRangeMultiplier 0.02, HearingRangeMultiplier 0.05; VisionAngleMultiplier and VisionPlayerConcealmentMultiplier 1.0 (native). How the multipliers combine with the ranges is native logic, not verified |
| Threat detection | DetectionDecayRate 0.25 (native default 0.01), TimeBeforeStartDecay 5 s (native 10), MaxDetectionLevel 1.0 (native) |
| Player detectability | Stand 1.0, Crouch 0.4, Prone 0.3; StanceDetectabilityMultiplier 0.5; HearingMovementSpeedMultiplier 0.0015; WeaponFiring 5.0 |
| Config defaults (native, not set in assets) | POILookAtSwitchTime 2.5 s, AlertWaitTime 2.0 s, RadiusToSearchForCovers 3000 |
Firing (BTS_FireWeapon) | burst of 3 shots, BurstDuration 0.2, BurstInterval 1.0, ShotInterval 0.2, TriggerPullDuration 0.05; WDBTTask_ShootAtTarget.RoundOfBursts 3 |
| Aim | BTS_AimAtTarget focuses on the target’s Head bone every 0.1 s; no AI-specific spread or accuracy value in any asset |
| Goals that ship in missions | Goal_Patrol (VIP Escort), Goal_Search and Goal_BesiegeTarget (Strike and Disarm, plugin dependencies; Besiege and Goal_StopHack added by the hack quest). Goal_Example_Flee and Goal_Example_AttackPlayer have no dependent plugin |